?
This document uses PHP Chinese website manual Release
CLUSTER FAILOVER [FORCE|TAKEOVER]
自3.0.0起可用。
時間復雜度: O(1)
該命令只能發(fā)送到 Redis 集群從節(jié)點,強制從節(jié)點啟動其主節(jié)點的手動故障轉(zhuǎn)移。
手動故障轉(zhuǎn)移是一種特殊的故障轉(zhuǎn)移,通常在沒有實際故障時執(zhí)行,但我們希望以安全的方式將當前主控與其中一個從屬(這是我們發(fā)送命令的節(jié)點)交換,沒有任何數(shù)據(jù)丟失的窗口。它的工作原理如下:
1. 奴隸告訴主人停止處理來自客戶的查詢。
2. 主站使用當前復制偏移量答復從站。
3. 從服務(wù)器等待復制偏移量與其匹配,以確保它在繼續(xù)處理之前處理來自主服務(wù)器的所有數(shù)據(jù)。
4. 從站啟動故障轉(zhuǎn)移,從大多數(shù)主站獲得新的配置時期,并廣播新配置。
5. 舊的主服務(wù)器接收配置更新:取消阻止其客戶端并開始使用重定向消息進行回復,以便他們繼續(xù)與新主服務(wù)器聊天。
這樣,客戶端就會以原子方式從舊主控制器移動到新主控制器,并且只有當變成新主控制器的從控制器才處理來自舊主控制器的所有復制流時。
命令行為可以通過兩個選項進行修改:FORCE 和 TAKEOVER。
如果給出 FORCE 選項,則從站不會與主站進行任何握手,但可能無法到達,而是從第4點開始盡快啟動故障切換。這對于我們希望在主站點啟動手動故障切換時非常有用不再可達。
但是,使用 FORCE,我們?nèi)匀恍枰蠖鄶?shù)主設(shè)備可用,以授權(quán)故障切換并為將成為主設(shè)備的從設(shè)備生成新的配置時期。
有些情況下,這是不夠的,我們希望奴隸故障轉(zhuǎn)移與群集的其他部分沒有任何協(xié)議。一個真實世界的用例就是在不同的數(shù)據(jù)中心大量推銷奴隸,以便掌握數(shù)據(jù)中心交換機,而所有主數(shù)據(jù)中心都被關(guān)閉或分區(qū)。
TAKEOVER 選項意味著一切 FORCE 意味著,但也不會為了使用故障轉(zhuǎn)移群集的任何授權(quán)。取而代之的CLUSTER FAILOVER TAKEOVER
是奴隸收到:
1. 生成一個新的configEpoch
單方面,只是采取當前最大的紀元可用,并增加它,如果它的本地配置時代還不是最大的。
2. 為其主節(jié)點的所有散列槽分配自己,并將新配置傳播到每個可以盡快到達的節(jié)點,并最終傳播到每個其他節(jié)點。
請注意,TAKEOVER 違反了 Redis 集群的最后一次故障切換贏得原則,因為從屬設(shè)備生成的配置時期違反了以下幾種方式正常生成配置時期:
1. 不能保證它實際上是更高的配置時期,因為例如我們可以在少數(shù)中使用 TAKEOVER 選項,也不會執(zhí)行任何消息交換來生成新的配置時期。
2. 如果我們生成一個碰巧與另一個實例發(fā)生沖突的配置時期,那么最終我們的配置時期或另一個具有相同時期的實例將會使用配置時期沖突解決算法移走。
因此,應(yīng)小心使用 TAKEOVER 選項。
CLUSTER FAILOVER,除非指定了 TAKEOVER 選項,否則不會同步執(zhí)行故障轉(zhuǎn)移,它僅調(diào)度手動故障轉(zhuǎn)移,繞過故障檢測階段,因此為了檢查是否真的發(fā)生了故障轉(zhuǎn)移,應(yīng)該使用 CLUSTER NODES 或其他方法驗證在發(fā)送命令一段時間后群集的狀態(tài)是否發(fā)生更改。
簡單字符串回復:OK
如果該命令被接受并且將嘗試手動故障轉(zhuǎn)移。如果操作無法執(zhí)行,例如,如果我們正在與已經(jīng)是主節(jié)點的節(jié)點交談,則會出錯。