Verhindert Git eine Datenverschlechterung?

40

Ich habe gelesen, dass ZFS und Btrfs Prüfsummen verwenden, um eine Verschlechterung der Daten zu verhindern , und ich habe gelesen, dass Git Integrität hat, indem es im Wesentlichen alles mit jedem Commit hascht.

Ich wollte einen Git-Server auf einem Linux-NAS mit Btrfs-RAID 1 als Speicher verwenden, aber wenn Git über Integrität verfügt, ist dies vermutlich nicht erforderlich (zumindest nicht, wenn ich nur die Verhinderung von Datenverschlechterungen möchte).

Frage: Verhindert oder hilft Gits Integrität, obwohl sie im Wesentlichen alles mit jedem Commit hat, gegen Bit-Rot?

MADforFUNandHappy
quelle
10
Die berühmte KDE -Katastrophe von 2013 ist hier etwas relevant.
Iwillnotexist Idonotexist
3
Und hüte dich vor lokalen Klonen, git versucht, feste Links zu verwenden, wenn Sie einen Klon auf demselben Dateisystem erstellen. Das macht das Klonen unglaublich schnell, aber wenn ein Objekt beschädigt wird, sind beide Klone beschädigt.
Allo
Beachten Sie, dass, wenn die Beschädigung nur für einige alte Objekte auf einem bestimmten Computer auftritt, diese Objekte mit größerer Wahrscheinlichkeit auf anderen Klonen des Repos vorhanden sind, während die (weniger) neueren Dateien möglicherweise noch verwendbar sind. Ich habe jedoch keine Ahnung, wie dies in Packdateien integriert wird.
o11c

Antworten:

61

Das Hashing von Git findet nur zu dem Zeitpunkt statt, an dem Commits erstellt werden, und von da an werden die Hashes verwendet, um die Commits zu identifizieren. Dies stellt in keiner Weise die Integrität der Dateien sicher. Git-Repos können beschädigt werden und Daten verlieren. Tatsächlich hat git einen eingebauten Befehl, um diese Art von Verlust zu erkennen, git fsck , aber wie in der Dokumentation angegeben, sind Sie dafür verantwortlich, beschädigte Daten aus Sicherungen wiederherzustellen.

heavyyd
quelle
4
Warum sieht es fsckfür mich immer nach einem schlechten Wort aus ... Ich nehme an, wenn es positiv
ausfällt
7
@ CAD97 Programmierer sind für diese relativ lahmen Wortspiele bekannt. Eigentlich ist es ziemlich üblich ... Aus meinem Kopf haben Sie Dinge wie sh (Shell), bsh (Borowski-Shell) und dann bash (Borowski-Shell) ... der letzte ist das lahme Wortspiel ...
Nelson
1
@ Nelson nicht vergessen, Fisch
user253751
@ CAD97 Verdammt, der Name des Git selbst kann so angesehen werden, als ob er nicht richtig für dich funktioniert.
SGR
1
@ CAD97 - und das ist, bevor Sie es mit Flags wie fvcctk ausführen - weil - wenn Sie es so ausführen, können Ihre Daten bereits "fvcctk" ed sein. ;)
Joe
16

Kommt darauf an, was du mit "verhindern" meinst.

(Erstens ist bit-rot ein Begriff mit mehreren Definitionen. Bei dieser Frage geht es nicht darum, dass Code aufgrund mangelnder Wartung nicht mehr ausgeführt werden kann .)

Wenn Sie mit "verhindern" meinen, dass es wahrscheinlich eine Beschädigung durch Zerfall von Bits erkennen wird, ja, das wird funktionieren. Es wird jedoch nicht helfen, diese Beschädigung zu beheben: Die Hashes bieten nur eine Fehlererkennung, keine Korrektur .

Dies ist im Allgemeinen das, was unter "Integrität" zu verstehen ist : Die Möglichkeit, unbefugte / unbeabsichtigte Manipulationen von Daten zu erkennen , nicht die Möglichkeit, diese zu verhindern oder zu korrigieren.

