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


25

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

我知道send/receiveover ssh是一种方法,但是其中涉及到必须手动管理快照。

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

看起来很有前途的一种工具是https://github.com/jimsalterjrs/sanoid,但是我担心,不为人所知的工具可能会危害大于危害,因为它可能破坏/删除数据。

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


2
我会稍后再回答,但是我有一个解决方案,该解决方案从主ZFS服务器到辅助ZFS服务器每15秒执行一次这种类型的复制。
ewwhite

Answers:


33

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 //

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

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

假设使用server1server2,则从server2运行简单命令以从server1中提取数据:

#!/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

4
感谢您的发布,您的答案是惊人的,而且正是我想要的(从延迟到监视过程)。还阅读github.com/ewwhite/zfs-ha/wiki,我印象深刻。再次谢谢您:)
Greg

6

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

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

通常,我只会信任源代码可用的工具,并且会尽可能地简化它。如果使用send/recv,则无需过多管理,只需在远程端传输和建立快照n成功后,只需在本地删除快照n-1

您可以按照自己喜欢的任何方式拆分传输,甚至可以异步传输(不必立即接收快照),如果您只保留铁规则,即您只能在本地当前/新快照与本地先前快照之间发送差异, ,并且本地的先前快照是远程端的最新快照(直到备份完成并且所有内容都重置为止)。

现在,我想到了,您可能可以在状态机中对其进行编码,然后确保不会发生无法预料的情况。


我不知道rsync基于解决方案的解决方案如何扩展到连续复制大型企业级文件系统。变化发生的速度比rsync发现变化的速度快。
安德鲁·亨利

2
@AndrewHenle我也不主张这样做,我只想介绍它,因为问题没有指定数据的范围/大小或时间范围。因此,如果操作不频繁,则可能与文件系统无关。当然,您将失去漂亮的块级增量...
user121391 '04

@ user121391完全同意您将开源作为发展之道。感谢您的详细回复。
Greg

@Dave就像我在键入...
ewwhite '17

1
强烈推荐znapzend
Trent Lloyd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.