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)哨兵选举中,多久进行第二轮投票?

posted @ 2020-11-15 00:19  守林鸟  阅读(330)  评论(0编辑  收藏  举报