引入
在主从模型中讲到
一旦Master宕机失效,需要手动将Slave角色提升为Master,否则这个子集群将不可用。
这个缺陷使得系统可用性大大降低。因此Redis专门提供了一个哨兵机制来实现自动故障检测和转移。
什么是哨兵
哨兵(Sentinel)是一种特殊的Redis实例,与Redis存储实例一样,哨兵同样是基于配置的。
你可以通过以下两种方式启动哨兵:
redis-sentinel /path/to/sentinel.conf
redis-server /path/to/sentinel.conf --sentinel
哨兵需要做什么
- 监控节点状态
- 当Master节点故障时,自动提升Replication(Slave)为Master
- 发送故障通知
- 配置传播(就是把更新后的集群配置传播给其他哨兵进行更新,保持一致性)
怎么实现
- 节点监控
如图(图中S为Sentinel,M为Master,R为Replication即Slave),Sentinel模型集群中的每个Sentinel都在监控着每个节点,每隔一段时间会向每个节点发送PING,通过返回的PONG信息确认节点正常。
![](https://img2018.cnblogs.com/blog/915947/201903/915947-20190324152023792-97329795.png "Sentinel模型")
Sentinel与监控的节点之间实现了SUB/PUB(发布订阅)机制,每次Sentinel发布PING消息只需要在频道上发布并接收订阅者返回的消息。
- 故障检测与Failover
在这里有两个重要概念:主观下线(sdown)以及客观下线(odown)。因为Sentinel的数量>=2,并且每个Sentinel都在监控着每个节点,因此Sentinel与节点之间的连接都存在着主观性,这个主观性取决于Sentinel与节点之间的网络连通性。对于单个Sentinel而言,当其通过PING发现某个节点无反应时,其认为节点为下线状态,由于这个决定是这个Sentinel主观认为的,因此将此决断称为主观下线(sdown)。当Sentinel中认为某个节点主观下线的数量超过某个值时:- 1.投票选举Sentinel
- 2.选出Slave,提升为Master,并将更新后的配置广播给其他Sentinel,Master将同步下属Slave数据
参考文献
[1]redisLab.[EB/OL]. https://redis.io/topics/sentinel. 2019.01-2019.03.