Gibt es eine Möglichkeit, Kuhkopien in ZFS zu erstellen?

14

Ich versuche, Kopien einiger Dateien / Verzeichnisse anzufertigen, aber von den verschiedenen mir bekannten Möglichkeiten scheinen alle nicht optimal zu sein.

Zum Beispiel kann btrfs mit der Verwendung cp --reflink=autovon Dateien schnell Kuh-Kopien erzeugen.

Was ich ausprobiert habe:

  1. Symlinks: Nein gut. Umbenannte Datei, defekter Link.
  2. Hardlinks: Besser, aber immer noch nicht gut. Änderungen an einer Datei ändern die andere, und ich möchte nicht unbedingt, dass die andere Datei geändert wird.
  3. Erstellen Sie einen Snapshot des Datasets und klonen Sie den Snapshot: Dies kann funktionieren, ist aber nicht gut. Oft suche ich nicht nach einer Kopie des gesamten Datensatzes oder nach Kopien, die sich wie ein anderer Datensatz verhalten. Dann gibt es die Eltern / Kind-Beziehungen zwischen dem Klon / Schnappschuss / Original, die meines Wissens schwer, wenn nicht unmöglich zu brechen sind.
  4. Durch Verwenden zfs send/receiveund Aktivieren von dedup wird das Dataset in ein neues Dataset repliziert: Dies vermeidet die übergeordneten / untergeordneten Beziehungen bei der Verwendung eines Klons, erstellt jedoch immer noch unnötigerweise ein anderes Dataset und leidet weiterhin unter der Verlangsamung, dass die Dateien zu 100% und zu 100% gelesen werden müssen Die Blöcke werden erneut referenziert anstatt geschrieben.
  5. Dateien kopieren und dedup seine Arbeit machen lassen: Dies funktioniert, ist aber langsam, da die Datei (en) zu 100% gelesen und dann die Blöcke erneut referenziert werden müssen, anstatt zu schreiben.

Die Verlangsamung des Sende- / Empfangsvorgangs von ZFS sowie des physischen Kopierens oder Synchronisierens wird weiter verschärft, da die meisten Dinge komprimiert gespeichert werden und während des Lesens dekomprimiert und dann komprimiert werden müssen, bevor dedup auf doppelte Blöcke verweist.

In all meinen Nachforschungen konnte ich nichts finden, das der Einfachheit von --reflink in btrfs im entferntesten ähnelt.

Gibt es eine Möglichkeit, Kuhkopien in ZFS zu erstellen? Oder ist das "physische" Kopieren und das Erledigen von Dedups die einzig wahre Option?

Killermist
quelle

Antworten:

4

Ich denke, Option 3, wie Sie oben beschrieben haben, ist wahrscheinlich die beste Wahl. Das größte Problem bei Ihren Anforderungen ist, dass ZFS dieses Copy-on-Write-Verfahren nur auf Datensatz- / Snapshot-Ebene ausführt.

Ich würde dringend empfehlen, die Verwendung von dedup zu vermeiden, es sei denn, Sie haben überprüft, dass es mit Ihrer genauen Umgebung gut funktioniert. Ich habe persönliche Erfahrung mit Dedup-Arbeiten, bis ein weiterer Benutzer oder VM-Speicher eingezogen ist, und dann fällt es von einer Leistungsklippe und verursacht eine Menge Probleme. Nur weil es so aussieht, als würde es mit Ihren ersten zehn Benutzern sehr gut funktionieren, könnte Ihr Computer umfallen, wenn Sie den elften (oder zwölften oder dreizehnten oder was auch immer) hinzufügen. Wenn Sie diesen Weg einschlagen möchten, stellen Sie unbedingt sicher, dass Sie über eine Testumgebung verfügen, die Ihre Produktionsumgebung genau nachahmt und in dieser Umgebung einwandfrei funktioniert.

Zurück zu Option 3 müssen Sie einen bestimmten Datensatz einrichten, der die einzelnen Dateisystembäume enthält, die Sie auf diese Weise verwalten möchten. Sobald Sie es eingerichtet und anfänglich gefüllt haben, machen Sie Ihre Schnappschüsse (einer pro Datensatz, der sich geringfügig unterscheidet) und stufen Sie sie in Klone um. Nie wieder den Originaldatensatz berühren.

Ja, diese Lösung hat Probleme. Ich sage es nicht, aber angesichts der Einschränkungen von ZFS ist es wahrscheinlich immer noch das Beste. Ich habe diesen Verweis auf jemanden gefunden, der Klone effektiv einsetzt: http://thegreyblog.blogspot.com/2009/05/sparing-disk-space-with-zfs-clones.html

Ich bin mit BTRFS nicht wirklich vertraut, aber wenn es die gewünschten Optionen unterstützt, haben Sie überlegt, einen separaten Server einzurichten, um diese Datasets zu unterstützen, wobei Linux und BTRFS auf diesem Server verwendet werden?

