1. Sentinel 概述
负责处理客户端写入操作。
• 从服务器
用于读取操作,并作为主服务器的备份。
• Sentinel 服务器
负责监控主服务器和从服务器的健康状况,并在主服务器出现故障时进行自动故障转移。
• 监控
Sentinel 会持续不断地检查主服务器和从服务器是否运行正常。
• 通知
当被监控的某个 Redis 服务器出现问题时,Sentinel 可以通过 API 向管理员或其他应用程序发送通知。
• 自动故障迁移
当一个主服务器不能正常工作时,Sentinel 会开始自动故障迁移操作,它会将失效的主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器。
3. 架构设计
1. 分布式监控体系
主节点信息及从节点列表。 其他Sentinel节点状态。 当前主客观下线状态。
T_propagation ≤ (N-1) * T_gossip
主观下线(SDOWN):单个Sentinel判定节点不可达。 客观下线(ODOWN):超过quorum数量的Sentinel确认不可达。
4. Sentinel 配置步骤
[Client] -> [Sentinel集群]
↘
[Redis Master] <- [Redis Slave]*3
2. Sentinel 配置
# 监控的主服务器信息
sentinel monitor mymaster 127.0.0.1 6379 2
# Sentinel 配置
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 10000
3. 客户端连接策略
Java客户端示例(Jedis):
JedisSentinelPool pool = new JedisSentinelPool(
"mymaster", Set.of("sentinel1:26379", "sentinel2:26379"),
poolConfig);
4. Sentinel 常用命令
• SENTINEL get-master-addr-by-name <master-name>:查询主服务器的 IP 地址和端口。
• SENTINEL masters:列出所有主服务器的信息。
• SENTINEL slaves <master-name>:列出指定主服务器的所有从服务器。
• SENTINEL sentinels <master-name>:列出监控指定主服务器的所有 Sentinel。
• SENTINEL reset <master-name>:重置 Sentinel 对指定主服务器的监控。
5. Sentinel 高可用性
1. 部署多个 Sentinel 实例
2. 故障转移核心算法
Sentinel 之间使用一种选举机制来确定哪一个 Sentinel 将执行故障转移操作。这通常基于 Raft 或类似的选举算法来确保一致性。
领导者选举
使用Raft算法变种实现分布式共识,选举过程时间复杂度为O(N)。关键参数:
sentinel parallel-syncs <master-name> <num>
sentinel failover-timeout <master-name> <milliseconds>
故障转移流程
(1). Sentinel 发现主服务器不可达,主节点被标记为客观下线。
数据一致性保障
采用异步复制+故障转移时数据保护策略:
min-slaves-to-write 3
min-slaves-max-lag 10
6. 高可用集群优化实践
1. 脑裂防护策略
网络分区场景下的处理:
# 设置保护模式
protected-mode yes
# 调整副本有效性检测
replica-validity-factor 10
2. 性能优化参数
# 故障转移超时控制
sentinel failover-timeout 180000
# 并行同步数量
sentinel parallel-syncs 2
3. 监控指标体系
关键监控项:
7. 多机房容灾方案
1. 跨地域部署模型
机房A: [Master] + [Sentinel]*2
机房B: [Slave] + [Sentinel]*1
机房C: [Slave] + [Sentinel]*1
2. 流量调度策略
基于ZooKeeper的拓扑感知路由:
def get_master():
zk = KazooClient()
master = zk.get("/redis/mymaster/master")
return parse_address(master)
8. 版本演进与最佳实践
1. 版本兼容矩阵
9. Sentinel 的优缺点
自动故障转移:在主节点故障时,自动切换到从节点,无需人工干预。 降低运维成本:通过自动化机制减少了运维工作量。 高可用性:通过监控和故障转移机制,确保系统在故障时仍能提供服务。 易于集成:Sentinel 可以轻松地与现有的 Redis 客户端集成,无需修改现有应用程序代码。
数据丢失风险:由于 Redis 主从复制是异步的,故障转移可能导致部分数据丢失。 无法解决写操作负载均衡:Sentinel 模式仍然依赖单个主节点进行写操作。 脑裂问题:在极端情况下,可能会出现网络分区导致的脑裂问题。 网络延迟:由于数据复制和 Sentinel 之间的通信,可能会增加一些网络延迟。 资源消耗:Sentinel 本身也需要一定的计算资源,尤其是在监控大量节点的情况下。
