Oct*_*our 4 backup freenas rsync zfs
我目前有一个 FreeNAS 盒子来存储我的个人文件。我想要一个异地备份,但我不愿意花钱购买第二台能够正常运行 ZFS 的计算机。因此我打算使用 进行远程备份rsync
。
我希望备份中的所有文件保持一致,我认为可以通过首先拍摄递归快照然后使用rsync
. 然而事实证明,为每个数据集拍摄了单独的快照。
现在我想知道是否有任何方法可以查看递归快照,包括所有数据集,或者是否有其他推荐的方法来查看rsync
整个zpool
. 我认为简单地符号链接到.zfs
数据集中的文件夹不会起作用,因为我想rsync
保留数据集本身中存在的任何符号链接。
根据我收到的评论,我认为我所需的配置的一些细节已经到位。我希望在家中拥有一台 NAS,可以轻松地存放数据,并且知道我永远不会丢失它。对我来说,这意味着在现场有多个副本,在异地有多个副本,在情况变得非常糟糕时有一个离线副本,在意外删除的情况下定期对数据进行快照,以及防止数据错误(例如位腐烂)的方法。事件发生的可能性越小,我就越放松,因为在灾难发生后没有多个数据副本,我就越不关心快照。此外,我更关心旧数据而不是新数据,因为我通常在另一台设备上有一个副本。最后我应该注意到大多数文件不会经常更新。大多数传输将是新文件。
我之前的设置是一组两个带有 4TB 外部硬盘的 Raspberry Pi。我对这个策略失去了信任,但硬件已经可用。经过一番研究后发现,随着时间的推移,防止错误潜入的唯一方法似乎是使用 ZFS 等校验和文件系统以及 ECC RAM 和 UPS 等服务器级组件。对于我的本地副本,我走了这条路。我在镜像中使用 2x4TB 磁盘,并在这里定期制作快照。
该机器应该涵盖除异地和离线备份之外的所有情况。由于我很可能不需要这些备份,因此我不愿意在上面投入太多。因此,我认为我可以使用我已有的 Raspberry Pi 和外部磁盘。我可以使其中一个磁盘始终处于离线状态,而另一个磁盘正在接收备份。定期更换磁盘可以让我对旧数据进行离线备份。
最简单的方法是使用zfs send
和receive
到两个池,每个磁盘上一个。然而,Raspberry Pi 与硬盘驱动器的 USB 连接相结合,不会提供zfs
(或任何文件系统)非常可靠的操作环境。因此,我预计在此设置中会相当频繁地出现错误。由于我只使用一张磁盘,zfs
因此没有任何可靠的方法来从故障中恢复。
这就是我想与 一起使用ext3
或ext4
结合的原因rsync
。当然,一些坏位可能会被写入磁盘。就元数据而言,有一些工具可以解决大多数此类问题。如果是数据块,这将导致单个文件丢失。此外,可以使用恢复文件,rsync -c
因为这会发现不正确的校验和,并会从本地计算机上的已知良好副本再次传输文件。鉴于硬件不太理想,这似乎是最好的解决方案。
这就是我使用的理由rsync
,这导致我想到了如何rsync
递归的原始问题zfs snapshot
。如果我没有解决您的任何建议,请告诉我,因为我真的愿意接受其他选择。我只是目前不明白它们如何为我提供任何优势。
我强烈建议使用zfs send
and zfs receive
over rsync
- 它将显着更快,并且具有其他主要好处(例如:不会丢失更改、无需密钥即可加密)。
有些存储服务将为您提供将数据集推送给它们的能力(类似于使用支持的服务rsync
)。
甚至还有一个很好的工具 - ( sanoidsyncoid
项目的一部分) - 我强烈推荐。它管理快照并允许推或拉操作。
本演讲zfs send/recv
讨论和之间的差异rsync
。
作为后续行动,我刚刚从Obnam(现已退役)迁移出来,并选择了带有快照的 ZFS。我还刚刚完成了对异地存储服务的调查过程,并且(对于我需要的存储量)得出的结论是,在远程位置构建和托管计算机将比以前使用专用存储服务更便宜大约 1 年标记...当然,请做出您自己的决定。
针对您的一些言论:
我不愿意花钱购买第二台能够正常运行 ZFS 的计算机。
值得注意的是,ZFS 不必使用 ECC RAM,并且您可以轻松地在单个磁盘上运行 ZFS - 它是异地备份,因此这很可能对您来说是可以接受的。
对我来说,构建自己的机器与云存储的价格大致相同。
正如我上面提到的,我进行了一些计算并得出结论,构建一台廉价的异地机器比从服务提供商那里购买一年的“云存储”要便宜……所以我通过构建这样的机器预先支付费用,一年之内我将开始看到节省。“云存储”不是您购买的东西 - 您必须不断为其付费。
还有更多好处 - 我可以向托管我的机器的人提供服务和异地备份......在这种情况下他们根本没有。
您似乎已经准备好使用rsync
RaspberryPi,因此这里有另一个答案,其中包含一些脑力转储,希望能够帮助您找到解决方案。
现在我想知道是否有任何方法可以查看递归快照,包括所有数据集,或者是否有其他推荐的方法来 rsync 整个 zpool。
据我所知……我希望这些建议与我的其他答案一致。
如果您满足于简单地rsync
在已安装的 ZFS 池上运行,那么您可以.zfs
使用 排除目录(如果它们对您可见)rsync --exclude='/.zfs/'
,或者设置snapdir=hidden
属性。
但这会导致问题,因为每个数据集都可以安装在任何地方,并且您可能不想错过任何......
您将需要管理快照,并希望为“现在”创建一个新快照,备份它,然后可能将其删除。采用这种方法(而不是仅仅使用“实时”安装的文件系统)将为您提供一个时间点的一致备份。它还将确保您不会备份任何奇怪的层次结构或错过任何可能安装在其他地方的文件系统。
$ SNAPSHOT_NAME="rsync_$(date +%s)"
$ zfs snapshot -r ${ROOT}@${SNAPSHOT_NAME}
$ # do the backup...
$ zfs destroy -r ${ROOT}@${SNAPSHOT_NAME}
Run Code Online (Sandbox Code Playgroud)
接下来,您需要通过运行 来获取要备份的数据集的完整列表zfs list -Hrt filesystem -o name ${ROOT}
。例如,我可能想备份我的users
树,下面是一个示例:
$ zfs list -Hrt filesystem -o name ell/users
ell/users
ell/users/attie
ell/users/attie/archive
ell/users/attie/dropbox
ell/users/attie/email
ell/users/attie/filing_cabinet
ell/users/attie/home
ell/users/attie/photos
ell/users/attie/junk
ell/users/nobody
ell/users/nobody/downloads
ell/users/nobody/home
ell/users/nobody/photos
ell/users/nobody/scans
Run Code Online (Sandbox Code Playgroud)
这为您提供了您感兴趣的文件系统的递归列表......
不过,您可能想跳过某些数据集,我建议使用属性来实现此目的 - 例如,rsync:sync=false
将阻止同步该数据集。这与我最近添加到syncoid
.
下面的字段由制表符分隔。
$ zfs list -Hrt filesystem -o name,rsync:sync ell/users
ell/users -
ell/users/attie -
ell/users/attie/archive -
ell/users/attie/dropbox -
ell/users/attie/email -
ell/users/attie/filing_cabinet -
ell/users/attie/home -
ell/users/attie/photos -
ell/users/attie/junk false
ell/users/nobody -
ell/users/nobody/downloads -
ell/users/nobody/home -
ell/users/nobody/photos -
ell/users/nobody/scans -
Run Code Online (Sandbox Code Playgroud)
您还需要了解这一点,因为 ZFS 数据集可以安装在任何地方(如上所述),因此将它们视为在 VFS 中呈现的方式实际上并不合适......它们是单独的实体,您应该将它们处理为这样的。
/
为了实现这一点,我们将通过用三个下划线___
(或通常不会出现在文件系统名称中的其他分隔符)替换任何正斜杠来展平文件系统名称。
$ filesystem="ell/users/attie/archive"
$ echo "${filesystem//\//___}"
ell___users___attie___archive
Run Code Online (Sandbox Code Playgroud)
这些都可以组合成一个简单的 bash 脚本......如下所示:
注意:我只是简单地测试了这一点......并且应该有更多的错误处理。
$ SNAPSHOT_NAME="rsync_$(date +%s)"
$ zfs snapshot -r ${ROOT}@${SNAPSHOT_NAME}
$ # do the backup...
$ zfs destroy -r ${ROOT}@${SNAPSHOT_NAME}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10159 次 |
最近记录: |