Redis Sentinel

Sentinel是一个管理多个Redis实例的工具,它可以实现对 Redis的监控通知自动故障转移

Sentinel 架构示意图:

主从复制的问题

主从复制可以使得从节点作为主节点的备份节点,随时替代主节点进行服务。同时作为主节点的读负载均衡。

主从复制同时存在以下几个问题:

  • 一旦主节点宕机,从节点晋升成主节点,同时需要修改应用方的 主节点地址,还需要命令所有从节点去复制新的主节点,整个过程需要人工干预
  • 主节点的写能力受到单机的限制。
  • 主节点的存储能力受到单机的限制。
  • 原生复制的弊端在早期的版本中也会比较突出,比如:Redis 复制中断后,从节点发起 psync。此时如果同步不成功,则会进行全量同步,主库执行全量备份的同时,可能会造成毫秒或秒级的卡顿。

Sentinel的作用

Sentinel是独立于主从节点的另一台服务器,主要用于:

  • 监控
    不断ping主从节点,监控主从节点的是否正常运行
  • 通知
    当主从节点出现问题时,Sentinel会主动回调配置好的脚本,脚本可以通知管理员解决问题
  • 自动故障转移
    当主节点不能正常提供服务时,Sentinel会选举一个从节点作为主节点,完成故障转移。
  • 配置提供者
    客户端应用直接连接Sentinel,从中获取主节点信息。

Sentinel通信命令

  • 与Sentinel:
命令 作用
PING Sentinel 向 Redis 节点发送 PING 命令,检查节点的状态
INFO Sentinel 向 Redis 节点发送 INFO 命令,获取它的从节点信息
PUBLISH Sentinel 向其监控的 Redis 节点 __sentinel__:hello 这个 channel发布自己的信息及主节点相关的配置
SUBSCRIBE Sentinel 通过订阅Redis主节点和从节点的__sentinel__:hello这个 channnel,获取正在监控相同服务的其他 Sentinel节点
  • 与主从节点:
命令 作用
PING Sentinel 向其他 Sentinel 节点发送 PING 命令,检查节点的状态
SENTINEL:is-master-down-by-addr 和其他 Sentinel 协商 主节点 的状态,如果 主节点 处于 SDOWN 状态,则投票自动选出新的主节点

Sentinel 工作原理

每个 Sentinel 节点都需要定期执行以下任务:

  • 每个Sentinel以每秒钟一次的频率,向它所知的主服务器、从服务器以及其他Sentinel实例发送一个 PING 命令。
  • 如果一个实例(instance)距离最后一次有效回复PING命令的时间超过down-after-milliseconds所指定的值,那么这个实例会被Sentinel标记为主观下线。
  • 如果一个 主服务器被标记为主观下线,那么正在监视这个主服务器的所有Sentinel 节点,要以每秒一次的频率确认主服务器的确进入了主观下线状态。
  • 在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率,向它已知的所有 主服务器 和 从服务器 发送 INFO 命令。当一个 主服务器 被 Sentinel 标记为 客观下线 时,Sentinel 向 下线主服务器 的所有 从服务器 发送 INFO 命令的频率,会从 10 秒一次改为 每秒一次。
  • Sentinel 和其他 Sentinel 协商 主节点 的状态,如果 主节点 处于 SDOWN 状态,则投票自动选出新的 主节点。将剩余的 从节点 指向 新的主节点 进行 数据复制。
  • 当没有足够数量的 Sentinel 同意 主服务器 下线时, 主服务器 的 客观下线状态 就会被移除。当 主服务器 重新向 Sentinel 的 PING 命令返回 有效回复 时,主服务器 的 主观下线状态 就会被移除。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章