您是否想知道如果机器崩溃而您不知道该怎么办’无法访问您的NextCloudPi数据(是的,您总是忘记创建备份)?或者,如果有一种方法可以将您的NCP与其他人连接’在同一LAN上并共享您的数据?然后,您应该保持关注,并考虑使NextCloudPi高度可用。
为了使NextCloudPi高度可用,应重点关注Nextcloud的基本密钥’服务:数据存储。因此,在我们的情况下,高可用性等于已在运行NextCloudPi docker映像的多台计算机上复制和持久化数据。
在本教程中,我们将使用Docker Swarm和GlusterFS实现我们的目标。以下是这两个的简要概述:
码头工人:Docker Swarm是用于创建和维护的工具–否则编排–Docker主机集群。 Docker主机是运行Docker Daemon的远程机器,无论是VM还是物理机器。 Swarm系统由一个名为管理器的节点创建,该节点实际上是领导者(可以将多个管理器添加到系统中)并监视其他节点(称为工作器)。整个想法是关于将多台机器合并到一个逻辑虚拟服务器中。通过将应用程序分布在多个Docker主机上而不是仅一个上,我们获得了可用性和高性能。
GlusterFS: GlusterFS是基于分布式软件的文件系统。在分布式系统中,数据分布在不同的节点上,但是所有节点都有一个共同的观点,即所有文件都在它们之间分隔开来,他们可以在不知道文件实际位置的情况下轻松访问它们。运行GlusterFS守护程序的节点可以相互连接成一个群集,在群集中,它们可以通过装入卷来共享一个名为Brick的目录。–合理的积木–在指定模式下(分布式,复制或条带化)。
这里’这些工具如何帮助我们解决方案:
码头工人将部署NextCloudPi堆栈,并以首选规模在多个节点上分配ncp服务,而在GlusterFS集群中将swarm系统的所有节点连接在一起将为我们提供数据存储的复制和数据持久性。
整个过程将在下面逐步说明,但是您也可以在最后找到自动化脚本。
输入:指定您的资源
在开始时,该脚本将提示用户在有关将要使用的资源的多个选项之间进行选择。
首先,提示用户选择脚本是否应获得主机’IP自动或在主机正在侦听多个IP的情况下,用户可以专门指定一个IP作为输入。
自动化脚本还将提示用户选择使用现有计算机作为工作节点,还是通过Vagrant创建新的VM。
- 使用现有机器: 选择此选项时,将要求用户提供每台工作计算机的IP和用户(sudoer)作为输入,还可以选择手动添加主机’的公共密钥添加到每个节点的authorized_keys文件,或者让脚本自动修复它。后者会要求用户提供每台机器的密码作为输入,并在使用默认公共密钥(id_rsa)或指定另一个之间进行选择。必须在主机上安装Package sshpass’此选项的机器。
- 游民选项: 该选项将使自动化脚本根据提供的Vagrantfile自动创建轻量级的VM。用户可以通过Vagrantfile手动调整VM的规格以适应其需求。新虚拟机将获得以下领导者IP’相应的IP。此选项需要流浪汉。
在Manager上设置Docker Swarm和GlusterFS
现在我们有了所需的所有信息,系统的设置开始了。
Swarm系统将由主机(即系统)创建’的经理。对于此示例,让’s agree on host’的角色专门监视工作节点,并且不运行NextCloudPi实例。但是,将存在一个目录,GlusterFS集群的所有数据也将被复制到主机上。
如果您还希望主机也运行NextCloudPi,请跳过设置排水模式的步骤,对NCP堆栈的放大比例加1,确保在运行Gluster之前已部署NCP堆栈’主机上的容器,并在GlusterFS命令上将swstorage目录替换为共享卷的相应目录,就像在worker上一样。
执行以下命令后,Swarm系统准备好欢迎新节点:
$ docker swarm init advertise-addr
现在,该在主机上设置GlusterFS了。我们选择对自动化脚本使用GlusteFS docker映像,以使其可移植并适用于每个操作系统。
然而, 我们应该提到源自GlusterFS特权容器的不安全性。小心信号,因为它可能由容器处理,但也会导致主机关闭。一种解决方法是在每个节点上本机安装GlusterFS,但这取决于您,因为它不是自动的。
因此,要做的第一件事是创建一个供GlusterFS群集使用的覆盖内部网络。这种类型的网络在多个Docker守护程序主机之间提供了一个分布式网络,并与attachable选项结合使用,这使我们能够使用docker run在该网络范围内创建一个容器,我们拥有Swarm的默认网络。
我们之所以需要这个网络,是因为GlusterFS docker映像需要特权模式,该模式与Docker Swarm不兼容,因此无法将其部署到Swarm堆栈。因此,我们只能在每个节点上将Gluster作为服务运行。
执行以下命令以创建覆盖网络:
$ docker network create -d overlay --attachable netgfsc
接下来,我们为GlusterFS容器创建一些初始目录,并进行适当的安装,以便可以共享该卷:
$ sudo mkdir /etc/glusterfs $ sudo mkdir /var/lib/glusterd $ sudo mkdir /var/log/glusterfs $ sudo mkdir -p /bricks/brick1/gv0 $ sudo mkdir swstorage $ sudo mount --bind ./swstorage ./swstorage $ sudo mount --make-shared ./swstorage
每个目录的解释如下:
/ etc / glusterfs:Gluster配置。挂载此即可进行gluster配置
在主机上持续存在。
/ var / lib / glusterd:Gluster元数据。挂载它会使gluster元数据持久存在-
tent on the host.
/ var / log / glusterfs:Gluster日志。挂载此选项可使gluster日志在
host.
/ bricks / brick1 / gv0:要共享的卷–GlusterFS存储的实际位置
文件。仅由glusterfs容器使用。
•swstorage:主机上NextCloudPi副本之间共享的数据量的副本。
最后,让我们在主机上启动Gluster的容器:
$ docker run --restart=always --name gfsc0 -v /bricks:/bricks \ -v /etc/glusterfs:/etc/glusterfs:z \ -v /var/lib/glusterd:/var/lib/glusterd:z \ -v /var/log/glusterfs:/var/log/glusterfs:z \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ --mount type=bind,source=$(pwd)/swstorage,\ target=$(pwd)/swstorage,bind-propagation=rshared \ -d --privileged=true --net=netgfsc \ gluster/gluster-centos
如您所见,关于GlusterFS容器’s的重新启动策略在退出后设置为始终,以便Gluster服务器始终处于活动状态以保留复制和数据持久性。
自动化脚本将执行一些基本检查,以了解一切是否正常,我们’re ready to go on.
主机上的额外服务– optional
在继续部署NCP堆栈之前,让’在主机上运行我们需要的任何服务(稍后将设置主机’的节点排空模式,因此我们最好现在运行我们需要的任何东西)。
为了获得Swarm系统的清晰图片,有一个docker图像,该图像说明了一个可视化工具,并提供了有关Swarm上每个节点的信息。–状态,服务正在运行等
要获得此可视化工具,请运行以下容器:
$ docker run -it -d -p 5000:8080 -v /var/run/docker.sock:/var/run/docker.sock dockersamples/visualizer
现在,只要输入 本地主机:5000 在您的网络浏览器上,您应该看到类似以下内容:

