具有 Docker swarm 模式的被动副本

Posted

技术标签:

【中文标题】具有 Docker swarm 模式的被动副本【英文标题】:Passive replicas with Docker swarm mode 【发布时间】:2017-04-02 21:02:15 【问题描述】:

我正在尝试找出一种正确的方法来使用 Docker 集群模式在服务副本之间实现主动/被动故障转移。

该服务将保存一个不会丢失的宝贵内存状态,这就是我需要它的多个副本的原因。副本将在内部实现 Raft,以便只有在给定时刻处于活动状态的副本(“领导者”)才会接受来自客户端的请求。

(If you're unfamiliar with Raft: 简单地说,它是一种分布式共识算法,有助于实现副本的主动/被动容错集群。根据 Raft,主动副本——领导者——将其数据的变化复制到被动副本- 追随者。唯一的领导者接受来自客户端的请求。如果领导者失败,则从追随者中选出新的领导者。

据我了解,Docker 将保证指定数量的副本启动并运行,但它会以主动/主动方式平衡所有副本之间的传入请求。

如何告诉 Docker 仅将请求路由到活动副本,但仍保证所有副本都已启动?

一个选项是通过额外的nginx 容器路由所有请求,并在每次选举新领导时更新其规则。但这将是一个额外的跳跃,我想避免。

我还尝试避免使用外部/重叠工具,例如 consulkubernetes,以使解决方案尽可能简单。 (HAProxy 不是一个选项,因为我需要一个 Linux/Windows 便携式解决方案)。所以目前我正在尝试了解这是否可以单独使用Docker swarm mode 完成。

我遇到的另一种方法是从被动副本返回失败的运行状况检查。 kubernetes according to this answer 可以解决问题,但我不确定它是否适用于 Docker。群管理器如何解释来自任务容器的失败的健康检查?

如果有任何想法,我将不胜感激。

【问题讨论】:

@felix-b!你是如何解决这个问题的(如果你解决了)? @SaqibAhmed,我选择使用 Kubernetes,我通过用内存中的副本交换带有快照的持久事件日志来简化我的问题。因此,我只有一个副本,如果它崩溃,新实例将从最新的快照和日志中的事件恢复其状态。一种事件溯源。如果我仍然需要多个副本,我可能会尝试在 Kubernetes 之上进行(以下讨论可能相关:github.com/kubernetes/kubernetes/issues/45300) 【参考方案1】:

Active Passive 副本可以通过以下部署模式实现:

模式:全球

打开相应服务的这个端口,即可以通过swarm中的任何节点访问服务,但容器将只在特定节点上运行。

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

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

这里,Vault 和 Nginx 容器只能在 swarm 的一个节点中看到,但 Consul 容器(具有模式:已复制)将出现在 swarm 的所有节点上。 但正如我之前所说,VAULT 和 NGINX 服务可以通过 'any_node_ip:corresponding_port_number' 获得

【讨论】:

以上是关于具有 Docker swarm 模式的被动副本的主要内容,如果未能解决你的问题,请参考以下文章

Zabbix主被动模式

如何设置FTP的主动模式和被动模式

Docker 1.12:多副本,单数据库

如何设置FTP的主动模式和被动模式

Zabbix主动模式及被动模式

FileZilla Server 被动传输模式设置问题