哨兵机制解决问题
- 主库是不是真的挂了
- 用哪个从库做为主库
- 新主库怎么通知给其他从库
哨兵机制流程
- 哨兵就是一个运行在特殊模式下的Redis进程,主要负责:监控、选择主库和通知
- 监控:哨兵进程在运行时,周期性地给所有的主从库发送 PING 命令,检测它们是否仍然在线运行
主管下线和客观下线
- 主观下线:哨兵进程会使用 PING 命令检测它自己和主、从库的网络连接情况,用来判断实例的状态。如果哨兵发现主库或从库对 PING 命令的响应超时了,那么,哨兵就会先把它标记为“主观下线”。检查从库使用主管下线
- 检查主库需要检查是否误判。通过哨兵集群,相当于多个哨兵同时判断,商量一下主库是否下线, 少数服从多数,减少误判
- “客观下线”的标准就是,当有 N 个哨兵实例时,最好要有 N/2 + 1 个实例判断主库为“主观下线”,才能最终判定主库为“客观下线”
怎么选择主库
- 按照一定的条件筛选掉不符合条件的从库
- 按照一定的规则,对剩下的从库进行打分,选取分数最高的成为新主库
筛选条件
- 要检查从库的当前在线状态,还要判断它之前的网络连接状态
- down-after-milliseconds * 10 配置时间内从库没有链接主库次数超过10次,就会认为从库网络链接不好
打分方式,只要在某一轮中,有从库得分最高,那么它就是主库了,选主过程到此结束,评分进入下一轮
- 从库优先级: 通过 slave-priority 配置项,给不同的从库设置不同优先级。比如,你有两个从库,它们的内存大小不一样,你可以手动给内存大的实例设置一个高优先级
- 从库复制进度,选择和旧主库同步最接近的那个从库作为主库,slave_repl_offset 最接近 master_repl_offset,实际上是直接比较个各个从库的offset,数据最新,丢失就会少一些
- 从库id号:从库的编号。目前,Redis 在选主库时,有一个默认的规定:在优先级和复制进度都相同的情况下,ID 号最小的从库得分最高,会被选为新主库。Redis server启动时,会生成一个40字节长的随机字符串作为runID,具体算法用的是SHA-1算法