我正在尝试通过自动缩放在 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 集群的参考资料?