ZFS: zvol über alle Festplatten im zpool neu verteilen?

12

Gibt es eine Möglichkeit, wie ZFS aufgefordert werden kann, ein bestimmtes Dateisystem über alle Festplatten in seinem Zpool zu verteilen?

Ich denke an ein Szenario, in dem ich ein ZFS-Volume mit fester Größe habe, das als LUN über FC exportiert wird. Der aktuelle zpool ist klein, nur zwei gespiegelte 1-TB-Festplatten, und der zvol beträgt insgesamt 750 GB. Wenn ich die Größe des Zpools plötzlich auf beispielsweise 12 1-TB-Festplatten erweitern würde, würde der Zvol meines Erachtens effektiv nur auf den ersten beiden Spindeln "untergebracht".

Mit welcher Methode könnte ich angesichts der Tatsache, dass mehr Spindeln = mehr IOPS das zvol auf alle 12 Spindeln umverteilen, um sie zu nutzen?

wachsen
quelle

Antworten:

8

Sie müssten Ihre Daten erneut in den erweiterten Zpool schreiben, um ihn neu auszugleichen. Andernfalls werden Ihre Schreibvorgänge im Laufe der Zeit über den gesamten Pool verteilt.

ewwhite
quelle
Ich glaube nicht, dass es einen schnellen und einfachen Weg gibt, das zu tun ...?
wachsen
7
zfs send | zfs recv
the-wabbit
Ich werde das testen - kann nicht glauben, dass etwas so Einfaches es tun würde. :)
wachsen
3
Melde dich zurück, ich habe das noch nie gemacht und bin auch neugierig.
SeltsamWill
3

Es gibt keinen Grund dafür, dass zvol nur auf den ersten Geräten gespeichert wird. Wenn Sie den Pool vergrößern, erstreckt sich ZFS über die aktualisierten Daten aller verfügbaren zugrunde liegenden Geräte. Es gibt keine feste Partitionierung mit ZFS.

jlliagre
quelle
4
Nach meiner Erfahrung ist das nicht wahr. Zwar gibt es keine "feste Unterteilung", doch ZFS verschiebt Daten außerhalb der Client-E / A-Anforderungen nicht aus eigenem Antrieb. Wenn Sie das von mir beschriebene Szenario erstellen, mehr Festplatten hinzufügen und dann auf der ursprünglichen LUN schwere E / A-Vorgänge ausführen, werden die Aktivitäten nur auf den ersten beiden Festplatten im Array angezeigt, da sich dort die Daten befinden. ewwhite weist darauf hin, dass es mit der Zeit ausgeglichen wird, aber ich bin gespannt, ob es einen schnelleren Weg gibt, dies zu tun.
wachsen
1
Entschuldigung, wenn ich unklar war. Natürlich werden die vorhandenen Daten nicht magisch verschoben. Nur aktualisierte Daten werden gleichmäßig verschoben. Das habe ich mit "neuen IOs" gemeint. Bei vorhandenen statischen Daten verbessert das Caching auch die Leistung, solange Blöcke mehrmals gelesen werden.
Juli
0

Dies ist eine "Fortsetzung" der Antwort von ewwhite:

Sie müssten Ihre Daten erneut in den erweiterten Zpool schreiben, um ihn neu auszugleichen

Ich habe ein PHP-Skript ( verfügbar auf github ) geschrieben, um dies auf meinem Ubuntu 14.04-Host zu automatisieren.

Sie müssen lediglich das PHP-CLI-Tool mit installieren sudo apt-get install php5-cliund das Skript ausführen, wobei Sie als erstes Argument den Pfad zu Ihren Pool-Daten übergeben. Z.B

php main.php /path/to/my/files

Idealerweise sollten Sie das Skript zweimal für alle Daten im Pool ausführen. Beim ersten Durchlauf wird die Laufwerksauslastung ausgeglichen, aber die einzelnen Dateien werden den zuletzt hinzugefügten Laufwerken übermäßig zugewiesen. Der zweite Durchlauf stellt sicher, dass jede Datei "fair" über die Laufwerke verteilt ist. Ich sage ziemlich statt gleichmäßig, weil es nur gleichmäßig verteilt wird, wenn Sie Laufwerkskapazitäten nicht mischen, wie ich es bei meinem RAID 10 mit Paaren unterschiedlicher Größe (4 TB Spiegel + 3 TB Spiegel + 3 TB Spiegel) bin.

