Redis Cluster 槽(Slot)

槽 Slot

Redis集羣通過分片的方式來保存數據中的鍵值對:集羣中的數據庫被分爲16384個槽(slot),數據庫中的每個健都屬於這16384個槽的其中一個,集羣中的每個節點可以處理的0個或最多16384個槽。

當數據庫中的16384個槽都有節點在處理時,集羣處於上線狀態(ok);相反,如果數據庫中有任何一個槽沒有得到處理,那麼集羣處於下線狀態(fail)。

槽指派

通過向節點發送CLUSTER ADDSLOTS命令,可以將一個或多個槽指派(assign)給節點負責。當指派過程中有衝突,即將要指派的槽已經被指派了,則直接返回錯誤,當前指派命令不會執行。

通過CLUSTER INFO命令查看當前集羣的信息;
通過CLUSTER NODES命令查看集羣中各個節點負責的槽;
這裏寫圖片描述

記錄槽指派信息

clusterNode結構的slots屬性和numslot屬性記錄了節點負責處理哪些槽;
slots屬性是一個二進制位數組,檢索複雜度爲O(1),根據索引i上的二進制位的值來判斷節點是否負責處理槽i,1爲處理,0爲不處理;
numslot屬性記錄節點負責處理的槽的數量。

傳播節點的槽指派信息
一個節點除了會將自己負責處理的槽記錄在clusterNode結構的slots屬性和numslots屬性之外,它還會將自己的slots數組通過消息發送給集羣中的其他節點,來告知其他節點自己目前負責處理哪些槽。

因爲集羣中的每個節點都會將自己的slots數組通過消息發送給集羣中的其他節點,並且每個接收到slots數組的節點都會將數組保存到相應節點的clusterNode結構裏面,因此,集羣中的每個節點都會知道數據庫中的16384個槽分別被指派給了集羣中的哪些節點。

clusterState結構中也有一個slots數組,該數組記錄了集羣中所有16384個槽的指派信息,每個數組項都是一個指向clusterNode結構的指針。
這裏寫圖片描述

clusterState.slots數組記錄了集羣中所有槽的指派信息,而clusterNode.slots數組只記錄了clusterNode結構所代表的節點的槽指派信息,當檢索時前者效率高。後者存在的必要:當程序需要將某個節點的槽指派信息發送給其他節點時可以直接使用clusterNode.slots數組信息。

集羣中執行命令-槽指向

在對數據庫中的16384個槽都進行了指派後,集羣就會進入上線狀態,這是客戶端就可以向集羣中的節點發送數據命令了。
這裏寫圖片描述
一個集羣客戶端通常會與集羣中的多個節點創建套接字連接,而所謂的節點轉向實際上就是換一個套接字來發送命令。

計算鍵屬於哪個槽

這裏寫圖片描述
判斷槽是否由當前節點負責處理
這裏寫圖片描述
由槽查看負責處理節點
這裏寫圖片描述
MOVED錯誤
當節點發現鍵所在的槽並非由自己負責處理的時候,節點就會向客戶端返回一個MOVED錯誤,指引客戶端轉向至正在負責槽的節點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章