如何对 zfs 池执行增量/连续备份?

如何对 zfs 池执行增量/连续备份?

如何在异地持续/增量备份 zfs 池?

我认识到send/receive通过 ssh 是一种方法,但是它需要手动管理快照。

我发现了一些工具,但大多数不再受支持。

一个看起来很有希望的工具是https://github.com/jimsalterjrs/sanoid然而,我担心不广为人知的工具可能会弊大于利,因为它可能会破坏/删除数据。

如何执行连续/增量 zfs 备份?

答案1

虚拟文件系统是一个令人难以置信的文件系统,解决了我的许多本地和共享数据存储需求。

虽然我确实喜欢这个想法集群 ZFS只要有可能,有时它并不切实际,或者我需要存储节点在地理上进行分离。

我使用的一个用例是 Linux 应用服务器上的高性能复制存储。例如,我支持一款旧版软件产品,该产品的数据受益于低延迟 NVMe SSD 驱动器。该应用程序有一个应用程序级镜像选项,可以复制到辅助服务器,但它通常不准确,而且需要 10 分钟恢复点外包

我通过使用辅助服务器(也在类似或不同的硬件上运行 ZFS)解决了这个问题,该服务器可以是本地的、远程的或两者兼而有之。通过结合下面详述的三个实用程序,我设计了一个复制解决方案,它为我提供了连续复制、深度快照保留和灵活的故障转移选项。

zfs 自动快照-https://github.com/zfsonlinux/zfs-auto-snapshot

这只是一款方便的工具,用于启用定期的 ZFS 文件系统级别快照。我通常在生产卷上按照以下时间表运行:

# /etc/cron.d/zfs-auto-snapshot

PATH="/usr/bin:/bin:/usr/sbin:/sbin"

*/5 * * * * root /sbin/zfs-auto-snapshot -q -g --label=frequent --keep=24 //
00 * * * * root /sbin/zfs-auto-snapshot -q -g --label=hourly --keep=24 //
59 23 * * * root /sbin/zfs-auto-snapshot -q -g --label=daily --keep=14 //
59 23 * * 0 root /sbin/zfs-auto-snapshot -q -g --label=weekly --keep=4 //
00 00 1 * * root /sbin/zfs-auto-snapshot -q -g --label=monthly --keep=4 //

Syncoid(Sanoid)-https://github.com/jimsalterjrs/sanoid

此程序可以运行 ZFS 文件系统的临时快照/复制到辅助目标。我只使用合子产品的一部分。

假设服务器1服务器2,从运行简单命令服务器2数据来自服务器1

#!/bin/bash

/usr/local/bin/syncoid root@server1:vol1/data vol2/data

exit $?

监控-https://mmonit.com/monit/

Monit 是一款非常灵活的作业调度程序和执行管理器。默认情况下,它以 30 秒为间隔运行,但我修改了配置以使用 15 秒为基本时间周期。

每 15 秒(1 个周期)运行上述复制脚本的示例配置

check program storagesync with path /usr/local/bin/run_storagesync.sh
        every 1 cycles
        if status != 0 then alert

这很容易通过配置管理实现自动化和添加。通过将快照/复制的执行包装在 Monit 中,您可以获得集中状态、作业控制和警报(电子邮件、SNMP、自定义脚本)。


结果是我的服务器有多个月每月快照和多个回滚点及保留点:https://pastebin.com/zuNzgi0G- 另外,连续滚动的 15 秒原子复制:

# monit status

Program 'storagesync'
  status                            Status ok
  monitoring status                 Monitored
  last started                      Wed, 05 Apr 2017 05:37:59
  last exit value                   0
  data collected                    Wed, 05 Apr 2017 05:37:59
.
.
.
Program 'storagesync'
  status                            Status ok
  monitoring status                 Monitored
  last started                      Wed, 05 Apr 2017 05:38:59
  last exit value                   0
  data collected                    Wed, 05 Apr 2017 05:38:59

答案2

您可以通过两种不同的方式来实现这一点:

  1. 过去几十年来一直使用的传统文件系统无关方式,使用类似rsync或 的工具Bacula。您已经拥有经过测试且(希望)稳定的大型软件,可以针对大型部署进行定制,即使您不再使用 ZFS 也可以使用
  2. 利用 ZFS 的工具之一send/recv。这可以是你自己的解决方案,也可以是 Github 等网站上各种脚本或扩展脚本,或者功能更丰富的工具,如 Sanoid 或安心(使用 mbuffer 支持和保留计划发送/接收)。在这种情况下,您很可能找不到任何大型的“企业级”(负面意义上的)解决方案,而是只执行单一任务的工具,并且可以与其他工具结合使用以满足您的特定设置。

一般来说,我只信任源代码可用的工具,并且我会让它尽可能简单。如果使用send/recv,你不需要管理太多,你只需要删除快照n-1在本地传输和建立快照时n远程端成功。

您可以按照自己喜欢的任何方式拆分传输,甚至可以是异步的(快照不必立即接收),只要您遵守铁律,即只能发送本地当前/新的和本地上一个快照之间的差异,并且本地上一个快照是远程端最新的快照(直到备份完成并且所有内容重置)。

现在我想起来了,您可能可以在状态机中对其进行编码,然后确保不会出现任何不可预见的情况。

答案3

还可以查看 ZFS 自动备份。它易于使用且功能强大。与上述其他解决方案相比,它具有更多功能:https://github.com/psy0rz/zfs_autobackup

相关内容