Docker Swarm如何处理数据库(PostgreSQL)复制?

时间:2016-11-03 17:54:58

标签: database postgresql docker docker-swarm

我正在学习Docker Swarm模式,我设法在本地创建一个带有Web应用程序和PostgreSQL数据库的Swarm。我可以扩展它们,我看到Swarm创建了副本。

我想我理解Docker Swarm如何load balance regular web servers,但它如何与数据库容器一起开箱即用?

在Swarm上下文之外,通常数据库有their own ways以插件或扩展产品(如MySQL cluster)的形式处理复制。像Cassandra这样的其他数据库已经直接在他们的产品中构建了复制。 在Swarm上下文中,我们是否还需要依赖这些数据库插件和功能?

处理数据库容器副本之间数据一致性的预期模式是什么?

我知道这是一个非常开放的问题,但Docker的文档也是非常开放的,我似乎无法找到任何具体的内容。

2 个答案:

答案 0 :(得分:9)

它如何与数据库容器一起开箱即用?

它没有。

这里有一个很好的Swarm服务描述:How services work (强调我的)

  

当您将服务部署到swarm时,swarm管理器会将您的服务定义接受为服务的所需状态。 然后它将swarm中节点上的服务作为一个或多个副本任务进行调度。

Swarm不知道任务内部是什么,它只知道它有多少个实例,这些实例是否正在通过他们的健康检查,以及是否有足够的实例来满足任务定义你给它。这个和数据库副本之间的重叠这个词有点不幸,但它们是不同的概念。

处理数据库容器副本之间数据一致性的预期模式是什么?

您正在设置数据复制。这些可能与任何

一样好

答案 1 :(得分:1)

Docker swarm目前可以很好地适应无状态应用程序。对于数据库复制,您必须依赖每个数据库自己的复制机制。 Swarm无法管理数据库复制。卷或文件系统级复制可以为单个实例数据库提供保护,但不知道数据库复制/集群。

对于PostgreSQL等数据库,需要额外的工作。有几个选择:

  1. 使用主机的本地目录。您需要为每个副本创建一个服务,并使用constraint将容器安排到一个特定主机。您还需要自定义postgresql docker镜像以在副本之间设置postgresql复制。而当一个节点出现故障时,一个PostgreSQL副本将关闭。您需要努力调出另一个副本。 See crunchydata's example

  2. 使用卷插件,例如flockerREX-Ray您仍需要为每个副本创建一个服务,并将一个卷绑定到一个服务。您需要在同一个覆盖网络中创建所有服务,并将PostgreSQL副本配置为通过dns名称(副本的docker服务名称)相互通信。您仍然需要在副本中设置postgresql复制。