?
This document uses PHP Chinese website manual Release
CLUSTER SETSLOT slot IMPORTING|MIGRATING|STABLE|NODE [node-id]
自3.0.0起可用。
時間復雜度: O(1)
CLUSTER SETSLOT 負責以不同方式更改接收節(jié)點中散列槽的狀態(tài)。它可以取決于所使用的子命令:
1. MIGRATING
子命令:設置遷移狀態(tài)下的散列槽。
2. IMPORTING
子命令:在導入狀態(tài)下設置哈希槽。
3. STABLE
子命令:清除散列槽中的任何導入/遷移狀態(tài)。
4. NODE
子命令:將哈希槽綁定到不同的節(jié)點。
該命令及其子命令集對于啟動和結束集群實時重新分片操作很有用,它通過在源節(jié)點中設置遷移狀態(tài)的哈希槽以及在目標節(jié)點中導入狀態(tài)來完成。
下面介紹了每個子命令。最后你會找到如何使用這個命令和其他相關命令執(zhí)行實時重新分片的描述。
<slot>
遷移<destination-node-id>
此子命令將一個插槽設置為遷移狀態(tài)。為了在此狀態(tài)下設置一個插槽,接收命令的節(jié)點必須是散列插槽的所有者,否則會返回錯誤。
當插槽設置為遷移狀態(tài)時,節(jié)點將按以下方式更改行為:
1. 如果收到關于現(xiàn)有密鑰的命令,則通常會處理該命令。
2. 如果收到有關不存在的密鑰的命令ASK
,節(jié)點將發(fā)出重定向,要求客戶端僅重試該特定查詢destination-node
。在這種情況下,客戶端不應該將其哈希槽更新為節(jié)點映射。
3. 如果命令包含多個鍵,如果不存在,則行為與點2相同(如果全部存在),則與點1相同,但如果只存在部分鍵數(shù),則該命令將按TRYAGAIN
順序發(fā)出錯誤對于有興趣完成遷移到目標節(jié)點的密鑰,以便可以執(zhí)行多密鑰命令。
<slot>
導入<source-node-id>
此子命令反轉MIGRATING
并準備目標節(jié)點以從指定的源節(jié)點導入密鑰。該命令僅適用于節(jié)點尚不是指定散列槽的所有者的情況。
當插槽在導入狀態(tài)下設置時,節(jié)點以下列方式更改行為:
1. 關于這個散列槽的命令將被拒絕,并且MOVED
通常會生成重定向,但是在命令跟在命令后面的ASKING
情況下,將執(zhí)行該命令。這樣,當處于遷移狀態(tài)的節(jié)點生成ASK
重定向時,客戶端會聯(lián)系目標節(jié)點ASKING
發(fā)送命令并立即發(fā)送命令。通過這種方式命令舊節(jié)點中不存在的密鑰或已遷移到目標節(jié)點的密鑰在目標節(jié)點中執(zhí)行,以便:
2. 新密鑰始終在目標節(jié)點中創(chuàng)建。在散列槽遷移期間,我們必須只移動舊密鑰,而不是新密鑰。
3. 為了保證一致性,已經(jīng)遷移的關鍵字命令在作為遷移目標的節(jié)點(新散列槽所有者)的上下文中正確處理。
4. 沒有ASKING
這種行為就像平時一樣。這可以確保具有散列槽插入映射的客戶端不會在目標節(jié)點中寫入錯誤,從而創(chuàng)建尚未被遷移的新版本密鑰。
<slot>
穩(wěn)定此子命令僅清除插槽中的遷移/導入狀態(tài)。它主要用于修復被錯誤狀態(tài)redis-trib fix
卡住的簇。通常在遷移結束時使用SETSLOT ... NODE ...
子命令自動清除這兩個狀態(tài),如下一節(jié)所述。
<slot>
節(jié)點<node-id>
NODE
子命令是具有最復雜語義的子命令。它將哈希槽與指定節(jié)點相關聯(lián),但該命令僅在特定情況下起作用,并且根據(jù)槽狀態(tài)具有不同的副作用。以下是該命令的一組前置條件和副作用:
1. 如果當前哈希槽所有者是接收命令的節(jié)點,但為了實現(xiàn)該命令,該槽將被分配給不同的節(jié)點,如果在接收該命令的節(jié)點中仍存在該哈希槽的密鑰,則該命令將返回錯誤。
2. 如果插槽處于遷移狀態(tài),則當插槽分配給另一個節(jié)點時,該狀態(tài)將被清除。
3. 如果插槽在接收命令的節(jié)點中處于導入狀態(tài),并且該命令將該插槽分配給該節(jié)點(在從一個節(jié)點到另一個節(jié)點的散列插槽重新分割結束時發(fā)生在目標節(jié)點中),則該命令具有以下副作用:A)導入狀態(tài)被清除。B)如果節(jié)點配置歷元還不是最大的群集,它會生成一個新的配置歷元,并為其自身分配新的配置歷元。這樣,其新的哈希槽所有權將勝過以前的故障轉移或槽遷移創(chuàng)建的任何過去的配置。
需要注意的是,步驟3是 Redis 集群節(jié)點在未經(jīng)其他節(jié)點同意的情況下創(chuàng)建新配置歷元的唯一時間。這僅在手動配置運行時發(fā)生。然而,這是不可能的,因為 Redis 集群使用配置時期沖突解決算法,所以這會創(chuàng)建一個非瞬時設置,其中兩個節(jié)點具有相同的配置時期。
簡單字符串回復:OK
如果命令成功,則所有子命令都會返回。否則會返回錯誤。
CLUSTER SETSLOT 命令是 Redis Cluster 使用的一個重要組件,用于將一個哈希槽中包含的所有密鑰從一個節(jié)點遷移到另一個節(jié)點。這就是遷移如何在其他命令的幫助下進行編排的。我們將調用當前散列槽所有權的source
節(jié)點以及我們想要遷移destination
節(jié)點的節(jié)點。
1. 使用CLUSTER SETSLOT <slot> IMPORTING <source-node-id>
將目標節(jié)點插槽設置為導入狀態(tài)。
2. 使用CLUSTER SETSLOT <slot> MIGRATING <destination-node-id>
將源節(jié)點插槽設置為遷移狀態(tài)。
3. 使用 CLUSTER GETKEYSINSLOT 命令從源節(jié)點獲取密鑰,并使用 MIGRATE 命令將它們移動到目標節(jié)點中。
4. 使用CLUSTER SETSLOT <slot> NODE <destination-node-id>
源或目標。
注意:
步驟1和2的順序很重要。我們希望目標節(jié)點ASK
在源節(jié)點配置為重定向時準備好接受重定向。
步驟4在技術上不需要使用SETSLOT
在不涉及重新分割的節(jié)點中使用,因為配置最終會自我傳播,但是這樣做是一個好主意,以便阻止節(jié)點在被移動的散列插槽時指向錯誤的節(jié)點盡快,導致更少的重定向找到正確的節(jié)點。