Ⅰ 【Redis】Redis Cluster-集群數據遷移
Redis通過對KEY計算hash,將KEY映射到slot,集群中每個節點負責一部分slot的方式管理數據,slot最大個數為16384。
在集群節點對應的結構體變數clusterNode中可以看到slots數組,數組的大小為CLUSTER_SLOTS除以8,CLUSTER_SLOTS的值是16384:
clusterState
clusterNode裡面保存了節點相關的信息,集群數據遷移信息並未保存在clusterNode中,而是使用了clusterState結構體來保存:
clusterState與clusterNode的關系
在手動進行數據遷移時,需要執行以下步驟:
在進行數據遷移之前,首先在需要遷入的目標節點使用 SETSLOT 命令標記要將SLOT從哪個節點遷入到當前節點:
然後在源節點也就是slot所在節點使用 MIGRATING 命令標記將數據遷出到哪個節點:
比如slot1當前在node1中,需要將slot1遷出到node2,那麼首先在nodd2上執行 IMPORTING 命令,標記slot准備從node1遷到當前節點node2中:
然後在node1中執行 MIGRATING 命令標記slot1需要遷移到node2:
clusterCommand
SETSLOT 命令的處理在clusterCommand函數(cluster.c文件中)中:
在標記完遷入、遷出節點後,就可以使用 CLUSTER GETKEYSINSLOT 命令獲取待遷出的KEY:
<slot>:哈希槽的值
<count>:遷出KEY的數量
getkeysinslot 命令的處理也在clusterCommand函數中,處理邏輯如下:
完成上兩步之後,接下來需要在源節點中執行 MIGRATE 命令進行數據遷移, MIGRATE 既支持單個KEY的遷移,也支持多個KEY的遷移,語法如下:
migrateCommand
MIGRATE 命令對應的處理函數在migrateCommand中(cluster.c文件中),處理邏輯如下:
createDumpPayload
createDumpPayload函數在cluster.c文件中:
restoreCommand
目標節點收到遷移的數據的處理邏輯在restoreCommand中(cluster.c文件中):
數據遷移的最後一步, 需要使用 CLUSTER SETSLOT 命令,在源節點和目標節點執行以下命令,標記slot最終所屬的節點,並清除第一步中標記的遷移信息 :
<slot>:哈希槽
<node>:哈希槽最終所在節點id
clusterCommand
CLUSTER SETSLOT <slot> NODE <node> 命令的處理依舊在 clusterCommand 函數中,處理邏輯如下:
總結
參考
極客時間 - Redis源碼剖析與實戰(蔣德鈞)
Redis版本:redis-6.2.5