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

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

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

Beispielsweise kann btrfs mithilfe von cp --reflink=autoschnell Kuhkopien von Dateien erstellen.

Was ich versucht habe:

  1. Symlinks: Nicht gut. Datei umbenannt, Link defekt.
  2. Hardlinks: Besser, aber immer noch nicht gut. Änderungen an einer Datei ändern auch die andere, und ich möchte nicht unbedingt, dass die andere Datei geändert wird.
  3. Erstellen Sie einen Snapshot des Datensatzes und klonen Sie dann den Snapshot: Das kann funktionieren, aber nicht gut. Oft suche ich nicht nach einer Kopie des gesamten Datensatzes oder danach, dass sich die Kopien wie ein anderer Datensatz verhalten. Dann gibt es die Eltern-/Kind-Beziehungen zwischen dem Klon/Snapshot/Original, die meines Wissens schwer, wenn nicht gar unmöglich zu unterbrechen sind.
  4. Verwenden Sie zfs send/receiveund aktivieren Sie die Deduplizierung, um den Datensatz in einen neuen Datensatz zu replizieren: Dadurch werden die Eltern-/Kind-Beziehungen vermieden, die bei der Verwendung eines Klons auftreten, es wird jedoch trotzdem unnötigerweise ein weiterer Datensatz erstellt und die Geschwindigkeit leidet immer noch darunter, dass die Dateien zu 100 % gelesen und die Blöcke erneut referenziert statt geschrieben werden müssen.
  5. Dateien kopieren und Deduplizierung 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 sie zu schreiben.

Die Langsamkeit des Sendens/Empfangens von ZFS und des physischen Kopierens oder Rsyncings wird noch dadurch verstärkt, dass die meisten Dinge komprimiert gespeichert sind und während des Lesens dekomprimiert und dann komprimiert werden müssen, bevor die Deduplizierung einsetzt, um auf doppelte Blöcke zu verweisen.

Bei all meinen Recherchen konnte ich nichts finden, das auch nur annähernd an die Einfachheit von --reflink in btrfs heranreicht.

Gibt es also eine Möglichkeit, in ZFS Cow-Copys zu erstellen? Oder ist „physisches“ Kopieren und die Deduplizierung die einzige echte Option?

Antwort1

Ich denke, dass die Option 3, die Sie oben beschrieben haben, wahrscheinlich die beste ist. Das größte Problem bei dem, was Sie wollen, ist, dass ZFS dieses Copy-on-Write wirklich nur auf Datensatz-/Snapshot-Ebene handhabt.

Ich würde dringend davon abraten, Dedup zu verwenden, es sei denn, Sie haben überprüft, dass es in Ihrer genauen Umgebung gut funktioniert. Ich habe persönliche Erfahrungen damit, dass Dedup großartig funktioniert, bis ein weiterer Benutzer oder VM-Speicher hinzugefügt wird, und dann bricht die Leistung ein und verursacht viele Probleme. Nur weil es so aussieht, als ob es bei Ihren ersten zehn Benutzern gut funktioniert, kann Ihre Maschine abstürzen, wenn Sie den elften (oder zwölften, dreizehnten oder was auch immer) hinzufügen. Wenn Sie diesen Weg gehen möchten, stellen Sie unbedingt sicher, dass Sie eine Testumgebung haben, die Ihre Produktionsumgebung genau nachahmt, und dass sie in dieser Umgebung gut funktioniert.

Zurück zu Option 3: Sie müssen einen bestimmten Datensatz einrichten, um alle Dateisystembäume zu speichern, die Sie auf diese Weise verwalten möchten. Sobald Sie ihn eingerichtet und anfänglich gefüllt haben, erstellen Sie Ihre Snapshots (einen pro Datensatz, der sich leicht unterscheidet) und wandeln Sie diese in Klone um. Berühren Sie den ursprünglichen Datensatz nie wieder.

Ja, diese Lösung hat Probleme. Ich sage nicht, dass sie keine hat, aber angesichts der Einschränkungen von ZFS ist sie wahrscheinlich immer noch die beste. Ich habe diesen Hinweis auf jemanden gefunden, der Klone effektiv nutzt:http://thegreyblog.blogspot.com/2009/05/sparing-disk-space-with-zfs-clones.html

Ich kenne mich mit btrfs nicht so gut aus, aber wenn es die von Ihnen gewünschten Optionen unterstützt, haben Sie schon einmal darüber nachgedacht, einen separaten Server nur zur Unterstützung dieser Datensätze einzurichten und auf diesem Server Linux und btrfs zu verwenden?

Antwort2

Option 5 ist die beste.

In Bezug auf übergeordnete/untergeordnete Datensätze in Option 3 können Sie einen Klon hochstufen, der dann kein untergeordnetes Element des geklonten Datensatzes mehr ist. Es werden trotzdem keine zusätzlichen Blöcke verbraucht. Bearbeiten:Beachten Sie, dass hierdurch die Eltern-Kind-Beziehung nur umgekehrt und nicht zerstört wird.

Dass Dinge komprimiert/verschlüsselt werden und das Kopieren dadurch verlangsamt wird, ist völlig falsch. Ihr Prozessor ist viel schneller als Ihr Blockgerät (selbst bei Verwendung von SSDs). Nur als Beispiel: Nehmen wir an, dass das Lesen eines Blocks 10 Sekunden dauert, das Dekomprimieren jedoch nur eine Sekunde und das Entschlüsseln nur 2 Sekunden. 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 mit dem Lesen von Block 2 beginnt. Die CPU beendet ihre Aufgabe in 3 Sekunden und verbringt dann die nächsten 7 Sekunden damit, auf die Festplatte zu warten. Die Festplatte hat inzwischen genau dieselbe Zeit (20 Sekunden) damit verbracht, diese beiden Blöcke zu lesen, 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 Festplatte Block 1 schreibt, beginnt die CPU mit dem Komprimieren/Verschlüsseln nachfolgender Blöcke. Die CPU verarbeitet die Blöcke viel schneller, als die Festplatte sie schreiben kann, daher ist das kein Problem. (Ja, es ist komplexer als das, aber das ist der Kern der Sache.)

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

verwandte Informationen