Sentinel选举与故障转移

218 阅读3分钟

这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战

Sentinel选举与故障转移

主观下线

默认情况下,Sentinel每秒一次的频率向所有与它创建了命令连接的实例发送PING命令,通过返回的PING命令回复判断是否在线

Sentinel配置文件中的down-after-milliseconds选项指定的Sentinel判断实例进入主观下线所需时间长度,如果一个实例在配置的毫秒内连续向Sentinel返回无效回复,就认为这个实例已经进入主观下线

客观下线

当Sentinel将一个主服务器判断为主观下线后,为了确认这个主服务器是否真的下线了,会向监视这个主服务器的其他Sentinel询问,当该Sentinel从其他Sentinel也获得已下线的判断,Sentinel将主服务器进行客观下线,并进行故障转移

使用SENTINEL is-master-down-by-addr命令询问其他Sentinel是否同意主服务器已经下线,当另一个Sentinel收到这个命令后会检查主服务器是否下线,然后向源Sentinel返回三个参数的回复信息,down_state 1表示主服务器已下线

根据其他Sentinel返回的命令回复,Sentinel统计其他Sentinel同意主服务器下线的数量,达到配置指定的数量后,Sentinel对主服务器的flags属性修改,从而表示未已经客观下线。

选举leader

当主服务器客观性下线后,监视这个下线主服务器的各个Sentinel会进行协商,选出一个leader 来对下线主服务器进行故障转移。

选举方法:

每个发现主服务器进入客观下线的Sentinel都会要求其他Sentinel将自己设置为局部领头Sentinel,源Sentinel向目标Sentinel发送SENTINEL is-master-down-by-addr runid是源Sentinel的运行🆔,意味着源Sentinel要求目标Sentinel将牵着设置为后者的局部领头Sentinel,最先向目标Sentinel发送设置要求的Sentinel成为目标Sentinel的局部领头Sentinel,其他接收到的所有设置要求就会被目标Sentinel拒接,先到先得。有一半以上的Sentinel设置成了局部领头Sentinel,那么这个Sentinel就是leader

故障转移

领头Sentinel进行故障转移:

  1. 在已下线主服务器下的所有从服务器中选出一个,这个是按照从服务器的优先级高的,复制偏移量大的,运行id最小的作为合适的,然后向这个从服务器发送SLAVEOF no one命令,将这个从服务器转换为主服务器

  2. 领头Sentinel向从服务器发送SLAVEOF命令,让所有从服务器改为复制新的主服务器,

  3. 当下线的主服务器重新上线后,领头Sentinel向它发送SLAVEOF命令,让已下线的主服务器设置为新的主服务器的从服务器