我正在尝试找出一种正确的方法来使用 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。群管理器如何解释来自任务容器的失败的健康检查?
如果有任何想法,我将不胜感激。
最佳答案
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' 获得
关于nginx - 具有 Docker swarm 模式的被动副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40686770/