我正在学习Docker Swarm模式,我设法在本地创建一个带有Web应用程序和PostgreSQL数据库的Swarm。我可以扩展它们,我看到Swarm创建了副本。
我想我理解Docker Swarm如何load balance regular web servers,但它如何与数据库容器一起开箱即用?
在Swarm上下文之外,通常数据库有their own ways以插件或扩展产品(如MySQL cluster)的形式处理复制。像Cassandra这样的其他数据库已经直接在他们的产品中构建了复制。 在Swarm上下文中,我们是否还需要依赖这些数据库插件和功能?
处理数据库容器副本之间数据一致性的预期模式是什么?
我知道这是一个非常开放的问题,但Docker的文档也是非常开放的,我似乎无法找到任何具体的内容。
答案 0 :(得分:9)
它没有。
这里有一个很好的Swarm服务描述:How services work (强调我的)
当您将服务部署到swarm时,swarm管理器会将您的服务定义接受为服务的所需状态。 然后它将swarm中节点上的服务作为一个或多个副本任务进行调度。
Swarm不知道任务内部是什么,它只知道它有多少个实例,这些实例是否正在通过他们的健康检查,以及是否有足够的实例来满足任务定义你给它。这个和数据库副本之间的重叠这个词有点不幸,但它们是不同的概念。
您正在设置数据复制。这些可能与任何
一样好答案 1 :(得分:1)
Docker swarm目前可以很好地适应无状态应用程序。对于数据库复制,您必须依赖每个数据库自己的复制机制。 Swarm无法管理数据库复制。卷或文件系统级复制可以为单个实例数据库提供保护,但不知道数据库复制/集群。
对于PostgreSQL等数据库,需要额外的工作。有几个选择:
使用主机的本地目录。您需要为每个副本创建一个服务,并使用constraint
将容器安排到一个特定主机。您还需要自定义postgresql docker镜像以在副本之间设置postgresql复制。而当一个节点出现故障时,一个PostgreSQL副本将关闭。您需要努力调出另一个副本。 See crunchydata's example
使用卷插件,例如flocker,REX-Ray。您仍需要为每个副本创建一个服务,并将一个卷绑定到一个服务。您需要在同一个覆盖网络中创建所有服务,并将PostgreSQL副本配置为通过dns名称(副本的docker服务名称)相互通信。您仍然需要在副本中设置postgresql复制。