1

顺风车运营研发团队 方波
sentinel是redis的高可用解决方案,由一个或多个sentinel实例组成的系统可以同时监听多组master-slave实例(后面简称一组),当发现master进入下线状态时进行故障转移。
一:启动并初始化
redis-server /path/sentinel.conf --sentinel
redis-sentinel /path/sentinel.conf
1 初始化服务器, sentinel是一个运行在特殊模式下的redis服务器,使用了简要的命令表。
2 将普通redis服务器使用的代码替换成sentinel专用代码,sentinelcmds作为服务器命令表
3 初始化sentinel状态
4 使用配置文件初始化sentinel监听的主服务器列表,比如客观下线的投票数,故障转移时同时进行同步的slave数量等
5 向主服务器创建链接,命令链接和订阅链接

二:

1 获取master-slave信息,sentinel通过info命令来获取master和slave信息,并创建实例,创建命令和订阅链接,info命令频率为十秒一次。

2 sentinel向master-slave发送订阅信息,_s表示自己的信息,_m表示监视的master信息,同时接收来自别的sentinel发送的订阅信息,并根据ip port 运行ID等八个参数进行对比更新sentinel字典

clipboard.png

3 sentinel发现了新的sentinel,将会在sentinel字典中创建对应的实例,还会创建命令链接,新的sentinel也会创建同样的链接,此时形成了互相链接的网络,对于监视同一组master-slave的sentinel会以每两秒的频率给监视服务器的__sentinel__:hello频道发送消息,表示自己的存在,同时也会接收别的sentinel发送的消息,按需要更新sentinel列表,并创建命令链接

clipboard.png

4 检测主观下线状态,sentinel以每秒一次的频率给master slave sentinel实例发送ping,根据回复判断实例是否在线,当超过指定时常时,sentinel将这个实例判断为主观下线,此时sentinel会向监视这个实例的其他sentinel进行询问,是否同意这个服务器进入主观下线状态,当收到指定数量的下线判断后,sentinel将服务器判定为客观下线,并进行一次故障转移。

5故障转移步骤

1)sentinel挑选某个slave升级为master
2) sentinel给slave发送新的复制命令,使新的master成为slave的主服务器,所有服务器都开始复制新的master时,故障转移完成
3) sentinel监视下线的master,当他再次加入时将成为新master的slave

clipboard.png

clipboard.png

6 选举领头sentinel

1) 每个在线的sentinel被选举为leader的概率是均等的
2) 每次进行选举之后,所有sentinel的配置纪元都会自增一次,不论成功与否
3) 每一个配置纪元里面,所有sentinel都有一次将某个sentinel设置为局部leader,并且在这个配置纪元里面一旦设定就不会再更改
4) 每个发现主服务器进入客观下线的sentinel都可以要求其他sentinel将自己设为局部leader
5) 当一个sentinel(源)向另一个sentinel(目标)发送SENTINELi is-master-down-by-addr命令,且命令中的runid不是*而是源sentinel的运行ID时,表示要求目的sentinel将源sentinel设置为局部leader,并且遵循先到先得原则,后到的命令将被拒绝,并返回局部leader的runid和leader_epoch给源sentinel,源sentinel接收后对比是否是自己。
6) 如果一个sentinel被半数以上的sentinel设置为局部leader,那么这个sentinel就是新的leader
7) 如果在给定的时间内没有选举出leader,那么在一段时间后再次进行选举,直到选举出leader为止

clipboard.png

             (runid, leader_epoch)


AI及LNMPRG研究
7.2k 声望12.8k 粉丝

一群热爱代码的人 研究Nginx PHP Redis Memcache Beanstalk 等源码 以及一群热爱前端的人