尚硅谷redis7 70-72 redis哨兵监控之案例实操7
70 redis哨兵监控之案例实操7
问题:若3个哨兵都宕机了,那谁做转换?
这种情况很少出现,因为哨兵的任务就是监控,不存在高并发数据的读取,运行压力不大。实际生产都是不同机房不同服务,很少会出现三个哨兵全挂掉的情况。
哨兵可以同时监控多个master,一行一个。在 sentinel.conf
配置文件中,你可以添加多个 sentinel monitor
指令,例如:
sentinel monitor master1 192.168.1.10 6379 2
sentinel monitor master2 192.168.1.11 6379 2
sentinel monitor master3 192.168.1.12 6379 2sentinel auth-pass master1 yourpassword1
sentinel auth-pass master2 yourpassword2
sentinel auth-pass master3 yourpassword3
每个 master 节点都可以是一个独立的 Redis 主从结构,哨兵会分别对它们进行:
-
存活检查
-
故障判断
-
主从切换(failover)
71 redis哨兵监控之哨兵的运行流程
哨兵的运行流程和选举原理
当一个主从配置中的master失效之后,sentinel可以选举出一个新的master用于自动接替原master的工作,主从配置中的其他redis服务器自动指向新的master同步数据。
一般建议sentinel采取奇数台,防止某台sentinel无法连接到master导致误切换。比如部署 2 个哨兵,然后 quorum 也设为 2:
-
只要有 1 台哨兵误判 master 宕机,另外 1 台没问题,就永远无法达成 quorum,既不能判定故障,也不能完成切换。
运行流程,故障切换
三个哨兵监控一主二从,正常运行中
SDown主观下线(Subjectively Down)
SDOWN(主观不可用)是单个sentinel自己主观上检测到的关于master的状态,从sentinel的角度来看,
如果发送了PING心跳后,在一定时间内没有收到合法的回复,就达到了SDOWN的条件。
sentinel配置文件中的down-after-milliseconds设置了判断主观下线的时间长度【默认30s】
所谓主观下线(Subjectively Down,简称SDOWN)指的是单个Sentinel实例对服务器做出的下线判断,即单个sentinel认为某个服务下线(有可能是接收不到订阅,之问的网络不通等等原因)。主观下线就是说如果服务器在[sentinel down-after-milliseconds]给定的毫秒数之内没有回应
PING命令或者返回一个错误消息,那么这个Sentinel会主观的(单方面的)认为这个master不可以用
ODown客观下线(Objectively Down)
ODOWN需要一定数量的sentinel,多个哨兵达成一致意见才能认为一个master客观上已经宕掉
说明
quorum这个参数是进行客观下线的一个依据,法定人数/法定票数
意思是至少有quorum个sentinel认为这个master有故障才会对这个master进行下线以及故障转移。因为有的时候,某个sentinel节点可能因为自身网络原因导致无法连接master,而此时master并没有出现故障,所以这就需要多个sentinel都一致认为该master有问题,才可以进行下一步操作,这就保证了公平性和高可用。
选举出领导者哨兵(哨兵中选出兵王)
当主节点被判断客观下线以后,各个哨兵节点会进行协商,先选举出一个领导者哨兵节点(兵王)并由该领导者节点,也即被选举出的兵王进行failover(故障迁移)
“兵王”可能就是指其中一个 Sentinel 实例被选为 Leader,负责发起故障切换。
兵王如何选择出来?raft算法
由兵王开始推动故障切换流程并选出一个新master
72 redis哨兵监控之新master选举算法【面试重点】
由兵王开始推动故障切换流程并选出一个新master
选出新master
前提:剩余从机结点健康
首先看从机的权限,谁高选择谁。
redis.conf文件中,优先级slave-priority或者replica-priority最高的从节点(数字越小优先级越高)□
Redis 从节点配置中可以设置 slave-priority
,数值越小优先级越低,为 0 的永远不会被选为 master。
复制偏移位置offset最大的从节点
Sentinel 会选择数据最完整、复制进度最前的从节点,避免数据丢失。
最小Run ID的从节点
字典顺序,ASCII码
主从角色的切换
- 执行slaveof no one命令让选出来的从节点成为新的主节点,并通过slaveof命令让其他节点成为其从节点
- Sentinel leader会对选举出的新master执行slaveof no one操作,将其提升为master节点
- Sentinel leader向其它slave发送命令,让剩余的slave成为新的master节点的slave
故障切换后老 master 节点重启上线
将之前已下线的老master设置为新选出的新master的从节点,当老master重新上线后,它会成为新master的从节点
Sentinel leader会让原来的master降级为slave并恢复正常工作。
总结:上述的failover【故障切换】操作均由sentinel自己独立完成,完全无需人工干预