有三台服务器

S1:192.168.50.121

S2:192.168.50.122

S3:192.168.50.123

其中S1、S2上部署了Redis服务和Redis sentinel,S3上只部署了Redis sentinel。

假设S1是Master,突然宕机,在经过一段时间后(down_after_milliseconds),可以看到控制台输出如下语句:

1. +sdown master mymaster 192.168.50.121 6379

当前哨兵认为master已经主观宕机,也就是sdown。

2.  +odown master mymaster 192.168.50.121 6379 #quorum 2/2

由于哨兵集群内有超过两个哨兵都认为master sdown了,因此转化成客观宕机,也就是odown。

3.  +new-epoch 1

递增集群状态版本号,这个版本号将被接下来选举出的新的master采用。

从这个可以看出,集群版本号是哨兵创建和维护的。

4. +vote-for-leader 2d271223c7df8d1d54967ee893fbebfbf6c60ab1 1

在哨兵集群中投票选举出一个哨兵,作为本次执行故障转移操作的leader。

5.  +try-failover master mymaster 192.168.50.121 6379

开始对IP为192.168.50.121,端口为6379,名为"mymaster"的Redis集群进行故障转移。

6.  +vote-for-leader 2d271223c7df8d1d54967ee893fbebfbf6c60ab1 1

当前哨兵投票给自己满意的slave

7. 337d50c8ef65a708ad27be2ce1ab9d3552046b64 voted for 2d271223c7df8d1d54967ee893fbebfbf6c60ab1 1

另一个哨兵投票给自己满意的slave

8.  ce1868c3f2dcc412d2348ffa6ccb5e6222ad1a47 voted for 2d271223c7df8d1d54967ee893fbebfbf6c60ab1 1

另一个哨兵投票给自己满意的slave

9.  +elected-leader master mymaster 192.168.50.121 6379

在哨兵集群中再次确认进行即将执行故障转移的leader是哪一个哨兵。 

10. +failover-state-select-slave master mymaster 192.168.50.121 6379

leader开始在集群中寻找合适的slave。(从这里可以看出,找出新的slave不单单是通过投票,可能还和其它的因素有关。)

11.  +selected-slave slave 192.168.50.122:6379 192.168.50.122 6379 @ mymaster 192.168.50.121 6379

出现"+selected-slave"意味着已经找到了合适的slave作为新的master,它是位于S2服务器上的192.168.50.122 6379 Redis服务。

12.  +failover-state-send-slaveof-noone slave 192.168.50.122:6379 192.168.50.122 6379 @ mymaster 192.168.50.121 6379

Leader向目标slave发送"slaveof-noone"指令,令其不要再做其它任何节点的slave了,从现在开始,它就是老大,完成从slave到master的转换。

13. +failover-state-wait-promotion slave 192.168.50.122:6379 192.168.50.122 6379 @ mymaster 192.168.50.121 6379

等待其它的sentinel确认slave

14. +promoted-slave slave 192.168.50.122:6379 192.168.50.122 6379 @ mymaster 192.168.50.121 6379

”+promoted-slave“ 意味着其它的sentinel全部确认成功。

15.  +failover-state-reconf-slaves master mymaster 192.168.50.121 6379

开始对集群中的所有slave做reconf操作(更新配置信息)。

16. +slave-reconf-sent 

向指定的slave发送"slaveof"指令,令其跟随新的master。

17. +slave-reconf-inprog 

目标slave正在执行slaveof操作,如果在此期间,又接收到了新的"slave-reconf-sent"命令,则在会在当前操作执行完毕后,再次执行slaveof。

18. +slave-reconf-done

目标slave配置信息更新完毕,leader可以对下一个slave开始reconfig操作了。

19.  +failover-end master mymaster 192.168.50.121 6379

本次故障转移完毕。

 20. +switch-master mymaster 192.168.50.121 6379 192.168.50.122 6379

故障转移完毕后,各个sentinel开始监控新的master。

这句话执行完毕后,我们可以去哨兵的配置文件中看到,sentinel monitor mymaster后面的ip已经发生了变化。