如何在异地持续/增量备份 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 $?
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
您可以通过两种不同的方式来实现这一点:
- 过去几十年来一直使用的传统文件系统无关方式,使用类似
rsync
或 的工具Bacula
。您已经拥有经过测试且(希望)稳定的大型软件,可以针对大型部署进行定制,即使您不再使用 ZFS 也可以使用 - 利用 ZFS 的工具之一
send/recv
。这可以是你自己的解决方案,也可以是 Github 等网站上各种脚本或扩展脚本,或者功能更丰富的工具,如 Sanoid 或安心(使用 mbuffer 支持和保留计划发送/接收)。在这种情况下,您很可能找不到任何大型的“企业级”(负面意义上的)解决方案,而是只执行单一任务的工具,并且可以与其他工具结合使用以满足您的特定设置。
一般来说,我只信任源代码可用的工具,并且我会让它尽可能简单。如果使用send/recv
,你不需要管理太多,你只需要删除快照n-1在本地传输和建立快照时n远程端成功。
您可以按照自己喜欢的任何方式拆分传输,甚至可以是异步的(快照不必立即接收),只要您遵守铁律,即只能发送本地当前/新的和本地上一个快照之间的差异,并且本地上一个快照是远程端最新的快照(直到备份完成并且所有内容重置)。
现在我想起来了,您可能可以在状态机中对其进行编码,然后确保不会出现任何不可预见的情况。
答案3
还可以查看 ZFS 自动备份。它易于使用且功能强大。与上述其他解决方案相比,它具有更多功能:https://github.com/psy0rz/zfs_autobackup