Erfahrungsbericht meiner Server-Erweiterung

-Nuke-

Well-Known Member
Heyho,

ich finde solche Berichte immer spannend und lehrreich, darum schreibe ich auch mal einen.

Hier mal ein Bericht über meinen Weg, das RAIDZ2 auf meinem Server neu zu machen, um effizient mehr Speicher zu bekommen. Ergo: 4 weitere Platten hinzufügen. Dazu muss das RAID komplett neu aufgebaut werden. Daher müssen die Daten ja irgendwo hin. Knapp 8TB in der Summe.

Zum Glück hatte ich noch einen älteren Server, der 9TB fassen konnte. Der musste zwar erst mal durchs halbe Land transportiert werden, aber schließlich war er da. Leider war das RAIDZ1 im System nicht zusammengefasst. Es waren also zwei Pools. Weiterhin ging der Server auch nicht so den Weg des "Best Practise". Raw Disc ohne Partition, unsinnige Labels und ashift von 9.

Also als erstes den alten Server komplett neu machen, das RAID dort neu aufbauen in "richtig". Dazu habe ich erst mal die Daten die nicht schon auf meinem neuen Server waren, auf ihn Übertragen. Mit rsync. Wie sich herausgestellt hat war der alte Athlon II X2 mit der Verschlüsselung von SSH sehr stark überfordert. Knapp 50MB/s und 90% CPU Last. Aber egal, zweiten rsync-Prozress gestartet, nun zwei mal 50M/s und der Lüfter heulte :D

Dann das RAID neu gemacht. Erst mal mit zpool destroy, glabel destroy und gpart destroy um mich geworfen und alles gesäubert. Die gpt Labels waren nun die Seriennummer der Festplatten und die Größe der Partition war so groß wie minimal angegeben. D.h.
Code:
gpart add -a 4K -s 3000000000000B -t freebsd-zfs -l WD-12345 ada0
usw. So kann man beim Defekt sorglos die Platte tauschen. Anschließend einen großen Pool erzeugt aus 2 raidz1. Ist nötig, weil dort 3x1.5TB und 3x3TB verbaut ist.

Nun müssen die Daten ja wieder rüber, damit ich meinen neuen Server neu machen kann. Da ich ja nun gelernt habe, dass für die alte CPU die SSH-Verschlüsselung keine NOOP ist, habe ich den Weg über netcat genommen.

Auf dem Empfänger also folgendes gestartet:

Code:
nc -l 8080 | zfs receive -vFd datatank

Auf dem Sender nun erst mal einen Snapshot gemacht:

Code:
zfs snapshot -r datatank@migration

Und nun rüber mit den Daten:

Code:
zfs send -R datatank@migration | nc 192.168.123.30 8080

Das dauerte nun etwas über einen Tag.

Nun liest man im Netz so einige Horrorgeschichten über zfs send und recv... Berichte von kaputten Pools nach der Übertragung, die ZFS nicht bemerkt. Kaputte Datenstrukturen etc. pp. Auch wenn ich nicht vermutet habe, dass mir das passiert, weil der Bericht schon etwas älter war und vllt falsch ausgeführt wurde, wollte ich auf Nummer sicher gehen. Ich wollte alle Daten auf meinem Pool katalogisieren und mit ihrer SHA512 Checksumme vermerken. Das war nach langem hin und her dann doch möglich (der print0 Parameter war die Magie) :

Code:
find /datatank/ -type f -print0 | xargs -0 shasum -a 512 -b >> ~/datatank.sha512

So kann ich nach der Übertragung prüfen ob alles richtig ist:

Code:
shasum -c ~/datatank.sha512

Das dauert dann zwar wieder eine halbe Ewigkeit, aber sicher ist sicher!

Jetzt waren die Daten also auf dem zweit-Server. Somit also die Platten in den neuen Server einbauen und das RAID im gleichen Sinne neu aufbauen, nur auf dem neuen Server.

Da ich aber nun auf dem neuen Pool die Daten global mit lz4 Kompression speichern wollte, konnte ich natürlich nun nicht einfach wieder zfs send/recv nehmen. Also ein aderer Weg, der nicht rsync ist, wegen der Performance.

Der Weg hieß zunächst tar.

Auf dem Empfänger also folgendes gestartet:

Code:
nc -l 8080 | tar -xpf -

Auf dem Sender nun:

Code:
tar -cf - /datatank | nc 192.168.123.30 8080

So, das brach nun nach einer ganzen Weile ab, weil ihn ein paar Sonder/Steuerzeichen in einigen Dateinamen wohl durcheinander gebracht hat. Zumindest wurde mir ein korrupter tar-Header um die Ohren geworfen. Ich hab mich dann erst mal auf die Suche nach Dateien gemacht, welche irgendwelche Sonderzeichen beinhalten. Das konnten eigentlich gar nicht so viele sein. Also:

