0%

redis---高可用

概述

复制

复制是高可用 Redis 的基础,哨兵 和 集群 都是在 复制基础 上实现高可用的。复制主要实现了数据的多机备份以及对于读操作的负载均衡
缺点: 故障恢复无法自动化、写操作无法负载均衡、存储能力受到单机的限制

哨兵

在复制的基础上,哨兵实现了 自动化故障恢复
缺点: 写操作无法负载均衡、存储能力受到单机的限制

集群

解决了 写操作无法负载均衡、存储能力受到单机的限制

Sentinel

监控主服务器及其从服务器, 当主服务器下线时, 自动将某个从服务器升级为主服务器; 此外, sentinel还会继续监视下线的服务器, 等到它重新上线时, 将其设置为新的主服务器的从服务器.

命令

客户端可以对sentinel服务器执行的全部命令

  • ping
  • sentinel
  • info
  • subscribe / unsubscribe
  • psubscribe / punsubscribe (模式订阅)

工作原理

节点发现 初始配置

sentinel只需要配置主服务器的地址信息, 通过info获得从服务器信息, 通过订阅__sentinel__:hello频道获取其他sentinel节点信息

  1. 根据配置获取所监视的主服务器的地址, 向其创建两个异步网络连接

    • 命令连接: 用于向服务器发送命令, 接受命令
    • 订阅连接: 订阅服务器的 __sentinel__:hello 频道
  2. sentinel默认以每十秒一次的频率, 向主服务器发送 info 命令; 通过回复, 可得知主服务器具体信息, 以及从服务具体信息

    • 若从服务对应实例已存在, sentinel会对从服务器的实例结构进行更新
    • 若不存在, 则说明是新发现的从服务器, sentinel会创建新实例结构, 并创建订阅连接以及命令连接
  3. sentinel默认以每十秒一次的频率, 向从服务器发送info命令, 得到从服务具体信息, 并更新其实例.

  4. sentinel默认以两秒一次的频率, 向所监控的服务器
    publish __sentinel__:hello sentinel的ip:port 配置纪元, 目标服务器的ip:port 配置纪元
    则所有监控该服务器的sentinel节点都会收到这条信息
    sentinel pub/sub

  5. 当一个Sentinel接收到其他Sentinel发来的信息时,目标Sentinel会从信息中分析并提取出以下两方面参数:

    • 与Sentinel有关的参数:源Sentinel的IP地址、端口号、运行ID和配置纪元。
    • 与主服务器有关的参数:源Sentinel正在监视的主服务器的名字、IP地址、端口号和配置纪元。

    因此, 监视同一个主服务器的sentinel节点可以自动发现对方, 而无需配置

  6. 当一个sentinel发现新的sentinel时, 会创建其实例, 以及命令连接

    sentinel之间不会创建订阅连接
    sentinel连接

自动化故障恢复

  1. Sentinel会以每秒一次的频率向所有与它创建了命令连接的实例(包括主服务器、从服务器、其他Sentinel在内)发送PING命令

    • 有效回复:实例返回+PONG、-LOADING、-MASTERDOWN三种回复的其中一种
  2. 若在 down-after-milliseconds 时间内没有得到有效回复, 则sentinel标识该服务器为 主观下线状态

  3. 判断为主观下线后, 会询问其他sentinel节点; 当该sentinel接收到超过 quorum 数量的主观下线判断后, 就会判定为 客观下线.

  4. 当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个Sentinel会进行协商,选举出一个领头Sentinel,并由领头Sentinel对下线主服务器执行故障转移操作

  5. 故障转移操作主要分为三步:

    1. 在已下线主服务器属下的所有从服务器里面,挑选出一个从服务器,并将其转换为主服务器。

      1
      2
      发送 slave of no one 命令
      并频繁info, 当返回的信息的role从slave变为master, 代表升级成功
    2. 让已下线主服务器属下的所有从服务器改为复制新的主服务器。

      1
      发送 slave of 主服务器ip 主服务器port
    3. 将已下线主服务器设置为新的主服务器的从服务器,当这个旧的主服务器重新上线时,它就会成为新的主服务器的从服务器。

      集群