【发布时间】:2017-04-02 21:02:15
【问题描述】:
我正在尝试找出一种正确的方法来使用 Docker 集群模式在服务副本之间实现主动/被动故障转移。
该服务将保存一个不会丢失的宝贵内存状态,这就是我需要它的多个副本的原因。副本将在内部实现 Raft,以便只有在给定时刻处于活动状态的副本(“领导者”)才会接受来自客户端的请求。
(If you're unfamiliar with Raft: 简单地说,它是一种分布式共识算法,有助于实现副本的主动/被动容错集群。根据 Raft,主动副本——领导者——将其数据的变化复制到被动副本- 追随者。唯一的领导者接受来自客户端的请求。如果领导者失败,则从追随者中选出新的领导者。
据我了解,Docker 将保证指定数量的副本启动并运行,但它会以主动/主动方式平衡所有副本之间的传入请求。
如何告诉 Docker 仅将请求路由到活动副本,但仍保证所有副本都已启动?
一个选项是通过额外的NGINX 容器路由所有请求,并在每次选举新领导时更新其规则。但这将是一个额外的跳跃,我想避免。
我还尝试避免使用外部/重叠工具,例如 consul 或 kubernetes,以使解决方案尽可能简单。 (HAProxy 不是一个选项,因为我需要一个 Linux/Windows 便携式解决方案)。所以目前我正在尝试了解这是否可以单独使用Docker swarm mode 完成。
我遇到的另一种方法是从被动副本返回失败的运行状况检查。 kubernetes according to this answer 可以解决问题,但我不确定它是否适用于 Docker。群管理器如何解释来自任务容器的失败的健康检查?
如果有任何想法,我将不胜感激。
【问题讨论】:
-
@felix-b!你是如何解决这个问题的(如果你解决了)?
-
@SaqibAhmed,我选择使用 Kubernetes,我通过用内存中的副本交换带有快照的持久事件日志来简化我的问题。因此,我只有一个副本,如果它崩溃,新实例将从最新的快照和日志中的事件恢复其状态。一种事件溯源。如果我仍然需要多个副本,我可能会尝试在 Kubernetes 之上进行(以下讨论可能相关:github.com/kubernetes/kubernetes/issues/45300)
标签: nginx docker docker-swarm