通过ECS服务为多服务器RethinkDB集群自动设置

时间:2018-06-27 11:12:11

标签: amazon-web-services devops terraform amazon-ecs

我正在尝试建立一个RethinkDB群集,该群集具有3台服务器,它们均匀地分布在3个私有子网中,每个子网都位于一个区域的不同AZ中。

理想情况下,我想通过ECS部署数据库软件并为EC2实例提供自动扩展功能,但是我在尝试说明如何指示RethinkDB实例加入RethinkDB集群方面遇到了麻烦。

要在RethinkDB中创建/加入集群,请在启动RethinkDB的新实例时,指定集群中其他计算机之一的host:port组合。这是我遇到问题的地方。 Auto Scaling服务正在为我的EC2实例创建新的主要ENI,并在子网范围内使用随机IP,因此我无法提前知道EC2实例的IP。最重要的是,我正在使用awsvpc任务联网,因此ECS正在为每个Docker容器创建专用的新辅助ENI,并将其部署到实例时也附加到实例上,并且这些实例也获得了新IP。提前不知道。

到目前为止,我已经找到了一种可能的解决方案,即不使用自动伸缩组,而是在私有子网中手动部署3个EC2实例,这将允许我分配自己的预定私有IP。据我了解,如果我使用awsvpc任务联网,这仍然无济于事,因为在我的实例上运行的每个容器都将拥有自己的专用辅助ENI,而我将不知道该辅助ENI的IP。时间。我想我可以将任务联网切换为bridge模式,以解决此问题。这样,我可以在RethinkDB join命令中使用EC2实例(主要ENI)的预定IP。

因此,总而言之,我可以弄清楚,实现此目标的唯一方法是不使用Auto Scaling或awsvpc任务联网,否则这两种功能都是非常理想的功能。谁能想到一种更好的方法?

1 个答案:

答案 0 :(得分:1)

如评论中所述,这是一个更大的问题,因为您需要一次启动一个RethinkDB实例来引导集群,然后在将新成员加入集群时处理现有集群成员的发现。 / p>

我本以为RethinkDB会为此在他们的文档中发布一个好的模式,因为在设置集群时它将很常见,但是我看不到任何有用的文档。如果有人确实知道官方建议,那么您绝对应该使用此建议,而不要使用我要提出的建议,尤其是因为我没有运行RethinkDB的经验。

这里更像是吐口水,并且将完全未经测试(至少到目前为止),但是原理是您需要启动一个RethinkDB实例(一个实例)来引导集群,然后拥有更多集群成员加入,然后放弃没有尝试加入集群的特殊情况引导程序成员,而让其余的集群成员继续工作。

引导实例很容易考虑。您只需要一个RethinkDB容器映像和一个ECS任务,即可在独立模式下运行它,而ECS服务仅运行该任务的一个实例。为了使第二组集群成员能够轻松发现包括该引导实例的集群成员,最简单的方法是使用诸如the one offered by ECS之类的服务发现机制,该机制在幕后使用Route53记录。 ECS服务应在RethinkDB名称空间中注册该服务。

然后,您应创建另一个与第一个ECS服务基本相同的ECS服务,但在入口点脚本中应在RethinkDB命名空间中列出服务,然后解析它们,丢弃容器自己的IP地址,然后使用发现的在容器中启动RethinkDB时,主机将与--join加入。

然后我首先将非引导ECS服务设置为仅一项任务,以使其能够发现引导版本,然后您应该能够一次向该服务中添加一项任务,直到满意为止。非引导群集的大小,使群集中包含n + 1个实例(包括原始引导程序实例)。

之后,我将完全删除引导ECS服务。

如果ECS任务由于某种原因而在非引导ECS服务中死亡,则它应该能够自动重新加入而不会出现任何问题,因为它只会找到一个正在运行的RethinkDB任务并启动它。

在将RethinkDB端口用作连接成员之前,您可以通过检查RethinkDB端口是否已打开并正在运行来扩展要加入的集群成员的检查,这样它将处理同时启动的多个任务(使用我原来的端口)建议它可能会找到另一个正在尝试加入集群的任务,然后尝试首先加入该集群,如果它们都无法随机选择现有集群成员,则它们都可能陷入僵局。

如上所述,此答案带有很大的警告,我没有运行RethinkDB的经验,并且仅使用了最近为ECS发布的服务发现机制,因此这里可能遗漏了一些东西,但总的原则应该没问题。