Redis集羣是Redis提供的分佈式數據庫方案,集羣通過sharding
分片來進行數據共享,並提供複製和故障轉移功能。
對集羣的節點、slot、命令執行、重新分片、轉向、故障轉移、消息等各方面介紹。
17.1 節點
一個Redis集羣通常由多個節點node
組成,在剛開始的時候,每個節點都是相互獨立的,他們都出於一個只包含自己的集羣當。
17.1.1 啓動節點
一節節點就是一個reis服務器。
17.1.2 集羣數據結構
clusterNode結構保存了一個節點的當前狀態、創建時間名字、配置epoch、節點ip端口號和地址等。
17.1.3 CLUSTER MEET命令的實現
相當於區域連通,會通知其他同區域的node。
17.2 槽指派
Redis集羣通過分片方式來保存數據的鍵值對:集羣的整個數據庫被分爲16384個槽slot。
CLUSTER ADDSLOTS
槽分配。
17.2.1 記錄節點的槽指派信息
二進制 2048字節 16384個二進制位,如果爲1表示該節點處理該槽位。
17.2.2 傳播節點的槽指派信息
告訴自己的職責numslot
和slots
屬性
17.2.4 CLUSTER ADDSLOTS 命令的實現
17.3 在集羣中執行命令
17.3.1 計算鍵屬於哪個槽
CRC 校驗
17.3.2 判斷槽是否由當前節點處理
如果是就執行否就轉發
實際上就是一致性哈希。
17.3.4 節點數據庫的實現
保存的方式以及過期的方式跟單機Redis的方式相同。
節點只能使用0號數據庫。
17.4 重新分片
重新分片實現原理
redis-trib
負責執行,redis-trib對單個slot分片步驟如下。
17.5 ASK錯誤
重新分片過程中的查找。
17.5.1 CLUSTER SETSLOT IMPORTING 命令的實現
17.5.2 CLUSTER SETSLOT MIGRATING 命令的實現
記錄了當前節點正在遷移至其他節點的槽。
17.5.3 ASK錯誤
17.5.4 ASKING命令
17.5.5 ASK錯誤和MOVED錯誤的區別。
兩者都會導致客戶端轉向,他們區別在於:
1、moved負責全從一個節點到另外一個節點。
2、ask不會記錄信息
17.6 複製和故障轉移
17.6.1 設置從節點
CLUSTER REPLCATE NODE_ID
17.6.2 故障檢測
17.6.3 故障轉移
17.6.4 選舉先的主節點
17.7 消息
meet
消息、ping
消息、pong
消息、fail
消息、publish
消息。
17.8 重點回顧
- 槽就是一致性哈希
- 計算槽值
- moved錯誤和ask錯誤
- 重定向
- 故障轉移和故障檢測
- 主節點選舉
- 消息