持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
基于哨兵机制的哨兵集群
哨兵(sentinel)机制用于实现主从集群的故障恢复,主要有三点作用
- 监控:不断检查master和slave是否正常工作
- 自动故障恢复:如果master发生故障,重新指定新的master
- 通知:作为redisClient的服务发现来源,当集群出现故障转移后,通知RedisClient
-
如何实现服务状态监控?
使用心跳机制每秒钟向实例发送ping命令,如果某个sentinel节点发现实例未响应则认定该实例主观下线,如果超过一半的sentinel认定主观下线,则该实例客观下线。
-
选举新的master?
在与master断开时间不超过阈值的slave中选择offset值最大的那个,同时结合slave-priority和slave-id判断优先级
-
故障转移是如何实现的?
给要成为master的slave节点发送
slaveof no one
命令,给其他slave节点发送slaveof ip:port
命令,从新的master节点同步数据,将原master节点标记为slave,故障恢复后称为新master的slave节点。
分片集群
哨兵集群只能解决高并发读的问题,另外对于大数据量的存储,单master节点无法解决,需要使用分片集群方式来解决。
即:使用多个master节点,每个master节点又有自己的slave节点,master节点之间互相健康检测,客户端访问任一master节点,请求最终被路由到正确的master节点上。
散列插槽:每个master节点映射到16384个hash slot上,每个节点负责存储一个范围的hash slot数据存储,数据和插槽相关联,根据插槽寻找对应实例
-
如何计算数据属于哪个散列插槽?
如果key中包含{},例如
{itcast}num
,以itcast通过CRC16计算得到hash值,取余计算得到hash插槽,因此将一类数据使用固定的itcast,可以让他们保存在同一个实例