使用网关构建超级集群
网关
网关能够将一个或多个集群连接成一个全网状网络;它们允许将较小的集群组成超级集群。集群和网关协议在不同的端口上进行监听。集群功能用于相邻服务器之间的连接;网关则用于将集群彼此连接在一起。
网关的配置与集群配置类似:
- 网关有一个专用端口,用于监听网关连接请求
- 网关通过 Gossip 协议交换网关节点和远程发现的网关信息
与集群不同,网关:
- 具有名称,用于指定它们所属的集群
- 不在网关节点之间形成全网状连接,而是在集群之间形成全网状连接
- 受单向连接的限制
- 不使用 Gossip 协议 向客户端交流网关节点信息
网关的存在是为了:
- 减少服务器之间所需的连接数量
- 优化兴趣图的传播
如果要在集群中使用网关,该集群的所有服务器都需要具有网关配置,并且配置使用相同的名称。 此外,每个网关节点都需要能够连接到任何其他网关节点,反之亦然。任何其他情况都被视为配置错误。
网关连接
处于网关角色的 nats-server 会指定一个端口用于接受网关连接。如果配置中指定了其他的 外部 gateways,则该网关会为其配置中的每个网关创建一个出站网关连接。它还会通过 Gossip 协议传播它已知或发现的其他网关信息。配置较少的 外部 gateways 意味着配置更简单。然而,发现更多网关和网关节点的能力取决于这些服务器的运行状态。这与集群中的 种子服务器 类似。建议在 gateways 部分列出集群的所有 种子服务器。
如果本地集群有三个网关节点,这意味着本地集群到每个外部网关集群将会有三条出站连接。
在上面的示例中,集群 A 配置了到 B 的网关连接(实线)。B 发现了到 A 的网关连接(虚线)。请注意,出站连接的数量始终与同名网关的数量相匹配。
在第二个示例中,同样使用实线表示配置的连接,使用虚线表示发现的网关连接。网关 A 和 C 都是通过 Gossip 协议发现的;B 发现了 A,A 发现了 C。
上述描述中的一个关键点是,集群中的每个节点将与每个远程集群中的单个节点建立一个连接——这与集群协议不同,在集群协议中,每个节点都直接连接到所有其他节点。
对于喜欢数学的读者,集群连接数是 N(N-1)/2,其中 N 是集群中的节点数。在网关配置中,出站连接数是 Ni(M-1) 的总和,其中 Ni 是网关 i 中的节点数,M 是网关的总数。入站连接数是 U-Ni 的总和,其中 U 是所有网关中所有网关节点的总和,N 是网关 i 中的节点数。计算结果表明,入站和出站连接数是相同的。
使用集群协议与使用网关连接集群所需的连接数差异很快就能显现出来。对于 3 个集群,每个集群 N 个节点的情况:
网关不一定需要集群配置部分,它们也可以在单服务器环境下工作。然而,当参与的集群由多个服务器组成时,它们才开始发挥其作用,并且它们减少了连接数量。
兴趣传播
来自直接连接到网关节点的客户端的消息,将根据以下两种兴趣传播机制,通过出站网关连接发送:
- 仅兴趣模式
- 队列订阅
在本地兴趣允许的情况下,接收方网关节点将消息直接转交给订阅它的客户端以及集群内的服务器。
仅兴趣模式
网关 A 仅发送网关 B 已明确表示感兴趣的 subject 的消息。当 B 上的订阅出现和消失时,B 会更新其在 A 上的 subject 兴趣信息。
队列订阅
当队列订阅者创建新订阅时,网关会将此订阅兴趣传播到其他网关。对于每个 账户 和 subject,订阅兴趣仅被传播一次。当最后一个队列订阅者消失时,集群兴趣将被移除。
队列订阅在 仅兴趣模式 之上工作,以在在整个超级集群中遵循 NATS 的队列语义。对于每个队列组,一条消息仅传递给一个队列订阅者。如果同一个队列组存在于多个集群中,服务器将优先选择其集群内队列组的一个成员,仅当在其集群内没有找到兴趣时,才发送到其他集群。换句话说,服务器总是尝试优先服务本地队列订阅者,只有在找不到本地队列订阅者时才进行故障转移。服务器将选择具有最低 RTT 的集群。
网关配置
网关配置文档描述了网关可用的所有配置选项。
