redis slave不会与master同步
Posted
技术标签:
【中文标题】redis slave不会与master同步【英文标题】:redis slave won't sync with master 【发布时间】:2013-09-22 11:26:39 【问题描述】:redis slave 不会与 master 同步。
连接性:
我可以在发出时连接到主服务器
HOST_NAME=fakehost
redis-cli -h $HOST_NAME
并使用INFO
之类的命令检查主机状态,因此连接不是问题。
设置:
我从奴隶箱发出
SLAVEOF $HOST_NAME 6379
并收到了OK
。
当我在从站上发出INFO
命令时,我得到
# Replication
role:slave
master_host:<removed>
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
master_link_down_since_seconds:1379450797
slave_priority:100
slave_read_only:1
connected_slaves:0
在master box上,我发出info
并得到
# Replication
role:master
connected_slaves:0
显然我没有连接。
日志
[11225] 17 Sep 14:31:33.225 * Connecting to MASTER...
[11225] 17 Sep 14:31:33.226 * MASTER <-> SLAVE sync started
[11225] 17 Sep 14:31:33.226 * Non blocking connect for SYNC fired the event.
[11225] 17 Sep 14:31:33.226 * Master replied to PING, replication can continue...
[11225] 17 Sep 14:31:33.227 # MASTER aborted replication with an error: ERR Unable to perform background save
测试
测试是否在 BGSAVE 上创建了 dump.rdb
BGSAVE
> OK
测试dump.rdb是在SAVE上创建的
SAVE
> OK
提前致谢。
【问题讨论】:
工作目录设置为什么,用户是否有写入权限? 是的,它有写入权限。当我执行保存或启动/停止时,它会写出dump.rdb
。
【参考方案1】:
可能的修复:
确保 masterauth 和 requirepass 值在所有服务器(主/从)上都相同。
注意:masterauth 值基本上是向主机询问身份验证密码,用于尝试连接的从机,因此与主机本身并不完全相关,但在尝试与主机同步时与从机相关。这就是 requirepass(您在 Master 机器上的 redis 配置中设置的那个)的用途 - 即您在 Master 上为 requirepass 设置的值与您需要放在 redis 上的 masterauth 参数前面的值相同配置从机。最好在 Mater 机器上也这样做,以避免进一步混淆(尽管它与 Master 无关)。
您可以在其中一台从机的 redis 日志文件中查看更多线索:
Linux 命令:tail -f path-to-redis.log
【讨论】:
【参考方案2】:当我尝试使用 Redis 5.0.5 进行设置时,我发现保护模式已打开。当我在其 eth0 接口(而不是环回或 UNIX 套接字)上登录假定的主机时,当我尝试运行“INFO”时收到此消息:
IP_ADDRESS_REDACTED:6379> info
DENIED Redis is running in protected mode because protected mode is
enabled, no bind address was specified, no authentication password
is requested to clients. In this mode connections are only accepted
from the loopback interface. If you want to connect from external
computers to Redis you may adopt one of the following solutions:
1) Just disable protected mode sending the command 'CONFIG SET
protected-mode no' from the loopback interface by connecting to Redis
from the same host the server is running, however MAKE SURE Redis is
not publicly accessible from internet if you do so. Use CONFIG REWRITE
to make this change permanent. 2) Alternatively you can just disable
the protected mode by editing the Redis configuration file, and
setting the protected mode option to 'no', and then restarting the
server. 3) If you started the server manually just for testing,
restart it with the '--protected-mode no' option. 4) Setup a bind
address or an authentication password. NOTE: You only need to do one
of the above things in order for the server to start accepting
connections from the outside.
我按照说明进行操作,从机立即连接。
【讨论】:
【参考方案3】:我修复了以下问题:
sudo -i
service redis-server stop
apt remove --purge redis-server
rm /var/lib/redis/dump.rdb
apt install redis-server
systemctl enable redis-server
service redis-server start
# i have not tried, but it is possible this is enough
service redis-server stop
rm /var/lib/redis/dump.rdb
service redis-server start
【讨论】:
清理 dump.rdb 也解决了我的同步问题。谢谢你的建议。【参考方案4】:我在 redis.conf 中的默认设置启用了 requirepass,在“SLAVEOF”之前在从属终端执行“masterauth [passwordOfMaster]”将解决此问题。
【讨论】:
要100%清楚,要发出的命令是config set masterauth [passwordOfMaster]
【参考方案5】:
对我来说,这是因为我设置了requirepass
,但没有设置masterauth
。
【讨论】:
【参考方案6】:在我的情况下,它与 SELINUX 有关,将其更改为许可模式即可解决问题。
【讨论】:
修复 SELinux 问题比禁用它要好。【参考方案7】:我遇到了同样的问题,我的原因是我的两台服务器都没有使用相同的redis version
。让我们在两台服务器上检查您的版本:
127.0.0.1:6379> info server
# Server
redis_version:3.2.8
【讨论】:
【参考方案8】:这个问题有点棘手,
slave不能同步的原因在master本身,
注意日志输出: MASTER 中止复制并出现错误:ERR 无法执行后台保存
这意味着master由于master机器上的内存不足而无法进行后台保存,
为了解决这个问题,我重新启动了主 redis 服务器, 那么所有的slave已经自己同步了。
【讨论】:
为我工作,我运行了 redis-cli shutdown save,它在保存所有密钥的同时重新启动了 redis,并在几秒钟内同步了从站。【参考方案9】:我今天遇到了类似的情况。似乎对于使用sysctl
的系统,您可能必须这样做:
sysctl vm.overcommit_memory=1
并重新启动从属 redis 服务器。 This link 可能会有所帮助。
【讨论】:
以上是关于redis slave不会与master同步的主要内容,如果未能解决你的问题,请参考以下文章