一、主從復制 (Master-Slave Replication)
1. 基本概念
主從復制是Redis最簡單的集群模式,由一個主節點(Master)和一個或多個從節點(Slave)組成。
2. 工作原理
-
數據同步:從節點啟動時會向主節點發送SYNC命令,主節點執行BGSAVE生成RDB文件并發送給從節點
-
命令傳播:主節點將寫命令持續發送給從節點,保持數據同步
-
全量/增量同步:初次連接為全量同步,斷線重連后可能使用增量同步(PSYNC)
3. 優缺點
-
優點:
-
讀寫分離,提高讀性能
-
數據冗余,提高數據安全性
-
故障恢復相對簡單
-
-
缺點:
-
主節點故障需要手動切換
-
寫操作仍然集中在主節點
-
全量同步時網絡開銷大
-
二、哨兵模式 (Sentinel)
1. 基本概念
哨兵是Redis的高可用解決方案,由一個或多個哨兵節點監控主從集群,實現自動故障轉移。
2. 核心功能
-
監控:持續檢查主從節點是否正常運行
-
通知:當被監控節點出現問題時,向管理員發送警報
-
自動故障轉移:主節點故障時,自動將一個從節點升級為主節點
-
配置提供者:為客戶端提供最新的主節點地址
3. 工作原理
3.1. 監控機制
每個哨兵節點會:
-
每秒一次向所有主從節點和其他哨兵節點發送PING命令
-
如果實例在配置的
down-after-milliseconds
時間內沒有有效回復,該實例會被標記為"主觀下線"(SDOWN) -
當足夠數量的哨兵(通常需要quorum數量)都將主節點標記為"主觀下線"時,主節點會被標記為"客觀下線"(ODOWN)
3.2. 故障轉移流程
-
選舉領頭哨兵: 當主節點被判定為客觀下線時,哨兵節點會通過Raft算法選舉出一個領頭哨兵(leader)來負責故障轉移
-
選擇新主節點: 領頭哨兵會根據以下規則從從節點中選擇新的主節點:
-
優先級高的(由
slave-priority
配置) -
復制偏移量大的
-
運行ID小的
-
-
提升新主節點: 將選中的從節點提升為主節點
-
重新配置從節點: 讓其他從節點改為復制新的主節點
-
通知客戶端: 通知客戶端主節點已變更
-
舊主節點處理: 如果舊主節點重新上線,會被配置為新主節點的從節點
4. 優缺點
-
優點:
-
自動故障轉移,提高可用性
-
監控功能完善
-
配置管理自動化
-
-
缺點:
-
寫操作仍然單點
-
故障轉移期間可能出現數據丟失
-
集群規模較大時管理復雜
-
三、Cluster集群模式
1. 基本概念
Redis Cluster是Redis的分布式解決方案,通過數據分片(Sharding)實現水平擴展。
2. 核心特性
-
數據分片:使用哈希槽(16384個slot)分配數據
-
高可用:每個分片有主從復制
-
去中心化:節點間通過Gossip協議通信
3. 工作原理
3.1. 哈希槽分配
-
當集群啟動時,所有哈希槽(0-16383)需要被分配到各個節點上。每個節點負責存儲分配給它的哈希槽中的鍵值對。
-
例如,一個包含6個節點的集群,可以將哈希槽分配如下:
-
節點1:0-5460
-
節點2:5461-10922
-
節點3:10923-16383
-
節點4、5、6作為從節點,分別復制節點1、2、3的數據。
-
3.2. 數據訪問
-
客戶端在訪問集群時,需要通過哈希槽來定位數據所在的節點。客戶端會根據鍵的哈希值計算出對應的哈希槽,然后根據哈希槽的分配情況找到對應的節點。
-
如果客戶端訪問的鍵所在的節點發生故障,客戶端會自動重試,直到找到新的主節點。
3.2. 故障轉移
-
Gossip協議
-
節點間通過TCP端口(默認集群端口=客戶端端口+10000)通信
-
每秒隨機選擇幾個節點進行PING/PONG消息交換
-
包含的集群元數據:
-
節點列表和角色
-
槽位分配信息
-
節點狀態(正常/疑似下線/已下線)
-
-
-
故障檢測
-
節點A標記節點B為"疑似下線"(PFAIL)
-
通過Gossip協議傳播狀態
-
當多數主節點確認B下線,標記為"已下線"(FAIL)
-
觸發故障轉移
-
3.2. 數據遷移
-
在集群運行過程中,如果需要對哈希槽進行重新分配(例如添加或移除節點),Redis集群支持在線遷移。
-
數據遷移過程是逐步進行的,不會阻塞集群的正常運行。遷移完成后,哈希槽的分配會更新,客戶端會根據新的分配情況訪問數據。
4. 優缺點?
-
優點:
-
真正的分布式,支持水平擴展
-
部分節點故障不影響整體服務
-
自動故障轉移
-
-
缺點:
-
不支持多數據庫(只能使用db0)
-
批量操作受限(需所有key在同一slot)
-
事務限制(所有key必須在同一節點)
-
遷移大key可能影響性能
-
四、三種模式對比
特性 | 主從復制 | 哨兵模式 | Cluster集群 |
---|---|---|---|
數據分布 | 全量復制 | 全量復制 | 分片(16384 slots) |
寫擴展性 | 單點寫入 | 單點寫入 | 多主節點寫入 |
讀擴展性 | 支持 | 支持 | 支持 |
故障轉移 | 手動 | 自動 | 自動 |
客戶端復雜度 | 簡單 | 中等 | 復雜 |
適用場景 | 讀多寫少 | 需要高可用 | 大規模數據 |
五、選擇建議
-
主從復制:適合讀多寫少,對可用性要求不高的場景
-
哨兵模式:需要高可用且數據量不大的場景
-
Cluster集群:數據量大、需要水平擴展和高可用的場景
實際生產中,Redis Cluster是當前最推薦的集群方案,特別是對于大規模部署。