先交代一下背景,如果想直接看解决方案的话,可以直接翻到问题解决
问题背景
在上一篇,我们搭建了一个redis集群。这一篇看看,redis集群实现故障转移的过程。
随意登录一个节点
redis-cli -h 127.0.0.1 -c -p 7001
执行cluster nodes命令,查看集群节点的关系
127.0.0.1:7002> cluster nodes
0484124bc3417523a8d49ba29e555a320c66467f 127.0.0.1:7006@17006 slave 9d7f1f1a3a218e28edb1d042adcfcd81820dfadc 0 1679136165000 6 connected
d733c59098308ea7bc39a114191db81824da56e3 127.0.0.1:7005@17005 slave b82556f6eb686132edcfe0757658f4a2ce7c711b 0 1679136165968 9 connected
9d7f1f1a3a218e28edb1d042adcfcd81820dfadc 127.0.0.1:7002@17002 myself,master - 0 1679136164000 2 connected 5461-10922
c2b8af4aec6bc300b240ec13eb0ecabcb3ab7fa2 127.0.0.1:7004@17004 slave eca1fe20864887f5f60479d2485dd3742a04d284 0 1679136167000 4 connected
b82556f6eb686132edcfe0757658f4a2ce7c711b 127.0.0.1:7001@17001 master - 0 1679136167977 9 connected 0-5460
eca1fe20864887f5f60479d2485dd3742a04d284 127.0.0.1:7003@17003 master - 0 1679136166973 3 connected 10923-16383
3主,3从。没有问题。此时我们kill掉其中一个主节点,比如7001,此时redis会从所有的从节点中选择一个作为主节点。这个选举过程,只有主节点参与,需要N/2+1个主节点同意,从节点才能成为主节点。比如:我们这个场景,3主3从,至少需要3个主节点都同意,从节点才能成为主节点。
kill之后,再次查看集群节点关系
0484124bc3417523a8d49ba29e555a320c66467f 127.0.0.1:7006@17006 slave 9d7f1f1a3a218e28edb1d042adcfcd81820dfadc 0 1679136628967 6 connected
d733c59098308ea7bc39a114191db81824da56e3 127.0.0.1:7005@17005 master - 0 1679136628000 10 connected 0-5460
9d7f1f1a3a218e28edb1d042adcfcd81820dfadc 127.0.0.1:7002@17002 myself,master - 0 1679136628000 2 connected 5461-10922
c2b8af4aec6bc300b240ec13eb0ecabcb3ab7fa2 127.0.0.1:7004@17004 slave eca1fe20864887f5f60479d2485dd3742a04d284 0 1679136628000 4 connected
b82556f6eb686132edcfe0757658f4a2ce7c711b 127.0.0.1:7001@17001 master,fail - 1679136611502 1679136609000 9 disconnected
eca1fe20864887f5f60479d2485dd3742a04d284 127.0.0.1:7003@17003 master - 0 1679136628000 3 connected 10923-16383
从节点7005成为主节点,目前是3主2从,集群依然可以对外提供服务。
问题复现
正常来说,我们再重启7001,7001会成为7005的从节点。但是我重启之后,7001并没有加入集群,在7001上执行cluster nodes命令,只有7001一个节点。
问题解决
这个原因,是因为我们上一篇的redis.conf配置文件中缺少一个配置,如下:
dir ./dataStore/
就是这个dir配置,这个配置里面放着aof或者rdb等持久化文件,同时,如果是集群的话,集群的节点配置信息也在这个目录放着。如果我们希望节点重启自动加入集群,这个dir配置一定要有,加上dir配置后,把所有节点都停掉,然后重新执行redis-cli命令重新创建集群。再次验证,先停一个主,此时它的从会成为主,然后再把之前的主重启,此时它会成为从