Redis的哨兵模式

哨兵的作用

Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下:

  • 监控:Sentinel会不断检查您的master和slave是否按预期工作
  • 自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主
  • 通知:Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端

服务状态监控

Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:

  • 主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线。
  • 客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。

简单来说就是一个哨兵在监测结点时,如果结点没有响应,则这个哨兵就会认为这个结点主观下线,如果超过一半的结点都认为这个结点主观下线,则这个结点就会变成客观下线

如果这个结点真的宕机了,哨兵集群就会投票选举出一个新的主节点

哨兵选主规则

  • 首先判断主与从节点断开时间长短,如超过指定值就排除该从节点
  • 然后判断从节点的slave-priority值,越小优先级越高
  • 如果slave-prority一样,则判断slave节点的offset值,越大优先级越高
  • 最后是判断slave节点的运行id大小,越小优先级越高。

slave-prority是优先级,可以通过配置文件配置

offset值越大,就说明越接近主节点 

脑裂问题

脑裂问题,就是当网络波动过大,主节点跟从节点不在一个网络分区,哨兵监测不到主节点,就会重新选举一个主结点,出现两个主节点,这就是脑裂问题

但是此时之前的主节点没有宕机,还可以正常的接受请求,所以客户端还会往老主结点写入数据,新的结点无法同步数据,假如现在网络恢复了,哨兵会将老的主节点强制转为从节点,这个从结点就会去从新的主节点去同步数据,他自己的数据就会清空,这就是脑裂产生后数据丢失的问题

 

解决方案

redis中有两个配置参数:

  • min-replicas-to-write 1 表示最少的salve节点为1个
  • min-replicas-max-lag 5 表示数据复制和同步的延迟不能超过5秒

第一个参数的作用是当客户端连接主节点必须要有一个从节点才写入数据,否则就拒接请求

主从数据同步的延迟不能超过5秒,老的主节点如果没有脑裂的话肯定会同步数据给从节点,如果没有同步给从节点在5秒内,就说明发生了脑裂,不接受java客户端的请求即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值