Wie kann ich Daten in zfs neu ausgleichen? (Stellen Sie sicher, dass die Daten auf alle gestreiften Spiegel verteilt sind.)

8

Wenn am Beispiel eines gestreiften Spiegels (Raid 10) zwei Datenträger auf vier erweitert werden, wie können die Daten von den beiden Datenträgern zwischen den beiden Spiegeln "neu ausgeglichen" (verteilt) werden?

Das heißt, wie können die Dateien, die auf einen Spiegel geschrieben wurden, auf zwei Spiegel geschrieben werden, um die gestreiften Festplatten zu nutzen?

Greg
quelle
1
Planen Sie Ihre Infrastruktur besser.
ewwhite
4
@ewwhite Manchmal hast du diese Option nicht.
Moshe Katz
3
@ewwhite Und manchmal kann Wachstum nicht richtig vorausgesehen werden, weil es vom Außenmarkt abhängt. Ihr Rat wäre nur gültig, wenn Sie auch eine Arbeitszeitmaschine hätten.
user121391

Antworten:

7

Nur neu geschriebene (angehängte) Daten werden auf alle derzeit aktiven vdevs aufgeteilt. In ZFS gibt es keine explizite Neuausgleichsoperation.

Zwei mögliche Lösungen:

  1. Warten Sie, bis alle alten Daten erneut geschrieben wurden (aufgrund von CoW kann dies sehr lange dauern, im schlimmsten Fall doppelt so lange wie das vollständige Schreiben der Festplatte).
  2. Entfernen Sie alle Daten und schreiben Sie sie erneut (zfs send / recv ist hilfreich, um alle Daten aus dem Pool und zurück zu holen, ohne etwas zu verlieren). Dies muss nicht auf einmal durchgeführt werden, und es kann auf demselben Pool durchgeführt werden.

Genauer gesagt würde ich die zweite Lösung wählen und jedes Dateisystem zu Zeiten mit geringer Systemlast (z. B. nachts) separat übertragen:

  • zfs snapshot -rMachen Sie einen Schnappschuss ( ) eines Dateisystems mit angemessener Größe (und rezidivierender Dateisysteme mit rekursiver Größe).
  • Verwenden Sie diese zfs send | zfs recvOption mit den entsprechenden Optionen, um den Snapshot an ein neu erstelltes temporäres Dateisystem zu senden (kann sich im selben Pool befinden, wenn der Speicherplatz dies zulässt). Dieses Dateisystem sollte sich in der Hierarchie an derselben Stelle befinden wie das alte
  • Nachdem der Kopiervorgang abgeschlossen ist (kann einige Zeit dauern, da die Datenträger lesen und schreiben müssen), werden zfs destroyder alte Snapshot und das alte Dateisystem erstellt
  • zfs rename das temporäre System zum alten Namen
  • Überprüfen und ändern Sie die Einhängepunkte mit und ändern Sie zfs mountdie vorherige Situation für Ihr ersetztes Dateisystem
  • Wiederholen, bis alle Dateisysteme verschoben sind
user121391
quelle
1

mögliche dritte Lösung (wie durch SirMaster in dieser FreeNAS - Forum erwähnte Post ):

  • Fügen Sie zpool neue Datenträger hinzu
  • Kopieren Sie viele Dateien in ein anderes neues Verzeichnis / mnt / pool / temp /
  • Originaldateien löschen: rm -rf original/
  • umbenennen dir zurück: mv temp/ original/

Dies funktioniert, weil ZFS Schreibvorgänge proportional zu dem vdev platziert, der den meisten freien Speicherplatz hat, in diesem Fall zu den brandneuen Laufwerken, die leer waren. (Ab Version 0.7 bevorzugt zfs schnellere Laufwerke für Schreibvorgänge . Nehmen wir jedoch an, dass Ihre beiden neuen Laufwerke die gleiche oder eine höhere Leistung aufweisen als die ursprünglichen Laufwerke.)

Es ist wahrscheinlich langsamer als zfs send | zfs recv, aber einfacher, weil Sie keine Schnappschüsse erstellen / zerstören müssen.

Sie können zpool list -vvorher und nachher ausführen, um jede vdev-Auslastung anzuzeigen.

Außerdem wurde ein PHP- Skript gefunden , das die Prozedur zum Kopieren / Löschen / Umbenennen Datei für Datei ausführt. Dies wurde in einer Antwort auf eine ähnliche (aber zvol) Frage verknüpft, die einige Jahre älter war. (habe dieses Skript nicht persönlich getestet)

jason_uruguru
quelle