?
This document uses PHP Chinese website manual Release
CLUSTER FORGET node-id
自3.0.0起可用。
時(shí)間復(fù)雜度: O(1)
該命令用于從接收命令的 Redis 群集節(jié)點(diǎn)的已知節(jié)點(diǎn)集合中刪除通過(guò)節(jié)點(diǎn) ID 指定的節(jié)點(diǎn)。換句話說(shuō),從接收命令的節(jié)點(diǎn)的節(jié)點(diǎn)表中刪除指定的節(jié)點(diǎn)。
因?yàn)楫?dāng)給定節(jié)點(diǎn)是群集的一部分時(shí),參與群集的所有其他節(jié)點(diǎn)都知道它,為了將節(jié)點(diǎn)從群集中徹底刪除,必須將 CLUSTER FORGET 命令發(fā)送到所有其余節(jié)點(diǎn),無(wú)論他們是主人或奴隸。
然而,該命令不能簡(jiǎn)單地從收到該命令的節(jié)點(diǎn)的內(nèi)部節(jié)點(diǎn)表中刪除該節(jié)點(diǎn),它也實(shí)現(xiàn)禁止列表,不允許再次添加同一節(jié)點(diǎn)作為處理心跳分組的八卦部分的副作用從其他節(jié)點(diǎn)收到。
在下面的例子中,我們將說(shuō)明為什么該命令不能僅從節(jié)點(diǎn)表中移除給定的節(jié)點(diǎn),而是要阻止它再次被重新插入一段時(shí)間。
假設(shè)我們有四個(gè)節(jié)點(diǎn),A,B,C 和 D。為了僅以三個(gè)節(jié)點(diǎn)集群 A,B,C 結(jié)束,我們可以按照以下步驟操作:
1. 重新整理從 D 到節(jié)點(diǎn) A,B,C的 所有散列槽。
2. D 現(xiàn)在是空的,但仍列在 A,B 和 C 的節(jié)點(diǎn)表中。
3. 我們聯(lián)系 A,并發(fā)送CLUSTER FORGET D
。
4. B 向節(jié)點(diǎn) A 發(fā)送心跳數(shù)據(jù)包,其中列出了節(jié)點(diǎn) D.
5. A不再知道節(jié)點(diǎn)D(見(jiàn)步驟3),所以它開(kāi)始與D握手。
6. D 端重新添加到 A 的節(jié)點(diǎn)表中。
正如你所看到的那樣,刪除一個(gè)節(jié)點(diǎn)是脆弱的,我們需要發(fā)送 CLUSTER FORGET 命令給所有的節(jié)點(diǎn),希望在此期間沒(méi)有處理八卦部分。由于這個(gè)問(wèn)題,該命令為每個(gè)條目實(shí)施一個(gè)帶有過(guò)期時(shí)間的禁止列表。
那么該命令真正的作用是:
1. 指定的節(jié)點(diǎn)將從節(jié)點(diǎn)表中刪除。
2. 刪除的節(jié)點(diǎn)的節(jié)點(diǎn) ID 被添加到禁止列表中,持續(xù)1分鐘。
3. 在處理來(lái)自其他節(jié)點(diǎn)的心跳包中收到的八卦部分時(shí),節(jié)點(diǎn)將跳過(guò)禁止列表中列出的所有節(jié)點(diǎn) ID。
這樣我們有一個(gè)60秒的窗口來(lái)通知群集中的所有節(jié)點(diǎn)我們要?jiǎng)h除一個(gè)節(jié)點(diǎn)。
該命令不成功,并在以下情況下返回錯(cuò)誤:
1. 節(jié)點(diǎn)表中找不到指定的節(jié)點(diǎn)標(biāo)識(shí)。
2. 接收命令的節(jié)點(diǎn)是從屬節(jié)點(diǎn),并且指定的節(jié)點(diǎn)ID標(biāo)識(shí)其當(dāng)前主節(jié)點(diǎn)。
2. 節(jié)點(diǎn) ID 標(biāo)識(shí)了我們發(fā)送命令的同一個(gè)節(jié)點(diǎn)。
簡(jiǎn)單的字符串回復(fù):OK
如果命令執(zhí)行成功,否則返回錯(cuò)誤。