被很多资料误导了,说什么redis只能是奇数个节点。其实这是一种错误的说法,Redis只不过是推荐奇数个节点,从来没有过必须是奇数节点的说法,那么这是为什么呢?
为什么redis推荐奇数个节点其主要原因还是从成本上考虑的,因为奇数个节点和偶数个节点允许宕机的节点数是一样的,比如3个节点和4个节点都只允许宕机一台,那么为什么要搞4个节点去浪费服务资源呢?
那么话又说回来了,为什么三个节点和四个节点都只允许宕机一个节点呢?这是因为redis规定
集群中,半数以上节点认为主节点故障了,才会选举新的节点。
三个节点的情况
我们假设存在这样一个Redis集群(A、B、C三个节点)A节点是主节点
情况一:坏了一个节点
如果是A节点坏了,就需要从B和C里面选举一个节点出来作为主节点,而因为B和C占比在集群中个占33.333%。那么投票会有以下四种情况和对应结果
- B和C都投给自己,各占比33.33%,不满足超过半数的约定,重新选举
- B和C都投给对方,各占比33.33%,不满足超过半数的约定,重新选举
- B投给自己,C投给了B,B被选举为主节点,系统恢复运行
- C投给自己,B投给了C,C被选举为主节点,系统恢复运行
可以看到,只要投票次数足够多,总能从B或者C中选举出来一个主节点,系统总是能够自动恢复的。
情况二:坏了两个节点
假设A和B或者A和C都坏了,剩下的一个节点占比只有33.333%。那么他是没法选举自己为主节点的,整个系统也是没法恢复正常的。
四个节点的情况
情况一:坏了一个节点
如果是A节点坏了,就需要从B和C和D里面选举一个节点出来作为主节点,而因为B和C和D占比在集群中个占25%%。那么投票会有以下几种情况和对应结果
- B和C和D都投给自己,各占比25%,不满足超过半数的约定,重新选举
- B和C和D都投给对方,各占比25%%,不满足超过半数的约定,重新选举
- C和D投给了B,B投给了C。B占比50%,C占比25%。还是没有节点满足超过半数的约定,重新选举
- C和D投给了B,B投给了自己,B占比75%。B被选举为主节点,整个系统恢复正常
- 其他情况自行脑补
情况二:坏了两个节点
如果是A和B坏了,剩下的C和D投票最多只能投到50%。不满足超过半数的约定,系统无法恢复正常。
通过上面的分析,想必可以清楚,不管是3个节点还是4个节点,都只能允许一个节点宕机。所以在实际使用过程中出于成本的考虑,一般会建议奇数个节点。
但是:4个节点的性能和容量是比3个节点高的,如果对性能或容量方面有要求的,也可以偶数个节点,Redis是完全支持的,但如果是偶数个节点,部署不当容易引起脑裂问题,什么是脑裂问题呢?欢迎看我的另一篇文章Zookeeper脑裂问题以及为什么推荐奇数节点讲解