前言
Redis 是 NoSQL 中的一种高性能 KV 数据库,因其高性能及简单易用等特点已经广泛应用于互联网及各种企业级应用中,但 Redis 的单点故障一直是令人头疼的一个问题。为了解决这个问题,Redis 在 2.8 版本中发布了 Sentinel 来实现集群的高可用性和健壮性。
Sentinel 的应用场景
Sentinel 用于解决 Redis 集群的高可用性,主要用于监控 Redis 主节点的状态,当 Redis 主节点出现故障时能够自动进行故障转移,并确保客户端能够继续访问。
在实际生产环境中,我们常常采取 Master-Slave 架构来保证 Redis 的高可用性,但是 Redis Master 节点出现宕机时,我们需要手动将 Slave 升为 Master,操作繁琐、耗时,且容易出错。如果 Redis 集群的 Slave 较多,手动切换更加费时费力。使用 Sentinel 可以避免这一问题,它会自动感知 Redis 集群中 Master 节点的状态,并开启选举流程选择一个新的 Master 节点。
Sentinel 的优势
- 可靠的主备切换:当 Redis 的 Master 节点故障时,Sentinel 会自动将 Slave 节点中选举出的 Master 节点升级为新的 Master 节点,客户端可以继续访问 Redis。
- 能够自动发现集群中的节点,并监控这些节点的健康状态,一旦节点出现异常状态,Sentinel 会发出警报并采取措施。
- 自动选择 Master 节点,并能在 Master 节点出现故障时,立即执行 failover,将一个 Slave 节点晋升为新的 Master 节点。同时,Sentinel 能监控多个 Slave 节点,以保证故障转移后无数据丢失或数据不一致的风险。
Sentinel 的配置
Sentinel 的配置需要针对每一个 Redis 主节点进行配置,具体配置如下:
sentinel monitor <master-name> <ip> <port> <quorum>
- <master-name>:被监测的 Redis 主节点的名字;
- <ip>:被监测的 Redis 主节点的 IP 地址;
- <port>:被监测的 Redis 主节点的端口;
- <quorum>:表明 Sentinel 发现 Redis 主节点不再可用时需要多少个 Sentinel 同意,才能执行自动故障转移,该值一般为一半加一。
例如:
sentinel monitor redis-master 127.0.0.1 6379 2
以上配置表明要对 127.0.0.1:6379 这个 Redis 主节点进行监控,如 Sentinel 发现该 Redis 主节点不再可用,需要至少有两个 Sentinel 同意后,才会执行故障转移。
为了避免一个 Sentinel 故障引起整个集群的故障,我们至少需要 3 个以上 Sentinel 才能保证 Sentinel 的工作。
Sentinel 的实现
当 Sentinel 发现 Redis 主节点不可用时,它会执行如下的过程:
- Sentinel 的每个实例都会通过 INFO 命令定时获取集群中每个节点的信息,并将这些信息存储在本地的 Redis 数据库中。
- 如果 Sentinel 发现 Master 节点不可用,则它将尝试执行故障转移。故障转移的过程如下:
- 当 Sentinel 发现 Master 节点不可用时,它会向其他 Sentinel 发送一个 PING 命令,请求其他 Sentinel 检查该 Master 节点的状态。
- 如果至少获取到了 <quorum> 个 Sentinel 的响应,Sentinel 就会发起一个 Leader 选举,参加选举的 Sentinel 都会维护一个 Leader 选举的 UNIX 时间戳,UNIX 时间最小的 Sentinel 被选为 Leader。
- Sentinel 选出新的 Master 节点后,会通过配置文件 redis.conf 中的 sentinel parallel-syncs 选项控制从已经选定的 Master 节点复制数据到 Slave 节点。完成同步后,将新的 Master 节点升级为 Master。
- Sentinel 会再次将新的 Master 节点和 Slave 节点的信息保存在本地 Redis 数据库中。同时,其他 Redis 从节点会将 Master 节点的新 IP 和端口号更新到各自的复制状态记录中。
Sentinel 的示例代码
以下为使用 Node.js 实现 Sentinel 监控 Redis Master 状态的代码示例:
-- -------------------- ---- ------- --- ----- - ----------------- -------------- - ------------------------- -------- ------------ -- -- ----- ------ -- ---------------------------- -------- --------- -------- - -- -------- -- ---------------- -- ------------------------------- - --- - ------------------ ------ ---------- -- ------------- - ------------------- - -- -- ----- -- ----------- - ------------------------- ------- - --- -- ---- -------------------------------------------展开代码
以上代码实现了通过 Sentinel 监控 Redis Master 节点状态,并在 Master 节点被切换后,关闭原有 Redis 连接,建立新的连接。该示例代码仅提供参考,主要用于理解 Sentinel 监控 Redis Master 节点的基本操作。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67b98974306f20b3a67f9a69