Benutzer:Mdbw/LustreFS
LustreFS ist ein Clusterfilesystem für Linux. Wurde von der Firma Cluster File Systems entwickelt die 2007 von Sun gekauft wurde. Die Daten eines LustreFS liegen auf einer oder mehreren Rechnern. Der Datendurchsatz ergibt sich daher aus dem Durchsatz alles Notes über die eine Datei verteilt wurde. Der Durchsatz kann bei mehreren GB/s liegen.
Inhaltsverzeichnis |
Lustre verteilt die Metadaten auf einem Server (MDS=Meta Data Server) hier ist ein active/passiv Cluster möglich. Die Objektdaten können per Stripping auf mehrere Server (OSS=Objekt Storage Server) verteilt werden.
Fällt ein OSS aus sind die auf ihm gespeicherten Daten nicht verfügbar. Benötigt man hier Redundanz muß man aus zwei OSS jeweils auch wieder ein active/active oder active/passiv Cluster machen. Entweder mit einem Shared-Storage oder mit einer Lösung wie DRBD. Ein natives RAID1/5 der Objektdaten ist in Planung.
Als Backend verwendet Lustre ein leicht angepasstes ext3 (ext4?) Dateisystem das auch direkt als ext3 gemountet werden kann. Hier finden sich dann Dateien mit Nummern als Namen (die Objekt-ID's).
LustreFS ist besonders für folgende Anwendungen sinnvoll:
- Es wird besonders hoher Datendurchsatz benötigt
- Das Filesystem ist sehr groß oder wächst schnell oder es müssen sehr große Dateien gespeichert werden (maximale Größe einer Datei ist 1.48 PByte)
Anforderungen / Empfehlungen
- OSS Backend Storage Raid 6
- MDS Backend Storage Raid 10 (Empfohlen Linux MD Raid1 und darauf ein Stripe mit LVM. Weiterhin Kernel größer 2.6.15 mit bitmap RAID rebuild features)
- OSS Memory min. 3GB
- MDS Memory min. 4GB
Siehe auch Lustre Manual
Installation
Die Lustre Pakete finden sich aktuell in Debian Lenny. Die Patches in linux-patch-lustre sind nur für Kernel 2.6.12, 2.6.18 oder 2.6.22. Kernel 2.6.18 (oder wohl auch darunter) kann man nicht mehr mit gcc 4.3.x kompilieren (Optimierungsprobleme). Unter Lenny steht nur gcc 4.3.2 zu Verführung. Also muß man das Lenny Paket unter etch kompilieren. Kernel 2.6.22.5 habe ich als Vanilla Version zusammen mit den Debian Patches erfolgreich unter etch kompiliert.
Auf einem Debian etch System mit gcc kleiner 4.3 installiert man die Lenny Sources.
deb http://mirror.scl.ameslab.gov/debian/ etch main non-free contrib deb-src http://mirror.scl.ameslab.gov/debian/ lenny main contrib non-free
Beispiel:
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.22.5.tar.bz2 tar xjf linux-2.6.22.5.tar.bz2 cp config-2.6.18-4-686 linux-2.6.22.5/.config cd linux-2.6.22.5 make oldconfig make menuconfig # scsi einkommentiert (optional) make-kpkg --rootcmd fakeroot --added-patches=lustre --append-to-version "-lustre-1.6.5.1" --revision=20090130 kernel_image
Nun gibt es weitere Probleme. Zu dem Kernel braucht man nun noch die Lustre Kernel Module. Um die Module zu bauen braucht man das Programm dh_lintian aus dem Paket debhelper das erst in Lenny verfügbar ist. Also muß man den Kernel Source-Tree wieder zurück auf einen Lenny System kopieren und dort das Kernel Modul bauen.
tar tjf lustre.tar.bz2 cd modules/lustre m-a a-i lustre
Danach ist das Modul-Paket schon installiert und man kann das Modul mit modprobe lustre laden.
Konfiguration
Quick
Server
echo "options lnet networks=tcp0" >> /etc/modprobe.d/aliases modprobe lnet lctl network up
Nun ist das Netz konfiguriert und lctl list_nids sollte sowas ähnliches wie 192.168.0.191@tcp ausgeben.
lenny:~# dmesg|grep Lustre Lustre: Added LNI 192.168.0.191@tcp [8/256] Lustre: Accept secure, port 988
Das LNET stoppen und die Module entladen geht folgendermaßen.
lctl network unconfigure lctl modules | awk '{print $2}' | xargs rmmod
Nun legen wir ein MDT MGS sowie ein OST auf dem gleichen Host an.
mkfs.ext2 /dev/sdb mkfs.lustre --mdt --mgs --fsname=large-fs /dev/sdb mount -t lustre /dev/sdb /mnt/mdt mkfs.ext2 /dev/sdc mkfs.lustre --ost --fsname=large-fs --mgsnode=lenny@tcp0 /dev/sdc mount -t lustre /dev/sdc /mnt/ost1
Client
Das Filesystem können wir nun auf einem Client mounten. Es wird nicht empfohlen den Client und den Server auf dem gleichen Host zu beteiben. Es funktioniert kann aber zu Problemen führen.
lenny:~# lctl list_nids 192.168.0.191@tcp lenny:~# mount -t lustre 192.168.0.191@tcp:/large-fs /mnt/testfs lenny:~# df -h Dateisystem GröÃe Benut Verf Ben% Eingehängt auf [some more] 192.168.0.191@tcp:/large-fs 1008M 34M 924M 4% /mnt/testfs
Maintenance
Speicherplatz anzeigen
lenny:~# lfs df -h UUID bytes Used Available Use% Mounted on large-fs-MDT0000_UUID 895.9M 44.7M 800.0M 4% /mnt/testfs[MDT:0] large-fs-OST0000_UUID 1007.9M 302.2M 654.4M 29% /mnt/testfs[OST:0] filesystem summary: 1007.9M 302.2M 654.4M 29% /mnt/testfs
Speicher erweitern
Man kann den Speicher sehr einfach erweitern in dem man weitere OST's hinzufügt.
mkfs.ext2 /dev/sdd mkfs.lustre --fsname=large-fs --ost --mgsnode=lenny@tcp0 /dev/sdd mkdir /mnt/ost2 mount -t lustre /dev/sdd /mnt/ost2
Danach steht der Speicher sofort auf dem Client zu Verfügung.
lenny:~# lfs df -h UUID bytes Used Available Use% Mounted on large-fs-MDT0000_UUID 895.9M 44.7M 800.0M 4% /mnt/testfs[MDT:0] large-fs-OST0000_UUID 1007.9M 302.2M 654.4M 29% /mnt/testfs[OST:0] large-fs-OST0001_UUID 1007.9M 33.5M 923.2M 3% /mnt/testfs[OST:1] filesystem summary: 2.0G 335.7M 1.5G 16% /mnt/testfs
Ausfall eines OST
Wenn ein OST ausfällt friert das Dateisystem bzw. alle Zugriff darauf ein. Nach dem die Verbindung zu dem OST wieder hergestellt ist verbinden sich die Clients wieder mit dem ausgefallenen OST und beenden die angefangenen Dateioperationen.
Aushängen eines OST um einen Ausfall zu simulieren:
OSS2:~# umount /mnt/ost3
Daraufhin versucht der Client der Verbindung wieder aufzubauen. Ein der weile laufender cp hält an.
lustre:~# cat /proc/fs/lustre/osc/*/ost_server_uuid large-fs-OST0000_UUID FULL large-fs-OST0001_UUID FULL large-fs-OST0002_UUID CONNECTING lustre:~# lfs df -h UUID bytes Used Available Use% Mounted on large-fs-MDT0000_UUID 895.9M 35.9M 808.8M 4% /mnt/testfs[MDT:0] large-fs-OST0000_UUID 1007.9M 65.6M 891.1M 6% /mnt/testfs[OST:0] large-fs-OST0001_UUID 1007.9M 71.1M 885.5M 7% /mnt/testfs[OST:1] filesystem summary: 2.0G 136.7M 1.7G 6% /mnt/testfs
Nach einem Remount des OST findet der Client das OST nach ein paar Sekunden wieder und beendet den angehaltenen cp Prozess.
lustre:~# cat /proc/fs/lustre/osc/*/ost_server_uuid large-fs-OST0000_UUID FULL large-fs-OST0001_UUID FULL large-fs-OST0002_UUID FULL
Speicher reduzieren
Um den Speicher zu reduzieren bzw ein OST zu entfernen (weil ein Server z.B. ausgemustert werden soll) wird das Target auf dem MDS als Readonly markiert. Nun ermittelt man die Files die auf dem zu entfernenden OST gespeichert sind und kopiert diese an eine andere Stelle. Dabei werden sie von dem als Readonly markierten OST entfernt.
- OST auf dem MGS deaktivieren
lenny:~# lctl device_list 0 UP mgs MGS MGS 9 1 UP mgc MGC192.168.0.191@tcp 28829736-ae29-b0e7-f4b7-0e78e5bb5202 5 2 UP mdt MDS MDS_uuid 3 3 UP lov large-fs-mdtlov large-fs-mdtlov_UUID 4 4 UP mds large-fs-MDT0000 large-fs-MDT0000_UUID 5 5 UP osc large-fs-OST0000-osc large-fs-mdtlov_UUID 5 6 UP osc large-fs-OST0001-osc large-fs-mdtlov_UUID 5 7 UP ost OSS OSS_uuid 3 8 UP obdfilter large-fs-OST0000 large-fs-OST0000_UUID 7 9 UP obdfilter large-fs-OST0001 large-fs-OST0001_UUID 7 10 UP osc large-fs-OST0002-osc large-fs-mdtlov_UUID 5 lenny:~# lctl --device 10 deactivate lenny:~# cat /proc/fs/lustre/osc/*/ost_server_uuid large-fs-OST0000_UUID FULL large-fs-OST0001_UUID FULL large-fs-OST0002_UUID FULL DEACTIVATED
- Auf einem Client kann man sich nun eine Liste mit den Files erstellen die auf dem OST gespeichert sind.
lfs find --obd large-fs-OST0002_UUID /mnt/testfs/
- Diese Liste kopiert man nun um die Daten von dem deaktivierten OST auf die anderen zu übertragen (am besten per Script)
mv /mnt/testfs/test-daten /mnt/testfs/test-daten.tmp cp /mnt/testfs/test-daten.tmp /mnt/testfs/test-daten rm -r /mnt/testfs/test-daten.tmp
- Während des kopierens sieht man wie der belegte Speicher auf den noch aktiven OST's zu nimmt. Nach dem löschen der alten Daten sollte der belegte Speicher auf der zu entfernenden OST nahe null sein. Das wirklich keine Files mehr dort gespeichert sind überprüfen wir mit einem erneuten Find.
lustre:~# lfs df -h UUID bytes Used Available Use% Mounted on large-fs-MDT0000_UUID 895.9M 49.3M 795.4M 5% /mnt/testfs[MDT:0] large-fs-OST0000_UUID 1007.9M 241.6M 715.0M 23% /mnt/testfs[OST:0] large-fs-OST0001_UUID 1007.9M 236.6M 720.0M 23% /mnt/testfs[OST:1] large-fs-OST0002_UUID 1007.9M 34.0M 922.6M 3% /mnt/testfs[OST:2] filesystem summary: 3.0G 512.2M 2.3G 16% /mnt/testfs lustre:~# lfs find --obd large-fs-OST0002_UUID /mnt/testfs/
- Nun können wir das OST auch auf den Clients deaktivieren und gefahrlos abschalten.
lustre:/mnt/testfs# lctl device_list 0 UP mgc MGC192.168.0.191@tcp f5499735-0871-711c-f11b-0e01bc8ee056 5 1 UP lov large-fs-clilov-de4b3e00 1ee20432-23c5-fde6-e65d-287c42363a68 4 2 UP mdc large-fs-MDT0000-mdc-de4b3e00 1ee20432-23c5-fde6-e65d-287c42363a68 5 3 UP osc large-fs-OST0000-osc-de4b3e00 1ee20432-23c5-fde6-e65d-287c42363a68 5 4 UP osc large-fs-OST0001-osc-de4b3e00 1ee20432-23c5-fde6-e65d-287c42363a68 5 5 IN osc large-fs-OST0002-osc-de4b3e00 1ee20432-23c5-fde6-e65d-287c42363a68 5 lustre:/mnt/testfs# lctl --device 5 deactivate lustre:/mnt/testfs# lfs df -h UUID bytes Used Available Use% Mounted on large-fs-MDT0000_UUID 895.9M 49.3M 795.4M 5% /mnt/testfs[MDT:0] large-fs-OST0000_UUID 1007.9M 241.6M 714.0M 23% /mnt/testfs[OST:0] large-fs-OST0001_UUID 1007.9M 236.1M 719.5M 23% /mnt/testfs[OST:1] large-fs-OST0002_UUID: inactive device filesystem summary: 2.0G 477.8M 1.4G 23% /mnt/testfs
Siehe auch
- GlusterFS ist möglicherweise eine Alternative