Gründe für die Verwendung eines Skripts

  • Ich muss das Problem "vor Ort" beheben. Ich kann zB die Daten nicht auf ein anderes System ausschreiben, sondern hier löschen und alles wieder zurückschreiben.
  • Ich habe meinen Pool zu über 50% gefüllt, sodass ich nicht einfach das gesamte Dateisystem auf einmal kopieren konnte, bevor ich das Original löschte.
  • Wenn es nur bestimmte Dateien gibt, die eine gute Leistung erbringen müssen, kann man das Skript einfach zweimal über diese Dateien ausführen. Der zweite Durchlauf ist jedoch nur dann wirksam, wenn der erste Durchlauf die Auslastung der Laufwerke erfolgreich ausgleichen konnte.
  • Ich habe viele Daten und möchte einen Hinweis auf Fortschritte erhalten.

Wie kann ich feststellen, ob eine gleichmäßige Laufwerksauslastung erreicht wird?

Verwenden Sie das iostat-Tool über einen längeren Zeitraum (z. B. iostat -m 5) und überprüfen Sie die Schreibvorgänge. Wenn sie gleich sind, haben Sie eine gleichmäßige Verteilung erreicht. Sie sind nicht perfekt, auch in dem Screenshot unten, weil ich ein Paar 4 TB mit 2 Paaren 3 TB-Laufwerken in RAID 10 laufen lasse, so dass die beiden 4en auf etwas mehr geschrieben werden. Bildbeschreibung hier eingeben

Wenn Ihre Laufwerksauslastung "unsymmetrisch" ist, zeigt iostat in etwa den folgenden Screenshot an, in den die neuen Laufwerke überproportional geschrieben werden. Sie können auch feststellen, dass es sich um die neuen Laufwerke handelt, da die Lesevorgänge auf 0 stehen, da sie keine Daten enthalten. Bildbeschreibung hier eingeben

Das Skript ist nicht perfekt, nur eine Problemumgehung, aber es funktioniert in der Zwischenzeit, bis ZFS eines Tages eine Neuausgleichsfunktion implementiert, wie sie BTRFS hat (Daumen drücken).

Programster
quelle
Oh mein ... Wow ...
ewwhite
0

Nun, das ist ein kleiner Hack, aber da Sie die Maschine mit zvol angehalten haben, können Sie zfs das Dateisystem an eine lokale Datei auf localhost mit dem Namen bar.zvol senden und dann das Dateisystem erneut zurückerhalten. Das sollte die Daten für Sie wieder ins Gleichgewicht bringen.

zfs send tank/bar > bar.zvol

zfs receive tank/bar < bar.zvol
Christian
quelle
-1

Die beste Lösung, die ich gefunden habe, war, die Hälfte Ihrer Daten im erweiterten Pool zu duplizieren und dann die ursprünglichen duplizierten Daten zu löschen.

reco
quelle
3
Können Sie näher darauf eingehen?
ewwhite
@reco: zvols sind keine Dateisysteme, daher können Sie keine Daten auf ihnen löschen oder duplizieren. Sie könnten Daten überschreiben, aber das würde sie beschädigen, wenn Sie nicht denselben Inhalt verwenden, der sich effektiv auf die Daten auf den zugrunde liegenden Volumes erstreckt. Dies hat ewwhite jedoch bereits vor einem Jahr vorgeschlagen.
Juli
ja, du hast recht. Ich habe mich umgesehen und das gleiche Thema recherchiert. was mir klar wurde ist, dass mit zfs das umverteilen von daten über die vdevs nicht nötig ist. Wenn Sie dennoch aus irgendeinem Grund Daten duplizieren und die Originale löschen möchten, beschleunigt dies die Ausführung von zfs im Laufe der Zeit.
Reco
1
Die Weitergabe von Daten über die vdevs ist eine legitime Anforderung. Ich fürchte, Ihnen fehlt immer noch die Frage nach zvols, nicht nach Dateisystemen. Sie können keine Daten auf einem Volume duplizieren oder löschen, was keinen Sinn ergibt.
Juli
Hallo jlliagre. ja du hast recht sorry
reco