AWS中的NATS集群 - 在

时间:2017-04-24 14:14:04

标签: amazon-web-services amazon-ecs nats.io

我正在尝试使用自动扩展功能在AWS ECS中设置带有群集的NATS服务器。

背景

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

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

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

问题

我启动服务器C,路由到种子IP_A和IP_B,如果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 Normal Node Group中的实例将按如下方式启动:

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

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

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

这感觉非常复杂。我认为我不是第一个想要在AWS中进行弹性HA设置的人,所以我会感激任何指针。在AWS上是否有任何关于AWS中NATS群集的参考文献?

1 个答案:

答案 0 :(得分:3)

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

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

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