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

zfs池如何连续/增量备份到异地?

我认识到通过ssh send/receive是一种方法,但涉及到必须手动pipe理快照。

有一些工具我发现但是大多数不再被支持。

看起来很有前途的一个工具是https://github.com/jimsalterjrs/sanoid但是我担心这个非广为人知的工具可能会造成更多的伤害,因为它可能会损坏/删除数据。

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

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

    尽pipe我尽可能喜欢集群ZFS的想法,但有时候这样做不切实际,或者我需要一些存储节点的地理分离。

    我的一个用例是Linux应用程序服务器上的高性能复制存储。 例如,我支持从低延迟NVMe SSD驱动器获取数据的传统软件产品。 该应用程序具有应用程序级镜像选项,可以复制到辅助服务器,但通常不准确,并且是10分钟的RPO 。

    我已经通过在本地,远程或两者兼备的辅助服务器(也在类似或不同的硬件上运行ZFS)解决了这个问题。 通过结合下面详细介绍的三个实用程序,我制作了一个复制解决scheme,可以实现持续复制,快照保留和灵活的故障转移选项。

    zfs-auto-snapshothttps://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文件系统的临时快照/复制到一个辅助目标。 我只使用产品的syncoid部分。

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

     #!/bin/bash /usr/local/bin/syncoid root@server1:vol1/data vol2/data exit $? 

    Monithttps://mmonit.com/monit/

    Monit是一个非常灵活的作业调度程序和执行经理。 默认情况下,它的工作时间间隔为30秒,但我修改configuration为使用15秒的基准时间周期。

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

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

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


    其结果是我有服务器有多个月的快照和许多点回滚和保留在: https : //pastebin.com/zuNzgi0G – 加,连续滚动15秒primefaces副本:

    # 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 

    你有两种不同的方式可以做到这一点:

    1. 传统的,与文件系统无关的方式,在过去的几十年中,使用了rsyncBacula等工具。 在那里你已经testing了(希望是)稳定的大型软件,可以为大型部署进行定制,即使你从ZFS转换开来也可以使用
    2. 利用ZFS send/recv的工具之一。 这可以是您自己的解决scheme,也可以是Github等人的脚本或扩展脚本,也可以是更多function丰富的工具,如Sanoid或ZnapZend (带有mbuffer支持和保留计划的send / recv)。 在这种情况下,你很可能不会find任何大的“企业”(消极的)解决scheme,而是可以完成单一任务的工具,并可以与其他工具相结合来满足特定的设置。

    一般来说,我只会信任一个源代码可用的工具,我会尽可能保持简单。 如果使用send/recv ,则不必pipe理太多,只需要在远端的快照n传输和build立成功的时候删除本端的快照n-1

    你可以按你喜欢的方式拆分你的传输方式,甚至可以是asynchronous的(不需要立刻收到快照),如果你只是保持铁的规则,你只能在本地当前/新的和本地上一个快照,并且本地上一个快照是远程端的最近一个快照(直到备份完成并且一切都被重置)。

    现在我想起来了,你可以在状态机中编码,然后确保没有不可预见的情况可以通过。