jlp
quelle
Dies ist ein guter Grund zum Nachdenken. Wenn der "Master" (und damit die Kinder) ausreichend große Änderungen benötigen, kann ein Klon des Masters erstellt, verbessert und auf die neue Master-Position befördert werden. Dann können alle Tochter-Klone, die weit genug unterschiedlich sind, von rsync bestimmte Variationen enthalten beiseite, die Klone wurden zerstört und vom neuen Meister rekonstruiert, und die Änderungen wurden vom zurückgehaltenen Material zurückgezogen. Dies sieht nicht nach einer großartigen Lösung aus, fängt jedoch an, nach einer guten Lösung auszusehen, und erspart den Aufwand für die Aktivierung der Deduplizierung. Muss darüber mehr nachdenken.
Killermist
Ja, es ist keine großartige Lösung, aber es scheint die schmerzloseste zu sein, die Sie beschrieben haben, und ich konnte an keine andere denken.
jlp
Eine Zusammenfassung Ihrer Argumentation finden Sie unter github.com/zfsonlinux/zfs/issues/405. Grundsätzlich unterstützt ZFS keine dateibasierte COW, sondern nur die Datensatz-COW, sodass es keine Entsprechung zu BTRFS gibt cp --reflink=auto.
Mtalexan
1

Option 5 ist die beste.

In Bezug auf übergeordnete / untergeordnete Datasets in Option 3 können Sie einen Klon heraufstufen, und er wird nicht länger ein untergeordnetes Element des geklonten Datasets sein. Es werden immer noch keine zusätzlichen Blöcke verbraucht. Bearbeiten: Es wurde bemerkt, dass dies nur die Eltern-Kind-Beziehung umkehrt, nicht aber zerstört.

In Bezug auf Dinge, die komprimiert / verschlüsselt werden und die die Kopie verlangsamen, ist das völlig falsch. Ihr Prozessor ist weitaus schneller als Ihr Block-Gerät (auch bei Verwendung von SSDs). Nehmen wir zum Beispiel an, es dauert 10 Sekunden, um einen Block zu lesen, aber nur eine Sekunde, um ihn zu dekomprimieren, und 2 Sekunden, um ihn zu entschlüsseln. Block 1 wird in 10 Sekunden gelesen und an die CPU gesendet. Die CPU beginnt mit dem Dekomprimieren und Entschlüsseln, während die Festplatte Block 2 liest. Die CPU beendet ihre Aufgabe in 3 Sekunden und wartet die nächsten 7 Sekunden auf der Festplatte. Die Platte hat in der Zwischenzeit genau die gleiche Zeit mit dem Lesen dieser beiden Blöcke verbracht (20 Sekunden), unabhängig davon, ob die Blöcke komprimiert sind oder nicht.

Ebenso wird beim Schreiben nur der erste Block verzögert. Die CPU komprimiert / verschlüsselt Block 1 und sendet ihn an die Festplatte. Während die Platte Block 1 schreibt, beginnt die CPU, nachfolgende Blöcke zu komprimieren / zu verschlüsseln. Die CPU kaut Blöcke viel schneller durch, als die Festplatte sie beschreiben kann, sodass dies kein Problem darstellt. (Ja, es ist komplexer als das, aber das ist das Wesentliche.)

Entschuldigen Sie die zu lange Erklärung eines kleinen Punktes in Ihrer Frage, aber ich wollte dieses Missverständnis ausräumen.

Bahamat
quelle
1
Das Heraufstufen eines Klons wechselt nur, was als übergeordnet und was als untergeordnet gilt. Es bleibt unmöglich, den Snapshot dazwischen zu zerstören, da der ursprüngliche Elternteil jetzt ein Kind des Snapshots ist, der jetzt ein Kind des beförderten Klons ist. Darüber hinaus werden immer noch unnötigerweise datensatzähnliche Konstrukte erstellt, bei denen ich nur nach Replikationen von Dateien innerhalb des Datensatzes gesucht habe.
Killermist
Außerdem muss ich bei einem Pool mit aktiviertem Dedup der Schlussfolgerung zur Verlangsamung der Komprimierung nicht zustimmen. Beim Kopieren von einem Dataset mit aktivierter Komprimierung in ein Dataset mit aktivierter Komprimierung werden Geschwindigkeiten von 5 MBit / s selten überschritten. Wenn für den einen oder den anderen Datensatz die Komprimierung deaktiviert ist, springt die Geschwindigkeit auf durchschnittlich 10-15 MBit / s. Wenn die Komprimierung auf beiden Seiten deaktiviert ist, werden bei höheren Spitzen leicht 20 MBit / s angezeigt (wahrscheinlich, weil Teile im RAM auf den Dedup-Tisch treffen, anstatt von langsameren Medien zu ziehen).
Killermist
1
Ich habe meine Antwort bezüglich des Klonens aktualisiert. Was die Komprimierung / Verschlüsselung / Deduplizierung betrifft, so werden die Verlangsamungen eher durch die Aktualisierung des DDT verursacht als durch Komprimierung oder Verschlüsselung. Nach meiner Erfahrung waren die Auswirkungen von Komprimierung und Verschlüsselung immer vernachlässigbar. Ich denke YMMV.
Bahamat