Docker Swarm 共享卷

3

我目前正在构建一个Docker Swarm集群,它由3个管理节点和3个工作节点组成。我将要在这个设置中部署的应用程序包括一个Laravel后端,需要将其代码分布在多个容器中以实现可扩展性。我已经尝试过使用GlusterFS卷和带有Ceph后端的rex-ray作为共享存储来处理我的卷,但是GlusterFS不够可靠,而Ceph在我的情况下有点过于强大和复杂 :)

当前的设置看起来像这样。我在Docker之外运行Percona集群,在这些服务器上运行GlusterFS,并简单地将它们挂载到Docker Workers中。

                                                Docker Managers
+-------------------------------------------------------------+
|                                                             |
|   +---------+   +---------+   +---------+    +---------+    |
|   |         |   |         |   |         |    |         |    |
|   | HAproxy +---+ HAproxy +---+ HAproxy +----+   SSL   |    |
|   |         |   |         |   |         |    | Manager |    |
|   +----+----+   +----+----+   +----+----+    +---------+    |
|        |             |             |                        |
+-------------------------------------------------------------+
         |             |             |
         |             |             |           Docker Workers
+-------------------------------------------------------------+
|        |             |             |                        |
|   +----+-------------+-------------+--------------------+   |
|   |                                                     |   |
|   |                      Applicaties                    |   |
|   |                                                     |   |
|   +---+--------------+---------------+--------------+---+   |
|       |              |               |              |       |
|       |              |               |              |       |
|   +---+----+     +---+----+     +----+---+     +----+---+   |
|   | Mysql  |     | Mysql  |     | Mysql  |     | Mysql  |   |
|   |   LB   +-----+   LB   +-----+   LB   +-----+   LB   |   |
|   +---+----+     +----+---+     +----+---+     +----+---+   |
|       |               |              |              |       |
|       +---------------+-------+------+--------------+       |
|       |                       |                     |       |
+-------------------------------------------------------------+
        |                       |                     |
        |                       |                     |
        |                       |                     |
+-------+--------+     +--------+-------+    +--------+-------+
|                |     |                |    |                |
|    MySQL01     |     |    MySQL02     |    |    MySQL03     |
|    Gluster01   +-----+    Gluster02   +----+    Gluster03   |
|                |     |                |    |                |
+----------------+     +----------------+    +----------------+

然后我将它们装入 PHP 容器中,就像这样:
--mount type=bind,source=/mnt/client-data,target=/var/www/html/

这个方法虽然可行,但速度非常慢。页面加载时间约为10秒,当文件没有挂载时(它们存在于容器中),页面加载时间约为2-3秒。

我了解到Flocker,这似乎非常有趣,但我认为flocker卷只能挂载在一个容器上。这是真的吗?

我正在尝试的另一种解决方案是,每次创建新容器时从git拉取代码。这实际上是一个不错的解决方案,但拉取代码和运行composer需要大约5分钟,当我推送更新时,我需要重新启动所有容器。

如何在多个主机(甚至数据中心)的不同容器之间共享我的代码是最好的解决方案?目前我可以访问许多不同的存储后端(Ceph、NFS、gluster),创建一个新的存储后端也不是问题。

编辑:为什么在这种情况下Gluster不可靠?我可能说错了...使用卷驱动程序插件在Gluster上使用docker卷时,卷通常会在创建服务时很好地挂载,但如果在群集中发生重新调度,则卷很少再次挂载。我稍后会研究这个问题,以确定出了什么问题,但我目前没有太多空闲时间。事实上,Gluster是可靠的。只是在这种情况下不可靠。


让读者了解GlusterFS为何不可靠是很有趣的。 - user239558
我稍后会解释为什么在这种情况下它是不可靠的,但首先我必须完成我的工作 :) 但这与在Gluster中创建Docker卷有关,这在50%的情况下会失败。 - Odyssee
2个回答

3
我最终采用了CephFS并将其挂载在Docker主机上。与glusterfs相比,写入速度还可以,甚至可能更好。在CephFS上读取非常快,这也是GlusterFS的情况。
这种设置适合我的需求,但我不能在主机之间使用共享的Docker卷。我必须在Docker容器中绑定挂载的文件系统。虽然这不是世界末日,但我仍在寻找一种方便快捷的方法来满足我在集群中所有主机上的卷要求。
目前,我正在尝试构建一个适用于CephFS的Docker卷插件以满足我的需求。如果有人感兴趣,我会随时更新。

只是出于好奇,你不能将CephFS挂载到/var/lib/docker/volumes吗?似乎metadata.db没有任何特定于主机的内容。如果共享此文件夹,还有其他可能会破坏的东西吗? - inta
@inta 这是5年前的事了,自那以后发生了很多变化。我记得当时由于很多原因而遇到了挂载/var/lib/docker/volumes的问题。现在它的行为如何我不确定。 - Odyssee

0
请注意,我没有尝试过以下内容。
由于您的代码大多是只读的,因此在我看来,您“只需要”一个文件系统缓存。例如,在NFS上运行的CacheFS。
由于GlusterFS可以作为NFS挂载,因此您应该能够将两者结合起来使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接