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

How does Docker Swarm handle database (PostgreSQL) replication?

我正在学习 Docker Swarm 模式,我设法在本地使用 Web 应用程序和 PostgreSQL 数据库创建了一个 Swarm。我可以缩放它们并且我看到 Swarm 创建副本。

我想我了解 Docker Swarm 如何 ,但它如何处理开箱即用的数据库容器?

在 Swarm 上下文之外,数据库通常有 their own ways to deal with replication, in the form of plugins or extended products like MySQL cluster。其他数据库(如 Cassandra)在其产品中直接内置了复制功能。 在 Swarm 上下文中,我们还需要依赖那些数据库插件和功能吗?

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

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

它如何处理开箱即用的数据库容器?

没有。

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

When you deploy the service to the swarm, the swarm manager accepts your service definition as the desired state for the service. Then it schedules the service on nodes in the swarm as one or more replica tasks.

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

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

设置数据复制由您来做。这些可能是一个很好的起点

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

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

  1. 使用主机的本地目录。您需要为每个副本创建一个服务,并使用constraint将容器调度到一个特定的主持人。您还需要自定义 postgresql docker 映像来设置副本之间的 postgresql 复制。同时,当一个节点宕机时,一个 PostgreSQL 副本也会宕机。您将需要努力调出另一个副本。 See crunchydata's example.

  2. 使用volume插件,比如flocker, REX-Ray.还是需要为每个replica创建一个service,绑定一个volume一项服务。您需要在同一个覆盖网络中创建所有服务,并将 PostgreSQL 副本配置为通过 dns 名称(副本的 docker 服务名称)相互通信。您仍然需要在副本之间设置 postgresql 复制。