【redis】哨兵机制(上)

一、引入

 我们都知道在主从复制下,如果一个主服务器宕机了,不能继续提供服务,所以这时候,我们需要人工将节点晋升为主节点,并且需要通知其他的应用更新节点,但是如果这种故障转移的处理方式是我们最不想看到的,但是值得高兴地是Redis从2.8开始,引进了哨兵机制,然后将上述过程变成了自动化,大大方便了我们,提供了效率和准确性;

二、是什么?

 Sentinel(哨兵)进程是用于监控redis集群中Master主服务器工作的状态;在Master主服务器发生故障的时候,可以实现Master和Slave服务器的切换,保证系统的高可用(HA);
【redis】哨兵机制(上)

三、功能

  1. 监控:Sentinel节点会定期检测Redis数据节点、其余的Sentinel节点是否可达;
  2. 通知:Sentinel节点会将故障转移的结果通知给应用方;
  3. 主节点故障转移:从节点晋升到主节点并维护后续正确的主从关系;
  4. 配置提供者:在Redis Sentinel初始化时,客户端是在初始化的时候连接的是Sentinel节点集合,重置获取主节点信息;

四、工作原理

【redis】哨兵机制(上)

  1. 每个Sentinel(哨兵)进程以每秒钟一次的频率向整个集群中的Master主服务器,Slave从服务器以及其他Sentinel(哨兵)进程发送一个 PING 命令。
  2. 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel(哨兵)进程标记为主观下线(SDOWN)
  3. 如果一个Master主服务器被标记为主观下线(SDOWN),则正在监视这个Master主服务器的所有 Sentinel(哨兵)进程要以每秒一次的频率确认Master主服务器的确进入了主观下线状态。
  4. 当有足够数量的 Sentinel(哨兵)进程(大于等于配置文件指定的值)在指定的时间范围内确认Master主服务器进入了主观下线状态(SDOWN), 则Master主服务器会被标记为客观下线(ODOWN)
  5. 在一般情况下, 每个 Sentinel(哨兵)进程会以每 10 秒一次的频率向集群中的所有Master主服务器、Slave从服务器发送 INFO 命令。
  6. 当Master主服务器被 Sentinel(哨兵)进程标记为客观下线(ODOWN)时,Sentinel(哨兵)进程向下线的 Master主服务器的所有 Slave从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。
  7. 若没有足够数量的 Sentinel(哨兵)进程同意 Master主服务器下线, Master主服务器的客观下线状态就会被移除。若 Master主服务器重新向 Sentinel(哨兵)进程发送 PING 命令返回有效回复,Master主服务器的主观下线状态就会被移除。

五、故障转移处理

  1. 主节点发生故障,客户端连接主节点失败,然后从节点与主节点连接失败,造成主从复制中断;如下图;
    【redis】哨兵机制(上)

  2. 每个Sentinel节点通过定期监控发现主节点出现故障;

  3. 多个Sentinel节点对主节点的故障达成一致,然后选举出sentinel-3节点作为领导者复制故障转移;

  4. 原来的从节点成为新的主节点,然后更新客户端的主节点信息,并且重新启动客户端;
    【redis】哨兵机制(上)

  5. 客户端命令另外一个从节点(slave2)去复制新的主节点(new master);并且如果原来的主节点回鹘后,他再去复制新的主节点;
    【redis】哨兵机制(上)
    【redis】哨兵机制(上)

  6. 故障转以后的Redis Sentinel拓扑结构
    【redis】哨兵机制(上)