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

Gre*_*reg 30 backup zfs incremental-backup zfsonlinux

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

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

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

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

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

eww*_*ite 46

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

虽然我确实喜欢尽可能使用集群 ZFS的想法,但有时它不切实际,或者我需要存储节点的一些地理分离。

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

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

zfs-auto-snapshot - 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 //
Run Code Online (Sandbox Code Playgroud)

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

该程序可以运行 ZFS 文件系统到次要目标的临时快照/复制。我只使用产品的同步部分。

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

#!/bin/bash

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

exit $?
Run Code Online (Sandbox Code Playgroud)

监控- 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
Run Code Online (Sandbox Code Playgroud)

这很容易通过配置管理实现自动化和添加。通过在 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
Run Code Online (Sandbox Code Playgroud)

  • 感谢您发帖,您的回答非常出色,正是我所寻找的(从延迟到监控过程)。还阅读了 https://github.com/ewwhite/zfs-ha/wiki,我印象非常深刻。再一次谢谢你 :) (4认同)

use*_*391 8

您有两种不同的方法可以做到这一点:

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

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

您可以按您喜欢的任何方式拆分您的传输,它甚至可以是异步的(不必立即接收快照),如果您只是遵守只能在本地当前/新快照和本地先前快照之间发送差异的铁律,并且本地先前的快照是远程端的最新快照(直到备份完成并且一切都被重置)。

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

  • @AndrewHenle 我也不提倡它,我只是想提出它,因为这个问题没有指定数据的范围/大小或时间范围。因此,在不频繁操作的情况下,如果它应该与文件系统无关,则可能是可能的。当然,你会失去漂亮的块级增量...... (2认同)