回答
Sentinel 发现 master 节点客观下线后,会自动开启故障转移流程,选择一个合适的 Slave 节点晋升为新的 Master。这个过程分为筛选备选节点和选择 Master 两个步骤。
一、使用如下条件筛选备选节点
- Slave节点状态处于
S_DOWN
、O_DOWN
、DISCONNECTED
的除外。 - 最近一次
ping
应答时间不超过5倍 ping 的间隔。假如ping
的间隔为1
秒,则最近一次应答延迟不应超过5
秒。 info_refresh
应答不超过3倍info_refresh
的间隔。Slave
节点与Master
节点失去联系的时间不能超过((now - master->s_down_since_time) + (master->down_after_period * 10)
)。slave_priority
不等于0。这个值在配置文件中指定,默认为 100。
二、从备选节点中按照如下顺序选择新的 Master
- 较低的
slave_priority
。优先级越低,越会被优先考虑选择为 Master。如果设置为 0,则该 slave 永远不会被选作 Master。 - 较大的replication offset(复制偏移量)。复制偏移量越大,数据越完整。
- 较小的runid。
- 如果以上条件都不足以区别出唯一的节点,则会看哪个Slave节点处理之前Master发送的命令多,就选谁。
一旦选定新的 Master,Sentinel 会对该 Slave 发送 SLAVEOF NO ONE
命令,让其成为新的 Master。