我读到 ZFS 和 Btrfs 使用校验和来防止数据降级我读到 Git 通过对每次提交的所有内容进行哈希处理来保证完整性。
我本来打算在 Linux NAS 上使用带有 Btrfs RAID 1 的 Git 服务器进行存储,但如果 Git 具有完整性,我想这就没有必要了(至少如果我只想要防止数据降级的话)。
问题: 那么,尽管 Git 在每次提交时对所有内容进行哈希处理,但它的完整性是否可以防止或有助于防止位腐烂?
答案1
Git 的哈希计算仅在创建提交时发生,从那时起,哈希就用于识别提交。这绝不能确保文件的完整性。Git 存储库可能会损坏并丢失数据。事实上,git 有一个内置命令来检测这种丢失,git fsck,但正如文档所述,您有责任从备份中恢复任何损坏的数据。
答案2
取决于你所说的“预防”是什么意思。
(首先,比特腐烂是一个有多种定义的术语。这个问题是不是关于由于缺乏维护,代码无法运行。
如果你说“防止”是指它可能会检测到位衰减造成的损坏,是的,那会起作用。然而,不是帮助修复损坏:哈希仅提供错误检测,而不是纠正。
这就是“完整性”的一般含义:探测未经授权/意外的数据操纵,无法防止或纠正。
通常,您仍然希望将 RAID1 与备份一起使用(可能使用 ZFS 快照或类似技术实现,我不熟悉 RAID1 + 快照上的 ZFS 语义),原因如下:
如果磁盘发生致命故障,您需要 RAID1(或最近的备份)来恢复数据;除非有完整的数据副本(RAID1),否则任何错误纠正都无法纠正整个磁盘故障。对于短时间的停机,您基本上必须有 RAID1。
如果您意外删除了部分或全部存储库,则需要备份(RAID1 无法保护您,因为它会立即将更改反映到所有设备上)
块级 RAID1(例如通过 LVM 或类似方式)本身只有两个磁盘不是保护您免受数据无声衰减的影响:RAID 控制器无法知道两个磁盘中的哪一个保存了正确的数据。您需要额外的信息,例如文件的校验和。这就是 ZSF 和 btrfs 校验和的作用所在:它们可以用于(这并不是说它们是在这些情况下使用,我不知道 ZFS 或 btrfs 如何处理那里的事情)来区分两个磁盘中的哪一个保存着正确的数据。
答案3
防止比特腐烂
不,绝对不会。git 不会引入类似 RAID 的冗余。如果.git
目录中的文件遭受位腐烂,您将像往常一样丢失数据。
有助于防止比特腐烂?
是的...不。它无法防止发生位腐烂,但它有助于检测位腐烂。但在正常使用过程中,它不会自行执行此操作(当然,当您检查某些对象等时它会执行此操作,但不会针对您的历史记录执行此操作)。您必须创建 cron 作业来重新计算内容的哈希值并将其与实际哈希值进行比较。这样做非常简单,因为git
哈希值实际上只是内容哈希值,重新计算它们并git fsck
为您执行此操作非常简单。但是当它检测到位腐烂时,它没有什么特别的方法可以对抗它。具体来说,由于较大的块会自动压缩,如果较大对象中的某个位被翻转,则可能会造成整个块丢失。