【Redis】叢集
阿新 • • 發佈:2019-02-08
Redis 資料分割槽
Redis Cluster 採用虛擬槽分割槽,所有鍵根據雜湊函式對映到 0 - 16383 整數槽內,每一個節點負責維護一部分槽以及槽所對映的鍵值資料
特點:
- 解耦資料和節點之間的關係,簡化了節點擴容和收縮難度
- 節點自身維護槽的對映關係,不需要客戶端或者代理服務維護槽分割槽元資料
- 支援節點、槽、鍵之間的對映查詢,用於資料路由、線上伸縮等場景
叢集功能限制
- key 批量操作支援有限,對於mset、mget等操作可能存在多個節點因此不被支援
- key 事務操作支援有限,只支援多key在同一節點上的事務操作
- key 作為資料分割槽的最小粒度,不能講一個大的鍵值物件(hash、list)對映到不同節點
- 不支援多資料庫空間,叢集下Redis只能使用一個數據庫空間
- 複製結構只支援一層,從節點只能複製主節點,不支援巢狀樹狀複製結構
搭建叢集
準備節點
- 每個節點開啟配置
cluster-enabled yes
- 啟動6個節點
節點握手
- 由客戶端發起命令
cluster meet {ip} {port}
- 對節點分別執行
cluster nodes
命令,各節點可以感知彼此存在 - 檢視叢集當前狀態
cluster info
分配槽
- 通過
cluster addslots
命令為節點分配槽 - 使用
cluster replicate {nodeId}
命令節點複製對應的主節點
節點通訊
通訊流程
Redis 採用P2P的Gossip協議維護元資料
- 叢集中每個節點都開闢一個TCP通道,用於節點之間彼此通訊
- 每個節點在固定週期內通過特定規則選擇幾個節點發送ping訊息
- 接收到ping訊息的節點用pong訊息作為響應
Gossip訊息
- meet訊息:用於通知新節點加入
- ping訊息:叢集內每個節點每秒向多個其它節點發送,檢測節點是否線上
- pong訊息:作為響應訊息回覆給傳送方確認訊息正常通訊
- fail訊息:當節點判定叢集內另一個節點下線,會想叢集內廣播一個fail訊息
節點選擇
- 選擇傳送訊息的節點數量:每秒執行10次,隨機選取5個節點找到最久沒有通訊節點發送ping訊息
- 訊息資料量:每個ping訊息 訊息頭佔用2KB左右,訊息體視叢集節點數量
叢集伸縮
擴容叢集
- 準備新節點:準備2個新節點,保持和叢集內配置一致,啟動節點
- 加入叢集:在叢集內任意節點執行
cluster meet ip port
- 遷移槽和資料:制定槽遷移計劃,用命令進行資料遷移,新增從節點
收縮叢集
- 下線遷移槽:把負責的槽遷移到其它節點
- 忘記節點:通知叢集內其它節點忘記下線節點,當其它節點忘記後則可關閉
請求路由
請求重定向
- 計算槽:根據鍵的有效部分使用CRC16函式計算出雜湊值,再取對16383的餘數,使每個鍵都可以對映到 0 - 16383 槽範圍內
- 槽節點查詢:Redis計算得到的鍵對應的槽後,需要查詢槽對應的節點。叢集內通過訊息交換每個節點都會知道所有節點的槽資訊
Smart 客戶端
- Smart客戶端通過在內部維護 slot —> node 的對映關係,本地就可以實現鍵到節點的查詢,從而保證IO效率的最大化
- MOVED 重定向負責協助Smart客戶端更新 slot —> node 對映
ASK 重定向
- 客戶端ASK重定向流程,ASK重定向說明叢集正在slot資料遷移
- 節點內部處理:檢查是否正在遷出;批量操作會受到影響
故障轉移
故障發現
- 主觀下線:節點a內的定時任務檢測到與節點b的最後通訊時間超過cluster-node-timeout,則更新本地對節點b的狀態為主觀下線
- 客觀下線:當某個節點判斷另一節點主觀下線後,節點狀態會在叢集內傳播,當半數以上持有槽的主節點都標記主觀下線,觸發客觀下線流程
故障恢復
- 資格檢查:根據從節點與主節點斷線時間判斷是否具備故障轉移資格
- 準備選舉時間:符合故障轉移資格後,更新故障選舉時間,達到時間後執行後續流程
- 發起選舉:更新配置紀元、廣播選舉訊息
- 選舉投票:只有持有槽的主節點才會處理故障選舉訊息
- 替換主節點:當前從節點變成主節點,撤銷故障主節點的槽,把這些槽委派給自己,然後向叢集廣播自己的訊息