CLUSTER MEET

用法
CLUSTER MEET ip port [ cluster-bus-port ]
复杂度
O(1)
始于
3.0.0
ACL 类别
@admin, @dangerous, @slow

CLUSTER MEET 用于将启用了集群支持的不同 Valkey 节点连接成一个可工作的集群。

基本思想是,节点默认互不信任,并被视为未知节点,因此不同的集群节点不太可能因为系统管理错误或网络地址修改而混入单个集群中。

因此,一个给定节点要将另一个节点接受到组成 Valkey 集群的节点列表中,只有两种方式:

  1. 系统管理员发送 CLUSTER MEET 命令以强制一个节点与另一个节点会合。
  2. 一个已知的节点在八卦(gossip)部分发送我们不了解的节点列表。如果接收节点信任发送节点为已知节点,它将处理八卦部分并向仍未知的节点发送握手请求。

请注意,Valkey 集群需要形成一个全连接网格(每个节点都与其他节点连接),但为了创建集群,无需发送所有形成全连接网格所需的 CLUSTER MEET 命令。重要的是发送足够的 CLUSTER MEET 消息,以便每个节点可以通过一个已知节点链到达其他每个节点。通过心跳包中八卦信息的交换,缺失的连接将会被创建。

因此,如果我们将节点 A 通过 CLUSTER MEET 与节点 B 连接,再将 B 与 C 连接,那么 A 和 C 将会找到彼此握手并创建连接的方式。

另一个例子:如果我们想象一个由以下四个节点 A、B、C 和 D 组成的集群,我们只需向 A 发送以下命令集:

  1. CLUSTER MEET B-ip B-port
  2. CLUSTER MEET C-ip C-port
  3. CLUSTER MEET D-ip D-port

由于 A 知道所有其他节点并被它们所知,它将在心跳包中发送八卦部分,这将允许每个其他节点与彼此创建连接,从而在几秒钟内形成一个全连接网格,即使集群规模很大。

此外,CLUSTER MEET 命令无需是双向的。如果我向 A 发送命令以加入 B,我无需再向 B 发送命令以加入 A。

如果未提供可选的 cluster_bus_port 参数,将使用默认的 port + 10000。

实现细节:MEET 和 PING 包

当一个给定节点收到 CLUSTER MEET 消息时,命令中指定的节点仍然不知道我们发送命令的目标节点。因此,为了强制接收者将其接受为受信任的节点,它会发送一个 MEET 包而不是 PING 包。这两种包的格式完全相同,但前者强制接收者将该节点确认为受信任的。

RESP2/RESP3 回复

简单字符串回复:如果命令成功则返回 OK。如果端口或集群总线端口号超出范围,或者指定了无效地址,则返回错误。

历史

版本 变更
4.0.0

添加了可选的 cluster_bus_port 参数。