Redis 哨兵

发布时间 2023-09-06 22:56:46作者: 亚雷啊

redis 哨兵

哨兵

1. 哨兵的作用

检查Master和Slave是否运作正常,实现主从节点故障转移。
它会监测主节点是否存活,如果发现主节点挂了,它就会选举一个从节点切换为主节点,并且把新主节点的相关信息通知给从节点和客户端。
  1. 监控

  2. 选主

  3. 通知

    哨兵节点每隔1s向所有主从节点发送ping命令,节点收到后会进行响应
    哨兵

    如果哨兵节点在down-after-milliseconds 时间内未收到节点A响应,则将A节点认定为主观下线

    通过哨兵集群(3个以上),多个哨兵对A节点状态进行投票,可以避免单个哨兵因网络引起的误判情况。
    在票数达到quorum时,哨兵节点认定A节点为客观下线.

    quorum的计算公式为:quorum = (哨兵节点数/2) + 1
    哨兵投票节点下线

哨兵leader

选举leader需要先有候选者
候选者就是判断哪个节点下线的哨兵

成为leader规则

  1. 获得一半以上的投票
  2. 票数要大于等于quorum

哨兵投票规则

  1. 候选者只能投给自己
  2. 普通哨兵只会给收到的第一个候选者投票

投票示例

redis 1主4从,5个哨兵

  1. quorum = 3,2个哨兵故障
    • 可以判断节点客观下线,此时剩余3个正常哨兵,哨兵判断节点主观掉线,此时还有2个正常节点,投票数量可以达到quorum(3),即可认定节点客观下线
    • 可以完成主从节点切换,此时还有3个正常节点,候选者投票数量可以达到3,满足获选规则1和2,成为leader,完成主从切换
  2. quorum=2,3个哨兵故障
    • 可以判断节点客观下线,但无法完成主从切换,无法满足选举规则2

主从故障转移

redis主从故障转移流程

  1. 筛选网络情况稳定redis从节点
  2. 客观下线的主节点GG属下的所有节点挑选出新的主节点N(**)
  3. 通知所有其他从节点,修改复制节点为新节点N
  4. 将新的主节点的信息,通过[pub/sub]告诉客户端
  5. 哨兵继续监听GG,当GG恢复后,将GG设置为新主节点N的从节点

筛选节点

down-after-milliseconds * 10 配置项
如果在down-after-millisecondsms未连接,视作断连,如果次数超过10次,认定该从节点网络状况较差,不适合作为新的主节点

主节点选取

主从节点筛选流程

  1. 优先级

设置redis节点配置文件的slave-priority,根据服务器性能配置,如物理内存等。

  1. 优先级相同,比较复制偏移量offset,偏移量高的靠前

主节点通过master_repl_offset记录最新写操作在repl_backlog_buffer环形缓存区的位置,从节点会使用slave_repl_offset记录当前复杂进度

主从复制内部缓存

  1. 前两者相同,选节点id小的

每个redis节点都有一个唯一ID用于标识从节点

更新主节点状态标识

  1. 筛选出新的主节点后,哨兵leader会向主节点发送slaveof no one更新节点身份为主节点

哨兵leader更新主节点标识

发送slaveof no one命令后,哨兵leader每1s向新主节点发送info命令,查看节点是否顺利更新为主节点

新主节点状态更新成功

  1. 让所有从节点指向新的主节点,哨兵leader向所有其他从节点发送slaveof ip port命令,让所有从节点指向新的主节点
    从节点更新主节点信息

通知客户端主节点已更新

哨兵leader向所有客户端发送pub/sub消息,通知主节点已更新

节点状态更新通知

主从切换完成后,哨兵就会向 +switch-master 频道发布新主节点的 IP 地址和端口的消息,这个时候客户端就可以收到这条信息,然后用这里面的新主节点的 IP 地址和端口进行通信了。

哨兵集群

哨兵集群搭建需要知道主节点信息,然后通过订阅消息频道获取从节点和其他哨兵节点信息

哨兵集群通信

sentinel monitor <master-name> <ip> <redis-port> <quorum> 

哨兵节点之间是通过 Redis 的发布者/订阅者机制来相互发现的。

在主从集群中,主节点上有一个名为__sentinel__:hello的频道,不同哨兵就是通过它来相互发现,实现互相通信的

哨兵获取从节点信息