1. 为什么需要故障转移?
想象你正在运营一个日活百万的电商平台,某个凌晨3点主Redis节点突然宕机。如果没有故障转移机制,整个购物车和秒杀系统将瞬间崩溃——这就是故障转移存在的核心价值。在分布式系统中,故障转移如同消防通道,平时看似无用,关键时刻能救命。
2. Redis Sentinel工作机制详解
我们以Redis 6.2版本为例,搭建包含3个Sentinel节点的监控系统:
port 6379
requirepass "MasterPassword123"
masterauth "MasterPassword123"
# 从节点1配置(redis-replica1.conf)
port 6380
replicaof 127.0.0.1 6379
masterauth "MasterPassword123"
# Sentinel节点配置(sentinel1.conf)
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster MasterPassword123
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
关键参数解析:
down-after-milliseconds
:判定节点不可达的超时阈值(毫秒)quorum
:达成故障判定所需的最小Sentinel数量parallel-syncs
:故障转移后允许同时同步的新从节点数
3. 完整故障转移流程演示
(使用Redis-CLI进行实际操作)
# 查看主从拓扑
redis-cli -h 127.0.0.1 -p 26379 sentinel master mymaster
# 模拟主节点宕机
redis-cli -h 127.0.0.1 -p 6379 DEBUG SEGFAULT
# 观察Sentinel日志(关键事件标记)
[1] +sdown master mymaster 127.0.0.1 6379 # 主观下线
[2] +odown master mymaster 127.0.0.1 6379 # 客观下线
[3] +try-failover master mymaster # 开始故障转移
[4] +vote-for-leader # 领导者选举
[5] +failover-state-select-slave # 选择新主节点
[6] +promoted-slave # 提升从节点
[7] +switch-master # 完成切换
# 验证新主节点
redis-cli -h 127.0.0.1 -p 26379 sentinel get-master-addr-by-name mymaster
4. 关联技术:主从复制优化策略
故障转移依赖健康的主从复制,推荐使用PSYNC2协议:
# 查看复制状态
redis-cli -h 127.0.0.1 -p 6380 info replication
# 关键指标监控
connected_slaves:2 # 在线从节点数量
master_repl_offset:28765 # 主节点复制偏移量
slave_repl_offset:28765 # 从节点复制偏移量(应与主节点一致)
5. 生产环境最佳实践
某金融系统部署方案:
- 跨机房的3个Sentinel节点(奇数个避免脑裂)
- 主从节点使用不同物理服务器
- 配置TCP Keepalive防止网络闪断误判
- 启用
min-slaves-to-write
确保数据安全
# 主节点安全写入配置
min-slaves-to-write 1
min-slaves-max-lag 10
6. 技术对比:Sentinel vs Cluster
特性 | Sentinel方案 | Cluster方案 |
---|---|---|
数据分片 | 不支持 | 自动分片 |
扩容复杂度 | 需要手动调整 | 支持动态扩容 |
客户端兼容性 | 所有客户端支持 | 需要特殊客户端 |
故障转移速度 | 5-10秒 | 15-30秒 |
7. 常见故障场景处理
案例:网络分区导致脑裂
# 隔离异常节点
redis-cli -h problem-node --cluster failover --force
# 人工介入检查数据一致性
redis-check-aof --fix appendonly.aof
redis-check-rdb --fix dump.rdb
8. 监控指标体系建设
推荐Prometheus监控模板:
- name: Redis_Sentinel
rules:
- alert: SentinelQuorumLost
expr: redis_sentinel_ok_sentinels < 2
for: 5m
- alert: MasterDown
expr: redis_sentinel_master_is_down == 1
annotations:
summary: "Redis主节点不可用"
9. 注意事项与避坑指南
- 时钟同步:所有节点必须使用NTP同步时间
- 配置同步:确保所有Sentinel配置完全一致
- 版本兼容:主从节点大版本差异不超过2个
- 资源预留:故障转移期间内存可能增长30%
10. 总结与展望
通过Sentinel实现的故障转移,我们已经成功为某物流系统将故障恢复时间从小时级缩短到秒级。随着Redis7.0推出的Raft协议改进,未来故障转移将实现更高的自动化程度。建议关键系统同时部署主动健康检查与被动故障转移的双重保障机制。