将LXD容器备份到其他LXD主机

我有两台运行Ubuntu 16.04的服务器A和B以及一个用于LXD的RAID1 ZFS文件系统。 目前有一些容器在服务器A上运行。现在我的想法是从服务器A上的每个容器进行夜间备份到服务器B.这样我就能够在服务器A崩溃的情况下启动服务器B上的容器。 我也可以使用服务器A上的本地快照来非常快速地恢复容器,例如,如果有人删除了偶然的文件。

最简单的方法是停止服务器A上的容器C,制作快照Snap0并重新启动。 然后使用lxc copy C/Snap0 serverB:C将快照复制到服务器B,假设我已经将服务器B添加为服务器A的远程主机。这里的问题是,这只是第一次。 对于其他备份,我必须先删除服务器B上的容器C,然后再复制它。 第二个问题是容器正在从备份发展到备份,并且最终有太多的数据传输到服务器B,以至于运行在其上的所有服务都将没有足够的带宽。

所以这个解决scheme应该是只传输每晚的快照之间的差异。 可以通过zfs send/receive与ssh结合使用,通过ssh将服务器A上的快照之间的差异发送到服务器B,然后将这些差异添加到服务器B的文件系统。 但是还有一个问题。 如果我使用lxc copy创build容器C的初始文件系统,则不起作用,因为此命令在内部不使用zfs send/receive而是在服务器B上创build一个新的文件系统,该文件系统又与原始文件系统具有不同的校验和服务器A.因此,差异备份是不可能的, zfs receive将返回一个错误,因为它比较文件系统的校验和。

我的下一个想法是仅使用zfs send/receive将容器C的整个文件系统从服务器A传输到服务器B,而不使用lxc copy/init创build容器。 之后,由于校验和匹配,每晚发送两个连续快照之间的差异是没有问题的。 但是,在紧急情况下,由于LXD数据库中没有位于/var/lib/lxd/lxd.db条目,因此无法在服务器B上启动容器C的副本,所以lxc start C不pipe用。 我想我可以简单地将服务器A的LXD数据库的相关条目复制到服务器B的LXD数据库,以便使其工作,但我不确定。 也许你可以在这里帮我。 我不想破坏这些数据库中的任何东西。

一些背景信息:事实上,服务器A和B都运行容器,但每个服务器应该包含其他服务器容器的备份。

也许已经有一个工作的备份策略,使用两个或更多的LXD主机,但我无法find它。 每晚只有rsync类似的备份策略或整个容器副本。

更新:我刚刚得到了这个github的提示,它为lxd命令实现了一个新的子命令,即lxd import 。 因此,我需要使用apt-get install -t xenial-backports lxd lxd-client在Ubuntu服务器上升级两台服务器上的apt-get install -t xenial-backports lxd lxd-client

没有人应该能够从现有的文件系统导入容器。 我尝试过这个。 首先去服务器A并拍一个快照

 lxc snapshot C Snap0 

使用发件人站点上的额外参数-p使用zfs send/receive将快照发送到服务器B,以包含文件系统的属性。

 zfs send -p lxd/containers/C@snapshot-Snap0 | ssh serverB zfs receive lxd/containers/C 

切换到服务器B并build立一个符号链接:

 ln -s /var/lib/lxd/containers/C.zfs /var/lib/lxd/containers/C 

现在我应该可以导入:

 lxd import C 

但是,我得到一个错误:

 error: open /var/lib/lxd/containers/C/backup.yaml: no such file or directory 

因为我不知道这个backup.yaml文件应该来自哪里,所以我尝试将现有的metadata.yawl复制到backup.yaml 。 在其他尝试后,我得到这个错误:

 error: no response! 

而现在我不知道该怎么做,因为没有build议,这个backup.yaml应该来自哪里。

更新2:作为泡沫提到已经可以得到这个backup.yaml文件,通过再次停止和启动一个容器,或通过升级到lxc 2.7 +后简单地采取另一个快照。

所以最后我的脚本终于工作正常。 现在只有一个小问题。 用lxc import导入一个容器后,我不能删除它,而不会破坏容器的整个文件系统。 我正在考虑像lxc import --update <container>lxc delete --keep-root-fs或类似命令。 我已经提出了关于这个想法的function请求。

更新3:在这里你可以看到进展: 改进LXD备份处理#3005

萨科

我发现你面对同样的问题。 在我的testing中,我必须从lxd 2.0.8升级到2.7,并且必须停止lxc(从2.0.x创build或启动),然后再次启动lxc,您将看到backup.yaml,并且可以复制到目标使用lxd导入(在导入之前不要忘记将zfs设置为挂载点,并为挂载点创build链接容器名称)

希望这个帮助。