Redis里面引入了哨兵,主要是为了提高集群的高可用,容错和监控机制,下面我们看看哨兵的作用吧
1.sentinal中文是哨兵,哨兵是redis集群中很重要的角色 主要功能如下:
- 集群监控,监控redis的master和slave是否工作正常
- 消息通知:如果有个节点挂了,可以通知管理员
- 故障转移:如果master挂了,会自动转移到slave node
- 配置中心:如果故障转移发生了,通知client新的master地址
哨兵本身也是分布式的,可以作为一个集群去运行 1)故障转移的时候判断一个节点master node宕机了,需要大部分哨兵统一,涉及到选举 2)即使部分节点挂了,哨兵集群还是能够运行
2.哨兵必须至少三个实例保证健壮性
必须大于n/2 + 1哨兵同意,才能故障转移,所以必须是至少三个
3.哨兵复制过程导致数据丢失问题
4.哨兵脑裂数据丢失问题
脑裂就是说master node突然脱离正常网络,不能和其他机器通信了,但是他没有挂,这时候setinal集群就会选举新的master将其他slave选举为master,这时候集群中就有两个master了,这就是所谓的脑裂。这时候虽然slave选举为了master,但是client可能没来得及切换,还往老的master写数据,当老的master连接上集群后,回作为一个新slave那么它的数据就会被清空,从新的master同步数据,数据就丢失了。
5.解决复制丢失数据和脑裂问题 解决上面问题需要开启参数:
min-slaves-to-write 1
min-slaves-max-log 10
1)减少min-slaves-max-lag这个配置:一旦slave和ack时间延迟了,就认为master宕机后,损失数据过多,拒绝写请求,最大限度减少master未同步到slave的数据范围。
2)如果一个master出现了脑裂,跟其他slave丢了连接,那么上面配置确保如果不能继续给指定数量的slave发送数据,而且slave超过10s没有给自己ack,那么就拒绝写请求,这样脑裂的master就不会写数据,也不会丢失,上面配置了10s,最多丢失10s数据。