Redis(十)——哨兵模式
1、概念
Sentinel(哨兵)是Redis高可用性的解决方案:由若干个哨兵组成的哨兵系统可以监视任意多个主从服务器,并且在主服务器下线时,自动让该主服务器的某个从服务器升级成主服务器,由新的主服务器代替已经下线的主服务器继续处理命令请求。
2、哨兵机制的功能
- 监控:不断检查主从节点是否运行正常。
- 自动故障转移:当主节点不能正常工作时,自动将其中一个从节点成为新的主节点,其余从节点改为复制新的主节点。
- 配置提供者:客户端初始化时,通过连接哨兵来获取当前redis服务的主节点地址。
- 通知:可以将故障转移后的结果通知给客户端。
3、哨兵的配置与启动
- 哨兵的sentinel.conf文件里配置主节点与quorum
- 依次启动主节点、从节点,先构建出主从模式
- 启动哨兵节点,哨兵节点与主节点创建连接后,会给主节点发送自己的信息,同时获取其他哨兵的信息,两两相互连接,形成哨兵集群;哨兵也在主库获取从库信息,进行连接。
- 哨兵与主从节点之间会创建命令连接和订阅连接,哨兵之间只会创建命令连接。
4、哨兵是特殊的redis服务器
- 不载入AOF或RDB文件;
- 不提供读写服务,不能使用键值对命令、事务命令、脚本命令、持久化命令;
- 复制命令只允许内部使用;
- 发布与订阅命令中publish只能内部使用;
- 普通redis的端口是6379,哨兵端口是26379;
- 主要用来监控redis节点;
5、主观下线和客观下线
#sentinel monitor <master-name> <master-host> <master-port> <quorum> sentinel monitor master 127.0.0.1 6379 2 #设置主观下线时常50000毫秒 senetinel down-after-milliseconds master 50000
- 主观下线:每个哨兵默认每秒探测一次主库,连续在一段时间(down-after-milliseconds)内获取不到有效回复,则判定为主观下线。 不同哨兵对主库主观下线的判定时间可能不同。
- 客观下线:当哨兵将一个主服务器判断为主观下线后,会向同样监视这个主服务器的哨兵询问是否也判定为下线状态。当包括自己在内有quorum个哨兵认为主服务器已经下线时,则这个哨兵判定主服务器客观下线了。
6、哨兵选举
判断主库客观下线后,哨兵集群需要选举一个哨兵来执行主从切换。选举的要点有:
- 每个哨兵都有机会,拿到超过半树的投票并且票数>=哨兵配置quorum。
- 认为主服务器客观下线的哨兵会先投自己一票,然后向其他哨兵发送命令,要求目标投自己,先到先得,目标哨兵(没投自己的话)投票赞成后在本轮选举会反对后续其他哨兵的当选。
- 一轮选不出则配置纪元(计数器)+1,一段时间后开始下一轮。
7、选出新的主节点(由选出的哨兵执行)
- 要在线;
- 最近5秒内回复过这个哨兵的INFO命令;
- 与主服务器连接断开时间不长(不超过down-after-milliseconds*10毫秒);
- 通过上述三点第一维度根据优先级(redis.conf里的salve-priority)高的排序,第二维度根据复制偏移量大的排序,第三维度根据运行ID小的排序;
8、故障转移
- 将slave-1脱离原从节点(PS: 5.0 中应该是replicaof no one),升级主节点。
- 将从节点slave-2指向新的主节点。
- 通知客户端主节点已更换。
- 将原主节点(oldMaster)变成从节点,指向新的主节点。
故障转移之后
9、遗留问题
(1)哨兵是从配置文件sentinel.conf里找到主服务器地址去连接的,如果哨兵挂了,在挂了期间,主服务器挂了并选取了新的主服务器。那这个哨兵怎么找到新的主节点?
(2)哨兵选举中,多久进行第二轮投票?