1. Sentinel 在非集群模式的定位
一句話:在單主多從架構中,用 Sentinel 替你盯哨——探測故障、選舉新主、通知客戶端。
核心四職能:
職能 | 作用點 |
---|---|
Monitoring | 定時 PING 主從,自身也互相探測 |
Notification | 通過日志/PubSub/外部調用報警 |
Automatic Failover | ODOWN→投票→復位→新主上線 |
Configuration Provider | 客戶端調用 SENTINEL get-master-addr-by-name 獲取實時主節點 |
2. Sentinel × Redis 的一致性模型
- SDOWN:單個 Sentinel 主觀判斷節點掛了
- ODOWN:≥
quorum
個 Sentinel 一致認定 → 觸發選舉 - 選舉:需獲得 多數派 授權(≥ ?N/2?),否則不切換(防止腦裂)
- 配置紀元(epoch):每次切換都會加 1,保證最終只有“最新紀元”版本存活 → 所有 Sentinel 自動收斂
結論:Sentinel 提供 最終一致,寫丟失窗口取決于異步復制加上網絡分區時長,可用
min-replicas-*
做上限控制。
3. 最小可行部署(MCR = Master / Clone Replica)
3.1 經典“三箱三哨”
┌─────────┐ ┌─────────┐ ┌─────────┐
│ M1 + S1 │───│ R2 + S2 │───│ R3 + S3 │
└─────────┘ └─────────┘ └─────────┘
quorum = 2
- 容忍 1 臺機器或 1 個 Sentinel 宕機
- 客戶端須配置 所有 Sentinel 地址,建議連接池輪詢
3.2 五節點增強 & 跨 AZ
- 3 × Redis(1 主 2 從)+ 5 × Sentinel
quorum = 3
-> 允許 2 臺 Sentinel 掛掉- 建議 “2 主機 + 1 從機” 在不同可用區,提高容災級別
4. sentinel.conf 常用參數拆解
指令 | 說明 & 推薦 |
---|---|
sentinel monitor <name> <ip> <port> <quorum> | 監控主;名字唯一 |
sentinel down-after-milliseconds | 建議 5 ~ 10 s(視網絡 RTT) |
sentinel failover-timeout | 默認為 3 min;影響重新選主冷卻期 |
sentinel parallel-syncs | 建議 1 或 2,避免同步洪峰 |
sentinel announce-ip / announce-port | Docker/NAT 必配,否則自動發現失效 |
sentinel auth-user / auth-pass | Redis >= 6 ACL 模式專用 |
resolve-hostnames / announce-hostnames | 若需 TLS + SAN 校驗,可開啟 |
啟動:
redis-server sentinel.conf --sentinel
(不帶 conf 會拒絕啟動)
5. 故障檢測 & 自動切換流程
- Replica 選擇策略:
replica-priority
最小 > offset 最大 > runid 字典序 - TILT 模式:當系統時鐘漂移或事件循環堵塞 > 2 s,通過 30 s“冷靜期”保護錯判
6. 客戶端實戰
// Lettuce 示例
RedisClient client = RedisClient.create();
StatefulRedisConnection<String, String> conn =client.connect(RedisURI.Builder.sentinel("10.0.0.1", 26379).withSentinel("10.0.0.2", 26379).withSentinel("10.0.0.3", 26379).withSentinelMasterId("mymaster").build());
- 超時:設置
readTimeout
≥down-after-milliseconds
- 自動刷新:Lettuce/Redisson 有內置監聽
+switch-master
事件
7. Docker / NAT 注意事項
癥狀 | 根因 | 解決 |
---|---|---|
Sentinel 互聯失敗 | 26379 被映射 | --net host 或 announce-port |
Replica 列表 IP 錯誤 | 內部 IP 暴露 | replica-announce-ip 指定外部可達地址 |
8. 安全加固(ACL vs requirepass)
場景 | Sentinel → Redis | 客戶端 → Sentinel |
---|---|---|
ACL 推薦 | sentinel auth-user/-pass 指定 sentinel-user | 給 Sentinel 創建最小權限用戶(只允許 PING/INFO/SENTINEL …) |
老版本 | sentinel auth-pass <mymaster> pwd | requirepass pwd ;客戶端需先 AUTH |
9. 運行時調參 & 擴縮容
# 新增監控
SENTINEL MONITOR orders 10.0.0.8 6379 3# 修改 down-after 毫秒
SENTINEL SET mymaster down-after-milliseconds 8000# 移除異常 Sentinel
SENTINEL RESET *
溫馨提示:改動需在 所有 Sentinel 上同步執行,否則紀元不一致會導致短暫混亂。
10. 常見問題速查
現象 | 排查指令 | 解決方案 |
---|---|---|
頻繁切主 | SENTINEL master mymaster 查看 last-ping-reply | 調大 down-after-milliseconds ;排查網絡抖動 |
切主成功客戶端依舊連舊 IP | 檢查客戶端庫是否監聽 +switch-master | 升級/開啟 Sentinel 模式 |
Docker 集群 failover 失敗 | +sentinel 日志缺失 | announce-ip/port 配置錯誤 |
寫丟失 | 比對 offset | 開啟 min-replicas-* 、業務側做重試 |
結語
Redis Sentinel 為單主多從提供了“開箱即用”的 HA 能力,但也引入了一定的復雜度(最終一致、多節點配置同步等)。在 關鍵業務 場景中,務必:
- 三哨起步,跨故障域部署
- 加 ACL / TLS / 防火墻 做多層防護
- 定期在預生產 演練 failover,驗證應用與運維鏈路可用
- 用
min-replicas-to-write
將數據丟失窗口限制在可接受范圍
這樣才能真正發揮 Sentinel 的價值,而不是在凌晨三點被“驚喜”叫醒。