Code:
find . | perl -ne 'print if /[^[:ascii:]]/'

Das zeigt natürlich auch Datein an welche ein äöüß usw. im Namen haben. Aber wie vermutet, war das jetzt nicht die Welt und einige wenige Dateien hatten wirklich noch irgendwelche Copy&Paste Steuerzeichen drin (Windows kriegt sowas immer toll hin!). Naja, jetzt wollte ich aber nicht wieder tar nehmen, weil der hätte ja von vorne angefangen. Also geschaut, wie ich ggf. rsync beschleunigen kann. Und es ging sogar!

Code:
rsync -avP -e "ssh -c arcfour" FreeBSDServer:/datatank/music /datatank/

Die "arcfour" Verschlüsselung tat der schwachen CPU im anderen Server besser und ich erreichte auch mit rsync so 95-110MB/s.

So, damit war der Umzug abschlossen. Die globale lz4 Kompression sparte in etwa 30GB ein. Das ist jetzt bei knapp noch 13TB freien Speicher sicherlich nicht die Welt, aber warum verschenken? Jetzt läuft noch die Checksummenprüfung, aber bisher ist alles i.O. Aber das hab ich bei dem zuletzt verwendeten rsync auch erwartet.

Als Sidenote:

Die Inbetriebnahme des SAS Controllers stellte sich dann doch etwas als Herausforderung heraus. Das BIOS/EFI stellte nach dem Einbau mal einfach das Booten ein. Nach dem BIOS-Boot Auswahl-Menü passierte einfach nichts, egal von was man booten wollte. Nach kurzer Recherche liegt es wohl daran, dass es zu viele Option ROMs gab. Mit SATA Controller auf dem Board, der SAS-Karte, der zwei GBit NICs auf dem Board und USB war das wohl übergelaufen. Ich hatte dann das Booten von den NICs und das PCIe Option ROM im EFI deaktiviert und dann fuhr das System wenigstens hoch. Als erste Maßnahme hab ich dem Controller auch gleich das aktuelle BIOS aufgespielt und mit einem Trick auch gleich das interne RAID-Zeug ausgetrieben. Anschließend hat FreeBSD den Controller und die Platten daran tadellos erkannt.
 
Da ich aber nun auf dem neuen Pool die Daten global mit lz4 Kompression speichern wollte, konnte ich natürlich nun nicht einfach wieder zfs send/recv nehmen.

Bisher hab ich da Widersprüchliches gehört. Gibt es noch weitere Quellen, die Licht darin bringen, ob die Daten eines Streams auf dem Ziel-FS komprimiert werden, wenn dort Komprimierung aktiv ist?

Rob
 
Bisher hab ich da Widersprüchliches gehört. Gibt es noch weitere Quellen, die Licht darin bringen, ob die Daten eines Streams auf dem Ziel-FS komprimiert werden, wenn dort Komprimierung aktiv ist?
Rob

Wenn ich beim zfs recv das "-F" weggelasse, dann beschwert er sich, dass der Pool "datatank" bereits vorhanden ist. Mit "-F" überschreibt er alle vorhandenen Pools. Weiterhin haben die Pools nach dem recv bei mir alle Eigenschaften von meinem "send"-Pool mit dem Hinweis "received" daneben (habe diese Flags nie gesetzt auf dem Ziel-Server!).

Außerdem: Wenn zfs send, die Eigenschaften des Pools ändern würde, wäre das u.U. fatal ;) Weil wenn ich einen gzip-9 Pool habe, dann kann es sein, dass die Daten auf einem nicht-gzip-9 Pool gar nicht draufpassen.
 
Hallo Nuke,

schön gemacht, bei mir erreiche ich aber fast 1:2 mit lz4, hast du viele Komprimierte Dateien?

Gruss Jörg
 
Hallo Nuke,

schön gemacht, bei mir erreiche ich aber fast 1:2 mit lz4, hast du viele Komprimierte Dateien?

Gruss Jörg

Jop. Viele Videodaten, Musik, Bilder und CD-Images (alte DOS-Spiele etc.). Ich denke am meisten bringt es bei all den Daten die z.B. Kodi so anlegt (.nfo-Dateien), Images mit viel "Platz drin" und die Header einiger Dateien.
 
Genau dies steht mir auch in den nächsten Tagen bevor. Habe mir auch ein neues NAS zusammengebaut :)

Zum kopieren der Daten, hättest du rsyncd (rsync als Daemon) verwenden können. Damit komme ich ziemlich gut ans Limit von 1GBit/s.
 
ich muss gestehen das genau diese Komprimierten daten nicht auf das lz4 VOl kommt. :-)
Aber bei meinen VMs habe ich 14 TB auf 4 runter. :-)
und es ist wirklich schnell, Xeon 3040 über 400 MB/s.
 
Zurück
Oben