Sie möchten im Allgemeinen immer noch ein RAID1 zusammen mit Sicherungen (möglicherweise mit ZFS-Snapshots oder ähnlichem implementiert, ich kenne die ZFS-Semantik für RAID1 + -Snapshots nicht), und zwar aus mehreren Gründen:

  • Wenn eine Festplatte ausfällt, benötigen Sie entweder ein RAID1 (oder ein aktuelles Backup), um Ihre Daten wiederherzustellen. Keine Fehlerkorrektur kann einen Ausfall der gesamten Festplatte beheben, es sei denn, sie verfügt über eine vollständige Kopie der Daten (RAID1). Für eine kurze Ausfallzeit benötigen Sie im Wesentlichen RAID1.

  • Wenn Sie versehentlich Teile oder das gesamte Repository löschen, benötigen Sie ein Backup (RAID1 schützt Sie nicht, da es sofort die Änderung aller Geräte widerspiegelt).

Block-Level-RAID1 (z. B. über LVM oder ähnliches) mit nur zwei Festplatten an sich schützt Sie jedoch nicht vor unbeaufsichtigtem Datenverfall: Der RAID-Controller kann nicht wissen, welche der beiden Festplatten die richtigen Daten enthält. Dazu benötigen Sie zusätzliche Informationen, beispielsweise eine Prüfsumme über Dateien. Hier werden die ZSF und Btrfs Prüfsummen kommen: sie verwendet werden können (was nicht heißt, dass sie sich in diesen Fällen verwendet werden, ich weiß nicht , wie ZFS oder Btrfs Dinge dort handhaben ) , die von den beiden Scheiben zu unterscheiden hält die richtigen Daten.

Jonas Schäfer
quelle
5
Sie müssen nicht spiegeln, wenn Sie dies nicht möchten. ZFS unterstützt Striping mit Paritätswerten von 1, 2 oder 3 Laufwerken. und Spiegeln mit einer beliebigen Anzahl von Laufwerken (einschließlich eines einzelnen Laufwerks = keine Redundanz). Mein wichtigster Massenspeicher ist ZFS mit sechs Laufwerken in einer RAIDZ2-Konfiguration, bei der es sich im Grunde um RAID6 auf Dateisystemebene handelt (Striping mit zwei redundanten Laufwerken). Dies kann den Verlust eines dieser Laufwerke sowie nicht korrigierbare Fehler auf einem weiteren Laufwerk erkennen und beheben. oder der Verlust von zwei Laufwerken und keine Fehler an anderer Stelle während des Resilvers; ohne Datenverlust. Backups werden weiterhin empfohlen.
ein Lebenslauf vom
1

Bit-Rot verhindern

Nein, überhaupt nicht. Es gibt keine RAID-ähnliche Redundanz, die von git eingeführt wird. Wenn die Dateien in Ihrem .gitVerzeichnis etwas verrottet sind, verlieren Sie wie gewohnt Daten.

gegen bit-rot helfen?

Jjjj ... nein. Es hilft nicht gegen Bit-Rot, aber es hilft, Bit-Rot zu erkennen. Dies geschieht jedoch zu keinem Zeitpunkt während des normalen Gebrauchs auf eigene Rechnung (natürlich auch, wenn Sie einige Objekte auschecken, aber nicht für Ihren Verlauf). Sie müssten Cron-Jobs erstellen, um die Hashes aus dem Inhalt neu zu berechnen und mit den tatsächlichen Hashes zu vergleichen. Es ist ziemlich trivial, dies zu tun, da gitHashes buchstäblich nur die Inhalts-Hashes sind. Es ist trivial, sie neu zu berechnen und git fscktut dies für Sie. Aber wenn es Bit-Rot erkennt, gibt es nichts Bestimmtes, was es dagegen tun kann. Insbesondere, da größere Blöcke automatisch komprimiert werden, wird wahrscheinlich ein vollständiger Blockverlust eintreten, wenn ein Teil in einem größeren Objekt gespiegelt wird.

AnoE
quelle