1

我正在尝试通过自动缩放在 AWS ECS 中设置具有集群功能的 NATS 服务器。

背景

作为一个 AWS / NATS 的新手,我认为我可以做一些非常简单的事情。每当一个新的 NATS 容器启动时,我都会使用 ECS API 并找到所有运行 NATS 的 ECS 任务(容器),获取 EC2 IP 地址和映射的端口,并通过--routes参数传递它们。本质上,每个已经运行的节点都是一个种子。

使用这种方法,添加节点是一件轻而易举的事,但删除种子却很麻烦。

我注意到当通过的节点--routes死亡时,服务器正在尝试无限重新连接。不幸的是,在云环境中,IP 地址来来去去,所以这有点问题。僵尸路线永远存在。

问题

我用到种子 IP_A 和 IP_B 的路由启动服务器 C,如果 IP_B 的主机死了,C 会尝试无限地重新连接到 IP_B。如果我们使用 IP 地址,到 IP_B 的路由将永远不会在云环境中返回。

我觉得作为云原生的 NATS 应该接受种子已经消失的事实。

是否可以对服务器将在种子上执行的重新连接请求的数量设置最大限制?我用我有限的围棋知识检查了代码,但找不到这方面的迹象。

跟进问题

为了解决这个问题,我认为 DNS(通过 Route 53)、避免 IP 地址和 ELB 的组合会起作用,但我能想到的最简单的设置是设置三个 ELB 组。

  • elb-s1:ELB 种子组 1(跨 AZ)
  • elb-s2:ELB 种子组 2(跨 AZ)
  • elb-normal:ELB普通节点组(跨AZ)

ELB 种子组 1 中的实例将按如下方式启动:

gnatsd --cluster nats://elb-s1:6222 --routes nats://elb-s2:6222,nats://elb-normal:6222

ELB 种子组 2 中的实例将按如下方式启动:

gnatsd --cluster nats://elb-s2:6222 --routes nats://elb-s1:6222,nats://elb-normal:6222

ELB 普通节点组中的实例将按如下方式启动:

gnatsd --cluster nats://elb-normal:6222 --routes nats://elb-s1:6222,nats://elb-s2:6222

NATS 客户端将连接到:nats://elb-normal:4222.

每个种子组指向正常节点组的原因是为了确保组中的非请求种子在“外部”帮助下发现网格的其余部分。

这感觉超级复杂。我认为我不是第一个想要在 AWS 中进行弹性 HA 设置的人,所以我将不胜感激任何指点。网络上是否有任何关于 AWS 中的 NATS 集群的参考资料?

4

1 回答 1

3

显式路由将永远重试。只有隐式路由会重试有限的次数(我们已经在 master 分支中进行了配置)。

我理解如果使用临时 IP-routes并且对等方离开并且可能永远不会返回该 IP 的问题,但是如果您在 中指定某些内容-routes,那么它在某种程度上必须是静态的。

例如,您可能有 1 或 2 个具有不会更改的已知地址的种子(例如使用 DNS)。其他 NATS 服务器可以来来去去,并且始终指向这 2 个 NATS 种子。网格中的其他 NATS 服务器将收到新添加的通知并连接到该服务器。在这种情况下,这被认为是一个隐式路由,如果新服务器消失,重新连接将只尝试一次(默认情况下,或集群配置中配置的 connect_retries 次数)。

于 2017-04-24T15:32:56.157 回答