Docker Swarm模式下的被动副本

10
我正在尝试找出在Docker Swarm模式下实现主/备故障转移的适当方法。
该服务将保存一个有价值的内存状态,不能丢失,这就是为什么我需要多个副本的原因。这些副本将在内部实现Raft,以便每次只有处于活动状态(“领导者”)的副本会接受客户端的请求。
(如果您不熟悉Raft:简单来说,它是一种分布式共识算法,可以帮助实现主/备容错副本集群。根据Raft协议,活动副本 - 领导者 - 将其数据的更改复制到被动副本 - 跟随者。只有领导者会接受客户端的请求。如果领导者失败,则在跟随者中选举新的领导者。)
据我所知,Docker将保证指定数量的副本正在运行,但它将以主/备的方式在所有副本之间平衡传入的请求。
我该如何告诉Docker仅将请求路由到活动副本,但仍保证所有副本都在运行?
一种选项是通过额外的NGINX容器路由所有请求,并在每次选举新领导者时更新其规则。但这将是一个额外的跳跃,我想避免。
我还试图避免使用外部/重叠的工具,例如consulkubernetes,以使解决方案尽可能简单。(HAProxy不是一个选项,因为我需要一个Linux/Windows便携式解决方案)。因此,目前我正在尝试了解是否可以仅使用Docker swarm mode来完成这项工作。
我遇到的另一种方法是从被动副本返回失败的健康检查。根据这个答案,它可以在kubernetes中实现,但我不确定它是否适用于Docker。Swarm管理器如何解释来自任务容器的失败的健康检查?
我很感谢任何想法。

@ felix-b!如果你解决了这个问题,你是怎么做到的?请分享一下。 - Saqib Ahmed
@SaqibAhmed,我选择使用Kubernetes,并通过交换内存中的副本以获取具有快照的持久事件日志来简化我的问题。因此,我只有一个副本,如果它崩溃,新实例将从最新的快照加上日志中的事件恢复其状态。一种事件源。如果我仍然需要多个副本,我可能会尝试在Kubernetes之上进行(以下讨论可能相关:https://github.com/kubernetes/kubernetes/issues/45300)。 - felix-b
1个回答

0

使用以下部署模式可以实现主备副本:

模式:全局

在此模式下,相应服务的端口是开放的,即可以通过群集中的任何节点访问该服务,但容器只会在特定节点上运行。

参考文献:https://docs.docker.com/compose/compose-file/#mode

示例: 具有Consul后端的VAULT-HA Docker堆栈文件: https://raw.githubusercontent.com/gtanand1994/VaultHA/master/docker-compose.yml

在这里,Vault和Nginx容器只会出现在群集的一个节点上,但是Consul容器(具有模式:复制)将存在于所有群集节点上。 但正如我之前所说,VAULT和NGINX服务可通过“任意节点IP:相应端口号”进行访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接