Redis群集故障转移:slave将不会成为主服务器

时间:2017-11-22 22:25:17

标签: redis cluster-computing failover

我正在尝试在群集故障转移期间测试我的软件行为,因此我想配置一个最简单的群集:一个主服务器和两个服务器。我有以下内容的 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。

2 个答案:

答案 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失败,则由于仲裁不满意,群集将关闭,并且除非我们进行一些手动调整,否则群集永远都不会启动。

希望这会有所帮助。