集群会议
Syntax
CLUSTER MEET ip port [cluster-bus-port]
- Available since:
- 3.0.0
- Time complexity:
- O(1)
- ACL categories:
-
@admin
,@slow
,@dangerous
,
CLUSTER MEET
用于将启用了集群支持的不同 Redis 节点连接到一个工作集群中。
基本思想是,默认情况下节点之间互不信任,被视为未知,因此不太可能因为系统管理错误或网络地址修改而导致不同的集群节点混合成一个。
因此,为了让一个给定的节点接受另一个节点进入组成Redis集群的节点列表,只有两种方法:
- 系统管理员发送一个
CLUSTER MEET
命令,强制一个节点与另一个节点会面。 - 一个已知的节点在gossip部分发送了一个我们不知道的节点列表。如果接收节点信任发送节点作为已知节点,它将处理gossip部分并向仍然未知的节点发送握手。
请注意,Redis集群需要形成一个完整的网状结构(每个节点都与其他节点相连),但为了创建集群,不需要发送所有形成完整网状结构所需的CLUSTER MEET
命令。重要的是发送足够的CLUSTER MEET
消息,以便每个节点可以通过已知节点链到达其他节点。由于心跳包中八卦信息的交换,缺失的链接将被创建。
因此,如果我们通过CLUSTER MEET
将节点A与节点B连接,并将B与C连接,A和C将找到握手并创建连接的方式。
另一个例子:如果我们想象一个由以下四个节点A、B、C和D组成的集群,我们可能只需要向A发送以下一组命令:
CLUSTER MEET B-ip B-port
CLUSTER MEET C-ip C-port
CLUSTER MEET D-ip D-port
作为A
知道并被所有其他节点知道的副作用,它将在心跳包中发送gossip部分,这将允许每个其他节点彼此创建链接,在几秒钟内形成一个完整的网状结构,即使集群很大。
此外,CLUSTER MEET
不需要是相互的。如果我向 A 发送命令以加入 B,我不需要也向 B 发送命令以加入 A。
如果未提供可选的 cluster_bus_port
参数,则将使用端口 + 10000 的默认值。
实现细节:MEET 和 PING 数据包
当给定节点接收到CLUSTER MEET
消息时,命令中指定的节点仍然不知道我们发送命令的节点。因此,为了使节点强制接收者接受它作为可信节点,它发送一个MEET
数据包而不是PING
数据包。这两个数据包的格式完全相同,但前者强制接收者将该节点确认为可信节点。
RESP2/RESP3 回复
Simple string reply:OK
if the command was successful. If the address or port specified are invalid an error is returned.
历史
- 从Redis版本4.0.0开始:添加了可选的
cluster_bus_port
参数。