CLUSTER FORGET

从节点表中删除一个节点。

语法

CLUSTER FORGET node-id

引入版本:3.0.0

复杂度摘要:O(1)

该命令用于从接收该命令的 Redis 集群节点的已知节点集中删除由其节点 ID 指定的节点。换句话说,指定的节点从接收命令的节点的节点表中删除。

因为当给定节点是集群的一部分时,参与集群的所有其他节点都知道它,为了将节点从集群中完全删除,必须将 CLUSTER FORGET 命令发送到所有剩余节点,无论它们是主节点还是副本节点。

但是,该命令不能简单地从接收命令的节点的内部节点表中删除该节点,它还实现了一个禁止列表,不允许再次添加同一节点,这是处理从其他节点接收到的心跳数据包的八卦部分的副作用。

从 Redis 7.2.0 开始,禁止列表包含在集群八卦 ping/pong 消息中。这意味着 CLUSTER FORGET 不需要发送到集群中的所有节点。您可以在一个或多个节点上运行该命令,之后在大多数情况下该命令会传播到其余节点。

必需参数

node-id

要从集群的当前节点视图中删除的节点的 ID。

详细说明

为何需要禁止名单的详细信息

在下面的示例中,我们将展示为什么该命令不仅必须从节点表中删除给定节点,而且还要防止它在一段时间内再次重新插入。

假设我们有四个节点 A、B、C 和 D。为了以只有三个节点的集群 A、B、C 结束,我们可以遵循以下步骤:

  1. 将 D 的所有哈希槽重新分片到节点 A、B、C。
  2. D 现在为空,但仍列在 A、B、C 的节点表中。
  3. 我们联系A,并发送CLUSTER FORGET D。
  4. B 向节点 A 发送心跳包,其中列出节点 D。
  5. A 不再认识节点 D(参见步骤 3),因此它开始与 D 握手。
  6. D端重新添加到A的节点表中。

正如您所看到的,通过这种方式删除节点是脆弱的,我们需要尽快向所有节点发送 CLUSTER FORGET 命令,希望同时没有八卦部分处理。由于这个问题,该命令实现了一个禁止列表,其中每个条目都有一个过期时间。

所以该命令真正做的是:

  1. 指定的节点从节点表中删除。
  2. 被删除节点的节点ID被添加到禁止列表中,持续1分钟。
  3. 该节点在处理从其他节点收到的心跳包中的 gossip 部分时,将跳过禁止列表中列出的所有节点 ID。

这样我们就有了 60 秒的窗口来通知集群中的所有节点我们要删除节点。

不允许执行命令的特殊情况

以下情况命令不成功并返回错误:

  1. 在节点表中找不到指定的节点ID。
  2. 接收命令的节点是副本,指定的节点 ID 标识其当前的主节点。
  3. 节点 ID 标识我们向其发送命令的同一节点。

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis
Cloud
说明
❌ 标准
❌主动-主动
❌ 标准
❌主动-主动

返回值

RESP2

简单字符串回复:如果命令执行成功,则为 OK。否则返回错误。

RESP3

简单字符串回复:如果命令执行成功,则为 OK。否则返回错误。

资料来源:Redis 官方 CLUSTER FORGET 文档;中文内容参考 Redis 文档许可。