cluster meet
CLUSTER
CLUSTER MEET ip port
自3.0.0起可用。
时间复杂度:
O(1)
CLUSTER MEET 用于将启用了群集支持的不同 Redis 节点连接到工作群集。
其基本思想是,默认情况下节点不相互信任,并且被认为是未知的,因此,由于系统管理错误或网络地址修改,不同的集群节点不太可能混合成一个集群节点。
因此,为了给定节点接受另一个节点进入组成 Redis 集群的节点列表,只有两种方法:
1. 系统管理员发送 CLUSTER MEET 命令强制节点与另一个节点相遇。
2. 一个已知的节点在八卦部分发送一个我们不知道的节点列表。如果接收节点将发送节点信任为已知节点,则它将处理八卦部分,并向尚未知的节点发送握手。
请注意,Redis 群集需要形成完整的网格(每个节点
与其他节点
相连),但为了创建群集,不需要发送形成完整网格所需的所有 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.
实现细节:MEET 和 PING 数据包
当给定节点收到 CLUSTER MEET
消息时,命令中指定的节点仍然不知道我们发送命令的节点。因此,为了使节点强制接收方接受它作为可信节点,它会发送一个MEET
数据包而不是 PING 数据包。这两个数据包的格式完全相同,但前者强制接收方将节点确认为可信。
返回值
简单的字符串回复:OK
如果命令成功。如果指定的地址或端口无效,则返回错误。