CLUSTER MEET

语法
CLUSTER MEET ip port [cluster-bus-port]
可用版本
Redis Open Source 3.0.0
时间复杂度
O(1)
ACL 分类
@admin, @slow, @dangerous,

CLUSTER MEET 用于连接已启用集群支持的不同 Redis 节点,以形成一个工作集群。

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

因此,要使一个给定节点接受另一个节点加入构成 Redis 集群的节点列表,只有两种方式

  1. 系统管理员发送 CLUSTER MEET 命令,强制一个节点与另一个节点会合。
  2. 一个已知节点在成员列表部分发送我们未知节点的列表。如果接收节点信任发送节点为已知节点,它将处理成员列表部分并向仍然未知的节点发送握手信号。

注意,Redis Cluster 需要形成一个全连接网络(每个节点都与其他每个节点相连),但为了创建集群,无需发送所有构建全连接网络所需的 CLUSTER MEET 命令。关键是发送足够的 CLUSTER MEET 消息,使得每个节点都能通过一个由已知节点组成的链到达其他节点。通过心跳包中交换成员列表信息,缺失的连接将会被创建。

因此,如果我们通过 CLUSTER MEET 将节点 A 与节点 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 参数,则将使用端口 + 10000 的默认值。

实现细节:MEET 和 PING 包

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

RESP2/RESP3 回复

简单字符串回复:如果命令成功则为 OK。如果指定的地址或端口无效,则返回错误。

历史

  • 从 Redis 版本 4.0.0 开始:增加了可选的 cluster_bus_port 参数。
评价此页面
回到顶部 ↑