Sentinel(哨兵)是Redis高可用性的解决方案,一个或者多个sentinel实例监视任意多个主服务器及其从服务器。这里不说sentinel是如何搭建起来的,只说下故障转移处理。
sentinel的配置文件中有master的ip和port,通过向master发送【info】,就能获得从服务器的信息。sentinels和master和slaves之间都有命令连接。
sentinel每隔1秒向master发送【ping】,如果在一段时间内没有收到回复或者收到无效回复,则认为master主观下线。
sentinel down-after-milliseconds master 5000
上面的配置表示5000ms是主观下线的时间限制。
如果一个sentinel认为master主观下限,会询问其他sentinel是否下限,如果认为master主观下线的master达到一定数量,那么认为其客观下线
sentinel monitor master 127.0.0.1 6379 2
上面配置表示有两个sentinel认为master主观下限,则认为master客观下线,这是就需要进行故障转移处理。
故障转移处理之前,需要在sentinels中选举出leader(根据Raft算法),由它负责进行故障转移。
认为master客观下线的sentinel会向其他sentinels发送请求,如果有超过半数的sentinels同意,那么改sentinels会成为leader;如果没有选出leader,将进行第二次选举。不管选举是否成功,sentinels的纪元值+1.
leader会在slaves中选择一个作为新的master。leader向master发送slaveof on one,向其他slaves发送slaveof ip port(新的master的ip和port),slaves就会复制新的master中的数据。
leader会选择哪一个slave作为新的master呢?
1)排除断线的slaves
2)选择优先级最高的
3)选择复制偏移量最大的
4)选择run_id最小的
2019-07-25
主观下线 -> 客观下线 -> 选举Leader -> 任命新master
欲知更多技术细节,请阅读《Redis设计和实现》以及
网友评论