Redis叢集通過分片(sharding)進行資料共享,並提供複製和故障轉移功能。
節點
一個Redis叢集由多個node組成,連線各節點的命令格式如下:
CLUSTER MEET
127.0.0.1:7000> CLUSTER MEET 127.0.0.1 7001
槽指派
Redis叢集通過分片的方式來儲存鍵值對:叢集的整個資料庫被分為16384的槽(slot)。
通過CLUSTER ADDSLOTS命令,可以將一個或多個槽指派給節點負責:
CLUSTER ADDSLOTS [slot ...]
127.0.0.1:7000> CLUSTER ADDSLOTS 0 1 2 3 4 ... 5000
OK
執行命令將槽0-5000指派給節點7000負責
記錄節點的槽指派資訊
slots屬性是一個二進位制位陣列,陣列長度為16384/8=2048個位元組,共包含16384個二進位制位。
為什麼是16384個?
因為節點之間需要經常互相傳送心跳等資訊,其中就槽位也是包含在內的,取一箇中間值16384能在一定程度
上減少訊息的大小,又減少了資料不均衡的問題。
計算鍵屬於哪個槽
節點使用 CRC16(key) & 16383 計算出一個 0-16383之間的整數作為鍵key的槽號。
但是,如果計算出來的槽值不能由當前節點處理,那麼,該節點會向客戶端返回MOVED錯誤,指引客戶端轉向可
以處理的節點。
MOVED 10086 127.0.0.1:7002
表示槽10086正由127.0.0.1:7002節點負責。
節點資料庫實現
單機和節點的區別:節點只能使用0號資料庫。
淘汰策略是一樣的,從過期key裡淘汰最久未使用的key,volatile-LRU。
重新分片
客戶端訪問key時,key所屬的槽如果正在從舊節點轉移到新節點,會發送ask錯誤(隱藏的)。
複製與故障轉移
Redis叢集節點分為master和slave,如果主節點下線,會選擇一個從節點作為新的主節點。
設定從節點
CLUSTER REPLICATE <node_id>
可以讓接收命令的節點變成從節點(和複製反命令過來了)
故障轉移
當一個從節點發現自己正在複製的主節點下線了,從節點開始對下線主節點進行故障轉移,以下步驟:
- 被選中的從節點會執行SLAVEOF no one命令,成為新的主節點。
- 將槽指派給自己。
- 新主節點向叢集廣播發送PONG訊息,昭告天下。
選舉新的主節點
和領頭哨兵選舉類似,都是基於Raft演算法實現的。(見Redis哨兵)
Reference
《Redis設計與實現》