流程
????在對數(shù)據(jù)庫中的16384個槽都進行了指派之后,集群就進入上線狀態(tài)了,這時客戶端就可以向集群中的節(jié)點發(fā)送數(shù)據(jù)命令了
????當客戶端向節(jié)點發(fā)送與數(shù)據(jù)庫鍵有關(guān)的命令時,接收命令的節(jié)點會計算出命令要處理的數(shù)據(jù)庫鍵屬于哪個槽,并且檢查這個槽是否指派給了自己:
(1)如果鍵所在的槽正好就指派給了當前節(jié)點,那么節(jié)點直接執(zhí)行這個命令。
(2)如果鍵所在的槽并沒有指派給當前節(jié)點,那么節(jié)點會向客戶端返回一個MOVED錯誤,指引客戶端轉(zhuǎn)向(redirect)至正確的節(jié)點,并再次發(fā)送之前想要執(zhí)行的命令。
image.png
計算屬于哪個槽
使用的算法:
def slot number(key):
return CRC16(key) & 16383
????CRC用于計算key的校驗和,&16383語句則用于計算出一個介于0到16383之間的證書作為key的槽號。
????使用CLUSTER KEYSLOT <key>命令可以查看一個給定的鍵屬于哪個槽。
槽是否由當前的節(jié)點負責(zé)處理?
????這時候節(jié)點會檢查自己在clusterState.slots數(shù)組中的項i,判斷鍵所在的槽是否由自己負責(zé)。
image.png
MOVED錯誤
????當節(jié)點發(fā)現(xiàn)鍵所在的槽并非由自己負責(zé)處理的時候,節(jié)點就會向客戶端返回一個MOVED錯誤,指引客戶端轉(zhuǎn)向正在負責(zé)的槽的節(jié)點。
MOVED錯誤的格式:
MOVED<slot><ip>:<port>
????例如MOVED 10086 127.0.0.1:7000,表示槽10086正由ip地址127.0.0.1端口是7000的節(jié)點負責(zé)。
????下圖是MOVED的流程
image.png
注意:集群模式下的redis-cli客戶端在接收到MOVED錯誤的時候,不會打印出MOVED錯誤,而是直接根據(jù)MOVED錯誤的信息自動轉(zhuǎn)向,并打印出轉(zhuǎn)向信息。
$ redis-cli -e-p 7000 #集群模式
127.0.0.1:7001> SET msg"happy new year!"->Redirected to slot [6257)located at 127.0.0.1:7001
ok
????但是如果我們使用單機模式的redis-cli客戶端,MOVED錯誤會直接打印出來,因為單機模式的客戶端不知道MOVED錯誤的作用,不會進行轉(zhuǎn)向。
$ redis-cli -p 7000 #單機模式
127.0.0.1:7001> SET msg "happy new year!"
(error)MOVED 6257 127.0.0.1:7001


