我建立了一个docker swarm集群,在其中运行具有持久数据的容器。为了在发生故障的情况下允许容器移动到另一台主机,我需要整个集群的弹性共享存储。在研究了各种选项之后,我实现了以下内容:
在整个群集的所有节点上安装了Ceph存储群集,并创建了RADOS块设备(RBD)。 http://docs.ceph.com/docs/master/start/quick-ceph-deploy/
在每个节点上安装了Rexray,并将其配置为使用上面创建的RBD。 https://rexray.readthedocs.io/en/latest/user-guide/storage-providers/ceph/
部署一个使用rexray驱动程序挂载卷的docker堆栈
version: '3'
services:
test-volume:
image: ubuntu
volumes:
- test-volume:/test
volumes:
test-volume:
driver: rexray
此解决方案的工作方式是,我可以部署堆栈,在正在运行的节点上模拟故障,然后观察堆栈在另一个节点上重新启动,而不会丢失持久性数据。
但是,我不能在一个以上的容器中安装rexray卷。我这样做的原因是使用一个短暂的“备份容器”,该容器只是在容器仍在运行时将卷作为快照备份。
我可以将Rexray卷安装到另一个容器中吗?
第二个容器仅需要读取访问权限,因此可以在保持第一个容器运行的同时将卷作为快照备份的目标。
答案 0 :(得分:1)
您当然可以有一个附加卷的容器,然后通过专用群集网络上的nfs将其导出,然后客户端容器可以通过nfs对其进行访问
答案 1 :(得分:0)
不幸的是,答案是否定的,在这种情况下,无法将Rexray卷安装到另一个容器中。以下一些信息有望帮助任何人走类似的道路:
Rexray不支持多个安装:
如今,REX-Ray的设计旨在实际上确保可能潜在访问同一主机的许多主机之间的安全性。这意味着它将强制限制单个卷一次只能供一个主机使用。 (https://github.com/rexray/rexray/issues/343#issuecomment-198568291)
但是Rexray确实支持一项称为pre-emption
的功能,
..如果第二个主机确实请求了该卷,则他可以将该卷强行从原始主机上分离出来,然后再将其移交给自己。这将模拟连接到卷的主机的关闭电源操作,在该卷上,原始主机上内存中所有尚未刷新的位都将丢失。这将为Swarm用例提供支持,使其主机发生故障,并尝试重新安排容器。 (https://github.com/rexray/rexray/issues/343#issuecomment-198568291)
但是,Ceph RBD 不不支持抢占。 (https://rexray.readthedocs.io/en/stable/user-guide/servers/libstorage/#preemption)