我有两台运行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链接容器名称)
希望这个帮助。