[toc]
Q: 主节点如果挂了,就无法响应写操作了,那么redis如何检测到主节点离线或者挂了?#
A:
- redis有多个哨兵进程,共同监控主从节点的状态。
- 当某个哨兵发现主节点连不上了,则会进行“主观下线”,即他个人认为主节点掉了。
- 接着这个最先发现主节点掉线的哨兵,会马上发送is-master-down-by-addr给其他哨兵, 让其他哨兵帮忙确认一下。
- 其他哨兵同时做一下检测,确认不通时,就会给出赞同票。
- 当赞同票大于quorum 配置,则认为主节点是“客观下线”了
Q: 讲了那么多, 什么是哨兵啊?是某个redis进程里带的一个独立模块吗?#
A:
- Sentinel 其实是一个 redis 服务端程序,只不过运行在特殊的模式下,不提供数据存储服务,只进行普通 redis 节点监控管理。
- 它也会定时执行 serverCron 函数,只是里面其他的程序用不到,用到的是对普通 redis 节点的监控以及故障转移模块。
Q: 为什么要用多个哨兵进程进行监控,而不用一个监控进行监控?#
A:
- 一个监控程序不可靠, 如果1个监控进程挂了,那么检测机制就失效了
- 一个监控程序有一个特定的检查间隔, 而哨兵机制可以多个分时间段进行检测。当最先发现下线的人,触发投票过程即可
Q:哨兵进程怎么知道其他哨兵进程的存在?#
A:
在主从集群中,主库上有一个名为__sentinel__:hello的频道,不同哨兵就是通过它来相互发现,实现互相通信的
-
哨兵 1 把自己的 IP(172.16.19.3)和端口(26579)发布到__sentinel__:hello频道上
-
哨兵 2 和 3 订阅了该频道。那么此时,哨兵 2 和 3 就可以从这个频道直接获取哨兵 1 的 IP 地址和端口号。
-
然后,哨兵 2、3 可以和哨兵 1 建立网络连接。
Q: 哨兵怎么对主节点继续检测的?#
A:
由哨兵向主库发送 INFO 命令来完成的
,哨兵 2 给主库发送 INFO 命令,主库接受到这个命令后,就会把从库列表返回给哨兵,实时更新。
Q: 当确认主节点客观下线后, 由哪个哨兵来负责通知客户端或者应用服务进行主节点ip的切换?#
A:
需要选一个主的哨兵节点。
Raft选举算法: 选举的票数大于等于num(sentinels)/2+1时,将成为领导者,如果没有超过,继续选举
Q: 什么情况下无法完成主从切换?#
A:
哨兵进程挂掉太多。
假设有5个哨兵进程, 1个哨兵必须拿到超过多数的选票(5/2+1=3票)。
但目前只有2个哨兵活着,无论怎么投票,一个哨兵最多只能拿到2票,永远无法达到N/2+1选票的结果。因此无法完成主从切换。
Q: 从库那么多,怎么选择一个新的主库?#
A:
- 剔除和其他哨兵不通的从节点
- 选择salve-priority配置中优先级最高的从节点
- 选择偏移复制量最大的,即复制最完整的。
Q: 选定主库后, 故障转移的流程是怎么样的?#
A:
- 主哨兵通知新主节点, 让他把自己升级主节点,不再需要同步别人的数据。
- 通知其他的从节点更新主节点ip
- 通知客户端或者应用服务,主节点已经更换。
- 原先掉线的主节点如果上线了,会被通知成为从节点。