Redis Cluster

sentinel的一个缺点是存储容量限于单台机器,而集群提供了一种分布式的解决方案。

redis有两种运行模式
1)单机模式:stand_alone
2)集群模式:cluster


每个节点都有slaves,但图中未画出

集群的键空间被分为16384(2^14)个槽(slot),这些slots被集群上的机器所瓜分,只有所有slots都有节点被处理时,集群才处于OK状态。

集群以分片(sharding)方式的保存数据库的键值对,通过以下公式计算key属于哪个槽位:

CRC16(key) & (2^14 - 1)

节点在接收到一个命令请求时,先会检查这个命令所处理的key所在的slot是否由自己负责,如果不是,则向客户端返回一个MOVED错误,该错误的携带信息可以指引客户端转向正在负责相关slot的节点。

集群中每个节点都定期向其他节点发送【ping】,如果在规定时间内没有返回【pong】,则认为该节点疑似下线。如果半数以上的节点认为该master疑似下线,那么认为该master事实下线。会在集群内广播一条master FAIL的消息。

集群会选择根据Raft算法选举主节点,注意与sentinel选择leader的差异。

1)集群中负责处理slots的主节点才有投票权,而且只能投一票。

2)从节点发现master进入FAIL状态,会向集群广播一条消息,要求其他主节点投票。

3)得到主节点半数以上的票数的从节点会成为主节点。

2019-03-19阅:
当master宕机后,从slaves中选择新的master,集群用的是投票方式,而sentinel用的是leader指定的方式。
sentinel:主观下线,客观下线
cluster:疑似下线,事实下线

2019-07-25
疑似下线 -> 事实下线 -> 选举新的master

参考资料:Redis集群研究和实践(基于redis 3.0.5)

推荐阅读更多精彩内容