【发布时间】:2014-02-07 07:22:40
【问题描述】:
我目前正在修补 CoreOS 并基于它创建一个集群。到目前为止,在单主机上使用 CoreOS 的体验还是相当流畅的。但是在服务发现方面,事情变得有点模糊。不知怎的,我不明白整体的想法,因此我现在在这里寻求帮助。
我想做的是让两个 Docker 容器在第一个依赖于第二个的地方运行。如果我们谈论的是纯 Docker,我可以使用 linked containers 解决这个问题。到目前为止,一切顺利。
但是这种方法不能跨机器边界工作,因为 Docker 不能跨多个主机链接容器。所以我想知道如何做到这一点。
到目前为止,我所了解的是,CoreOS 处理此问题的想法是使用其etcd 服务,该服务基本上是一个分布式键值存储,可在每个主机上通过端口@987654323 本地访问@,因此您不必(作为etcd 的消费者)处理任何网络细节:只需访问localhost:4001 就可以了。
所以,在我的脑海中,我现在有这样的想法,这意味着当一个提供服务的 Docker 启动时,它会在本地 etcd 和 @987654327 中注册自己(即它的 IP 地址和它的端口) @ 负责在网络上分发信息。这样,例如你会得到键值对,例如:
RedisService => 192.168.3.132:49236
现在,当另一个 Docker 容器需要访问 RedisService 时,它会从它们自己的本地 etcd 获取 IP 地址和端口,至少在信息已通过网络分发后。到目前为止,一切顺利。
但是现在我有一个无法回答的问题,这已经让我困惑了几天:当服务出现故障时会发生什么?谁来清理etcd 内部的数据?如果没有清理,所有客户端都会尝试访问不再存在的服务。
目前我能想到的唯一(可靠)解决方案是使用etcd 的 TTL 数据功能,但这需要权衡:要么您的网络流量很高,因为您需要每隔几秒钟发送一次心跳,否则您必须忍受陈旧的数据。两者都不好。
我能想到的另一个“解决方案”是在服务出现故障时自行取消注册,但这仅适用于计划中的关闭,不适用于崩溃、停电……
那么,你如何解决这个问题?
【问题讨论】:
标签: cluster-computing docker service-discovery coreos