船上工人
是时候欢迎远程机器了,它将扮演工作者的角色。
首先,每台机器应运行以下命令以输入我们之前创建的Swarm:
$ docker swarm join --token $(docker swarm join-token -q worker) :2377
为了使这一过程自动化,我们通过ssh输入每台远程计算机并执行每条命令。
然后,我们在主机上部署NCP堆栈’s machine – manager –然后将其扩大到工人人数:
$ docker node update --availability drain $(hostname) $ docker deploy --compose-file docker-compose.yml NCP $ docker service scale NCP_nextcloudpi=${number of workers} $ docker node update --availability active $(hostname)
之所以在部署堆栈之前将管理器设置为耗尽模式,是因为我们不希望它运行NextCloudPi。在将副本分发给工作程序之后,可以将管理器再次设置为活动模式。
我们所有的工作人员现在都在运行NextCloudPi,我们要做的就是同步其存储。
再次使用ssh,我们将在每个节点上执行以下命令以运行GlusterFS容器(自动化脚本使用 gluster_setup.sh,其中包括以下命令):
$ mkdir -p /bricks/brick1/gv0 $ mkdir -p / var / lib / docker / volumes/NCP_ncdata/_data/nextcloud/data/ncp/files/swarm $ mount --bind / var / lib / docker / volumes/NCP_ncdata/_data/nextcloud/data/ncp/files/swarm / var / lib / docker / volumes/NCP_ncdata/_data/nextcloud/data/ncp/files/swarm $ mount --make-shared / var / lib / docker / volumes/NCP_ncdata/_data/nextcloud/data/ncp/files/swarm $ docker run --restart=always --name gfsc -v /bricks:/bricks \ -v /etc/glusterfs:/etc/glusterfs:z \ -v /var/lib/glusterd:/var/lib/glusterd:z \ -v /var/log/glusterfs:/var/log/glusterfs:z \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ --mount type=bind, \ source=/ var / lib / docker / volumes/NCP_ncdata/_data/nextcloud/data/ncp/files/swarm,\ target=/ var / lib / docker / volumes/NCP_ncdata/_data/nextcloud/data/ncp/files/swarm,\ bind-propagation=rshared -d --privileged=true \ --net=netgfsc -v /dev/:/dev \ gluster/gluster-centos $ docker start gfsc
工人之间的唯一区别’GlusterFS的设置和管理器’s是当经理挂载目录时 储存,工作人员会在下面安装一个目录 / var / lib / docker / volumes 因为我们要挂载的目录是NextCloudPi的docker卷’s容器正在使用,并且因为NextCloudPi已初始化,所以它已经存在。
因此,现在所有节点都在运行GlusterFS。但是,我们如何连接它们呢?
创建集群,复制的卷为manager’的工作,所以我们进入了gluster’s主机上的容器,并根据我们拥有的工作人员数量执行以下命令:
$ docker exec gfsc0 gluster peer probe gfsc1 $ docker exec gfsc0 gluster peer probe gfsc2 $ docker exec gfsc0 gluster peer probe gfsc3 … $ docker exec gfsc0 gluster volume create gv0 replica gfsc0:/bricks /brick1/gv0 gfsc1:/bricks/brick1/gv0 gfsc2:/bricks/brick1/gv0 gfsc3:/bricks/brick1/gv0 # ( and so on if there are more workers…) $ docker exec gfsc0 gluster volume start gv0 $ docker exec gfsc0 mount.glusterfs gfsc0:/gv0 $(pwd)/swstorage
所有工作人员还必须从侧面安装该卷,如下所示(运行自动化脚本 gluster_volume.sh per node):
$ docker exec gfsc mount.glusterfs gfsc:/gv0 / var / lib / docker / volumes/NCP_ncdata/_data/nextcloud/data/ncp/files/swarm
就是这个!该卷已准备好在Swarm系统的成员之间共享。为了使NextCloudPi的Web界面可见它,还有最后一件事情要做。在每个节点上修复共享目录的所有者组,如下所示(这也包含在内部 gluster_volume.sh):
$ sudo chown www-data:www-data / var / lib / docker / volumes/NCP_ncdata/_data/nextcloud/data/ncp $ sudo chown www-data:www-data / var / lib / docker / volumes/NCP_ncdata/_data/nextcloud/data/ncp/files $ sudo chown www-data:www-data / var / lib / docker / volumes/NCP_ncdata/_data/nextcloud/data/ncp/files/swarm
配置NextCloudPi
Swarm系统和GlusterFS现在都已启动并正在运行。目录群中存在的所有内容现在都复制到所有节点。
为了通过Web面板查看来自不同节点的文件,您需要做的是为路径启用自动扫描(nc-scan-auto) ‘/ncp/files/swarm’,以便将文件复制到每台计算机后立即可见。否则,只有在手动扫描群目录(nc-scan)时才能看到它们。
其它功能
并发Docker下载
如果你’选择了手动设置Swarm系统的路径,然后’重新使用主机上的VM作为工作程序,然后确保主机上的Docker守护程序允许并发下载Docker映像。为了同时下载GlusterFS映像,请将限制设置为最多可增加的工作程序数。
$ echo $"{ "max-concurrent-downloads":${number_of_workers} }" | sudo tee /etc/docker/daemon.json $ sudo service docker restart
脚本 码头工人_concurrent.sh 会帮助您解决此问题。
额外的节点
设置Swarm系统后,您可能会意识到您需要更多的节点。你不’不必分解并重新设置它,可以按照以下步骤轻松地将新节点连接到swarm和GlusterFS集群:
- 在新计算机上,执行与将其添加到Swarm系统之前相同的命令。
- 在主机上,将管理器设置为消耗模式,扩展到num_of_workers + 1,设置为活动模式
- 在新计算机上,设置GlusterFS并运行Gluster容器。
- 在主机上,执行以下命令以将新节点添加到群集:
$ docker exec gfsc0 gluster peer probe gfsc $ sleep 5 $ docker exec gfsc0 gluster volume add-brick gv0 replica gfsc:/bricks/brick1/gv0
- 在新机器上,安装Gluster’的音量并锁定新目录。
以上过程由脚本自动执行 extra_node.sh.
自动化脚本
您可以在此处找到自动化脚本: //github.com/eellak/gsoc2019-NextCloudPi/tree/gsoc2019-docker_swarm/docker-swarm.
在视觉上,自动化脚本的工作方式如下:

赶紧跑 create_swarm.sh 它将指导您完成整个过程。
聚簇快乐!
感谢分享这篇文章!
如果我在集群的ncp实例之一上添加新用户会怎样?据我了解,只有文件而不是数据库是同步的,对吗?
丹尼尔,您好
这么晚才回复很抱歉。
用户名称空间不受影响。如果某个ncp实例的新用户被授予访问共享文件夹的权限(在我的示例中为“ swarm”),那么其余任何人都可以看到该用户的任何操作(添加/删除文件)的结果ncp实例数。
因此,实际上是的,只有文件是同步的。 ðŸ™,
法尼
是否可以在RPi 4群集上设置’s?
是的,只要RPI映像已安装docker,它们肯定可以’在同一局域网上重新运行。
是否需要在同一局域网上?在两个不同的位置拥有它会很棒…
我尝试过一次,但是我做不到’使其工作..这不是Docker’s philosophy, so I’我什至不确定这是否真的会发生。也许,如果有’由于两者之间没有NAT网络,因此位于不同位置的计算机可以加入覆盖网络。’不要相信我,你应该测试它