目錄
-
Redis 集群(Cluster)概述
-
Cluster 的工作原理
-
Cluster 配置與部署
-
Cluster 常見問題與限制
-
Redis Sentinel(哨兵)機制概述
-
Sentinel 的工作機制
-
Sentinel 配置與部署
-
Sentinel vs Cluster
-
總結
Redis 集群(Cluster)概述
Redis Cluster 是 Redis 提供的一種 分布式部署方案,用來在多個 Redis 實例之間分散數據,實現 高可用性 和 橫向擴展能力。
核心特性
- 數據自動分片(Sharding)
- 無中心架構,所有節點互為平等
- 內置故障轉移機制
- 支持主從復制
Cluster 的工作原理
節點結構
- 主節點(Master):負責處理讀寫請求并保存部分數據槽。
- 從節點(Slave):復制主節點數據,用于故障轉移。
- 一個集群至少需要 3 個主節點,推薦每個主節點配備一個從節點,即至少 6 個節點。
分片機制(Slot)
- Redis 集群總共定義了 16384 個槽(slots)。
- 每個主節點負責一部分 slot(例如 0-5460,5461-10922,10923-16383)。
- 客戶端根據
CRC16(key) mod 16384
計算鍵屬于哪個 slot,自動路由到正確節點。
讀寫流程
- 客戶端發送請求 → Redis 客戶端庫計算 slot → 發送到對應主節點。
- 如果請求發錯了節點,返回
MOVED
或ASK
重定向。 - 從節點可以設置為 只讀(readonly) 以分擔主節點壓力。
故障轉移
- 集群內部通過 Gossip 協議 相互探測。
- 多個節點確認主節點不可用時,觸發 failover。
- 從節點被提升為主節點,重新分配 slots。
Cluster 配置與部署
示例配置(redis.conf)
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
創建集群命令
redis-cli --cluster create \127.0.0.1:7000 127.0.0.1:7001 \127.0.0.1:7002 127.0.0.1:7003 \127.0.0.1:7004 127.0.0.1:7005 \--cluster-replicas 1
Cluster 常見問題與限制
限制 | 描述 |
---|---|
不支持多 key 跨 slot 操作 | 除非 key 屬于相同 hash tag(例如 {user:1}.name ) |
不支持事務(multi/exec) | 跨節點事務不被支持 |
部署復雜度較高 | 運維和擴容需注意數據重分布 |
Redis Sentinel(哨兵機制)概述
Sentinel 是 Redis 的高可用解決方案,主要用于主從結構下的自動故障轉移和系統監控。
Sentinel 提供以下功能:
- 自動故障檢測
- 主從切換(Failover)
- 通知機制(通過 API)
- 動態配置更新
Sentinel 的工作機制
節點發現
- 哨兵節點通過配置文件中指定的主節點地址,自動發現主從關系。
- 多個 Sentinel 節點之間通過協議通信,形成分布式監控網絡。
故障檢測
-
每個 Sentinel 定期向主從節點發送
PING
。 -
判斷標準:
- 主觀下線(sdown):單個 Sentinel 判斷主節點不可達。
- 客觀下線(odown):多個 Sentinel 達成一致后認定故障。
主從切換(Failover)
-
在主節點故障并確認 odown 后,進行如下步驟:
- 選擇一個從節點為新的主節點。
- 其他從節點重新指向新的主節點。
- 通知所有客戶端更新配置。
通知機制
- Sentinel 支持發布訂閱機制,可以通知外部系統故障或切換事件。
- 也可以通過 Sentinel API 查詢當前狀態。
Sentinel 配置與部署
sentinel.conf 示例
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
啟動 Sentinel
redis-sentinel sentinel.conf
CLI 命令示例
redis-cli -p 26379 sentinel get-master-addr-by-name mymaster
Sentinel vs Cluster
特性 | Sentinel | Cluster |
---|---|---|
數據分片 | ? 不支持 | ? 支持 |
主從架構 | ? 支持 | ? 支持 |
高可用 | ? 自動故障轉移 | ? 自動故障轉移 |
部署復雜度 | ? 簡單 | ?? 較復雜 |
跨節點事務 | ? 支持 | ? 不支持 |
場景推薦 | 小型部署,高可用 | 大規模數據分布式 |
總結
項目 | Cluster | Sentinel |
---|---|---|
高可用 | ? | ? |
自動切換 | ? | ? |
分布式擴展 | ? | ? |
實現機制 | 分片 + 主從 | 主從 + 哨兵 |
使用復雜度 | 高 | 低 |
客戶端兼容性 | 特殊支持(支持 cluster 的客戶端) | 普通客戶端即可 |