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

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

我有两台服务器 A 和 B,它们运行 Ubuntu 16.04 和用于 LXD 的 RAID1 ZFS 文件系统。目前,服务器 A 上运行着一些容器。现在我的想法是每晚将服务器 A 上的每个容器备份到服务器 B。这样,如果服务器 A 崩溃,我希望能够在服务器 B 上启动一个容器。例如,如果有人意外删除了文件,我还可以使用服务器 A 上的本地快照快速恢复容器。

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

因此,解决这个问题的办法应该是只传输夜间快照之间的差异。可以结合ssh 来实现这一点zfs send/receive,通过 ssh 将服务器 A 上的快照之间的差异发送到服务器 B,然后将这些差异添加到服务器 B 的文件系统中。但又出现了一个问题。如果我使用创建了容器 C 的初始文件系统,则无法正常工作,lxc copy因为此命令不是zfs send/receive内部使用,而是在服务器 B 上创建了一个新的文件系统,而该文件系统的校验和与服务器 A 上的原始文件系统不同。因此,差异备份是不可能的,并且zfs receive在比较文件系统的校验和时会返回错误。

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

一些背景信息:实际上,服务器 A 和 B 都在运行容器,但每台服务器都应该包含另一台服务器的容器的备份。

也许已经存在使用两个或更多 LXD 主机的有效备份策略,但我找不到它。只有rsync类似备份策略或每晚的整个容器副本。

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

没有人能够从现有文件系统导入容器。我试过了。首先去服务器 A 并拍摄快照

lxc snapshot C Snap0

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

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

切换到服务器 B 并建立符号链接:

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.yawlbackup.yaml。再试一次后,我收到此错误:

error: no response!

现在我不知道该怎么办,因为没有人backup.yaml能给我任何建议。

更新 2: 正如 bubble 已经提到的,可以backup.yaml通过停止并重新启动容器或者在升级到 lxc 2.7+ 后简单地拍摄另一个快照来获取此文件。

所以我的脚本终于可以正常工作了。现在只有一个小问题。使用 导入容器后,lxc import我无法再将其删除,否则会破坏容器的整个文件系统。我正在考虑使用lxc import --update <container>lxc delete --keep-root-fs或类似的命令。我已经就这个想法提交了功能请求。

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

答案1

尼古拉斯

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

希望这有帮助。

相关内容