Sentinel是一个管理多个Redis实例的工具,它可以实现对 Redis的监控、通知、自动故障转移。
Sentinel 架构示意图:
image.png主从复制的问题
主从复制可以使得从节点作为主节点的备份节点,随时替代主节点进行服务。同时作为主节点的读负载均衡。
主从复制同时存在以下几个问题:
- 一旦主节点宕机,从节点晋升成主节点,同时需要修改应用方的 主节点地址,还需要命令所有从节点去复制新的主节点,整个过程需要人工干预。
- 主节点的写能力受到单机的限制。
- 主节点的存储能力受到单机的限制。
- 原生复制的弊端在早期的版本中也会比较突出,比如: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 命令返回 有效回复 时,主服务器 的 主观下线状态 就会被移除。
网友评论