我正在尝试在群集故障转移期间测试我的软件行为,因此我想配置一个最简单的群集:一个主服务器和两个服务器。我有以下内容的 7000.conf - 7002.conf 树文件:
port 7000
cluster-config-file nodes.7000.conf
appendfilename appendonly.7000.aof
dbfilename dump.7000.rdb
pidfile /var/run/redis_7000.pid
include cluster.conf
cluster.conf 的内容:
cluster-enabled yes
appendonly yes
maxclients 100
daemonize yes
cluster-node-timeout 2000
cluster-slave-validity-factor 0
我已配置然后7000运行从0到16383的所有插槽,7001和7002是7000的副本:
XXX 127.0.0.1:7002 slave YYY 0 1511389011347 4 connected
YYY 127.0.0.1:7000 myself,master - 0 0 4 connected 0-16383
ZZZ 127.0.0.1:7001 slave YYY 0 1511389011246 4 connected
然后我试图摆脱7000 - 通过shutdown
命令,或通过杀死进程。其中一个奴隶应该促使自己掌握,但没有一个:
ZZZ 127.0.0.1:7001 slave YYY 0 0 3 connected
YYY 127.0.0.1:7000 master,fail? - 1511389104442 1511389103933 4 disconnected 0-16383
XXX 127.0.0.1:7002 myself,slave YYY 0 1511389116543 4 connected
我等了几分钟,我的奴隶不想成为主人。如果我通过cluster failover takeover
强制奴隶成为主人,那么他们非常乐意这样做(如果我重新启动主人,它会成为奴隶),但不是自动的。
我尝试过玩cluster-node-timeout
- 没有帮助。
我做错了吗? Redis版本是3.2.11。
答案 0 :(得分:1)
问题是redis-cluster的最小大小为3个主服务器,以实现自动故障转移。它是主节点,彼此观察并检测故障转移,因此,如果群集中有一个主节点,则没有正在运行的进程能够检测到您的一个主节点已关闭。最少三个,是为了确保在任何被击落的节点的情况下,整个集群的大部分需要同意,所以至少你需要3个节点,仍然有超过一半的节点到达多数在失败的情况下查看。
Redis群集教程在以下部分中提到了这一点:https://redis.io/topics/cluster-tutorial#creating-and-using-a-redis-cluster
"Note that the minimal cluster that works as expected requires to contain at least three master nodes."
答案 1 :(得分:0)
请注意,即使有3个主服务器,如果故障发生在群集中,如下所示,也无法保证自动故障转移:(M-Master / S-Slave)
节点1:M1 S3
节点2:M2 S1
节点3:M3 S2
现在,如果节点3发生故障,则其在节点1中的从属S3将自动提升为主节点。在节点3恢复后,所有状态都具有以下状态:
节点1:M1 M3 <-----请注意,现在带有S3的节点1中的2个主设备在上一步中变为M3。
节点2:M2 S1
节点3:S3 S2 <-----请注意,redis服务器作为从站(之前是M3)出现
现在,您可能会认为集群将继续轻松地处理故障,因为此设置中有3个主机。但是,如果节点1失败,则由于仲裁不满意,群集将关闭,并且除非我们进行一些手动调整,否则群集永远都不会启动。
希望这会有所帮助。