AWS 中的 NATS 集群 - 缩减时无限重新连接尝试

NATS cluster in AWS - Infinite reconnect attempts when scaling-in

我正在尝试在具有自动缩放功能的 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作为云原生,应该接受种子没了的事实吧

是否可以对服务器将要对种子执行的重新连接请求的数量进行最大限制?我用我有限的 go 知识检查了代码,但找不到这方面的指示。

跟进问题

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

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 设置的人,所以我将不胜感激任何指点。 Web 上是否有任何关于 AWS 中 NATS 集群的参考资料?

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

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

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