8.2 哨兵模式
- 哨兵模式(sentinel):反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库切换成主库
- 创建sentinel.conf的文件,配置哨兵参数:sentinel monitor 主机名称 主机IP 主机端口 选举票数。例如sentinel monitor host6379 127.0.0.1 6379 100
- 启动哨兵:redis-sentinel /myredis/sentinel.conf
- 主节点异常时,哨兵选举新的主节点;当原来的主节点重新恢复时,成为新的主节点的从节点
8.2.0 下面知识点的思路
从一个哨兵到哨兵集群-->自动发现机制
建立有效的哨兵集群,需要保证至少3个节点 -->节点数量大于等于3
哨兵集群建立起来后,如何下线主节点,如何选举 -->主观宕机、客观宕机 节点选举
如何避免异步复制和脑裂问题 -->数据丢失问题
节点信息由于主从切换发生变化时 -->哨兵会进行同步
8.2.1 哨兵集群的自动发现机制
(1)哨兵之间的发现是通过发布订阅机制实现的。每个哨兵都会向_sentinel_:hello这个channel里发送消息,这个时候所有其他哨兵都可以消费这个消息,并感知其他哨兵的存在
(2)每隔2秒,每个哨兵都会往自己控制的主从节点对应的channel发送消息,内容是自己的host、ip、run id和对这个主节点的监控配置
(3)每个哨兵也会去监听自己监控的每个主从节点对应的channel,然后去感知同样在监听这个主从节点的其他哨兵的存在,这个时候哨兵键会交换对主节点的监控配置,达到同步监控配置的目的
8.2.2 主观宕机(sdown)和客观宕机(odown)
(1)如果某个主节点的redis服务不可用了,一个哨兵发现这个主节点不能提供服务了,这个时候这个哨兵主观上认为这个主节点宕机了,称为主观宕机。
(2)后面陆续有其他的哨兵也发现这个主节点不可用,并且哨兵数量达到一定值(quorum值)时,称为客观宕机
(3)如何判定主观宕机?
当超过sentinel.conf文件中的参数(is-master-down-after-milliseconds)配置的毫秒数后,哨兵还是ping不通主节点就达到判定条件。
(4)如何判定客观宕机?
当一个哨兵在指定时间内,收到quorum个其他哨兵的宕机信息后,就转为客观宕机
8.2.3 哨兵集群为什么哨兵节点数要大于2个?
(1)哨兵选举有个次序,先是数量达到quorum的哨兵认为客观宕机,再是数量达到majority(大于等于)个哨兵时确定新的主节点。
(2)2哨兵的集群,quorum为1,majority为2,在一个哨兵节点异常时,无法达成majority=2的条件,无法选举出新的主节点。
8.2.4 主从节点的选举算法
(1)选举算法的影响因素有4个,按照影响大小排序:
1、从节点与主节点断开的时间
2、从节点的优先级
3、复制offset的大小
4、run id的大小
(2)算法过程如下:
1、首先如果断开时间超过一定阈值,那么将不在将从节点视为候选节点。阈值为down-fater-millisecond*10+宕机时间
2、在选取优先级高的从节点,优先级的确定通过参数确定:
# 当master不可用,Sentinel会根据slave的优先级选举一个master。最低的优先级的slave,当选master。而配置成0,永远不会被选举
replica-priority 100
3、偏移量offset意味这从主节点同步数据的多少,一般认为偏移量越大,同步数据就多。
4、最后参考条件run id
8.2.5 异步复制和脑裂数据丢失问题
异步复制数据丢失问题
(1)主从节点同步数据是异步的,所以可能部分数据还没有复制到从节点,主节点就宕机,此时这部分数据就会丢失
脑裂问题数据丢失问题
(1)某个主节点由于网络问题不能与从节点进行通信,主节点状态存活任然可以和客户端进行数据操作。此时,哨兵认为主节点宕机,然后开始进行选举,将其他从节点切换成主节点。这个时候集群中就有两个主节点,这就是脑裂。此时如果客户端继续想原来的主节点写入数据,原来的主节点网络恢复加入集群中变成从节点,会从新的主节点同步数据,此时之前的部分数据被覆盖,造成数据丢失。
上面两个问题的解决办法:
两个关键配置:
min-slaves-to-write 1
min-slaves-max-lag 10
要求至少有1个从节点,数据复制和同步的延迟不超过10秒。
一旦说所有的从节点,数据复制和同步的延迟都超过10秒,这个时候主节点就不会在接受数据
8.2.6 从节点配置信息的自动纠正
哨兵会负责自动纠正从节点的一些配置,比如从节点如果要称为潜在的主节点候选人,哨兵会确保从节点在复制现有的主节点的数据。
8.2.7 增加删除哨兵
增加哨兵:
(1)配置sentinel.conf文件,启动哨兵
删除哨兵:
(1)停止哨兵进程
(2)在所有哨兵节点上执行命令: sentinel reset *,重置所有主节点状态
8.2.8 从节点下线后的哨兵操作
需要在所有哨兵节点上执行 sentinel reset mastetname 命令,达到刷新主从配置的目的