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
网友评论