Linux.raid
"md" ist ein Kernel Bestandteil von Linux mit dem man per Software ein RAID-System aufbauen kann. md stellt dem Linux System eine virtuelle Partition zur Verfügung (in der Regel "/dev/md0") die es "so" gar nicht real auf der/den Festplatte(n) gibt. Je nach RAID Level werden Schreib- Lesezugriff auf /dev/md0 durch die md-Software auf die realen Partitionen weitergegeben. RAID kann für mehr Datensicherheit sorgen (der Preis dafür ist geringe Geschwindigkeit sowie geringere Nettonutzinhalt der Partition), oder für höhere Zugriffsgeschwindigkeit (der Preis dafür die eine höhere Ausfallwahrscheinlichkeit), das alles jedoch unterhalb der Dateisystem-Ebene. Ich finde Software-RAID optimal, da das ganze Array von einem Mainboard auf ein anderes umgezogen werden kann. Auch von einem Kernel zu einem neueren. Es ist kein spezieller Controller nötig, der 2fach vorgehalten werden muss. Hier einige ausgesuchte Details - Infos ...
Vorwort
Also hier die Messergebnisse mit einem per 1GBit-LAN angebundenen Windows 7 Client. Das Netzwerk ist hier wohl das Limitierende Element.
Inbetriebnahme
Tipps
- Benutze eine eigene Platte (SSD) für Boot und Betriebssystem. Es gibt natürlich auch die Möglichkeit vom RAID Array zu booten, oder Swap oder Systempartitionen darauf zu haben, aber das ist NICHT zu empfehlen weil es auch mit Risiken verbunden ist (Wenn das vermischt wird schwächst Du die Datensicherheit, Gefahr bei Updates, Mobilität). Betrachte dein RAID Array als Verbund, den man auch mal komplett an neue Hardware anschliessen können muss.
- Benutze Level 5 (ab 3 Partitionen) für Grössen bis 5GB oder Level 6 (ab 4 Partitionen) ab 5 GB
- Benutze ein Bitmap (das ist default!), aber kein externes (dadurch schwächst Du die Datensicherheit, Stichwort Mobilität des RAID)
- Benutze Platten mit nahezu gleicher Grösse und Datenrate
- Wenn eine Platte leicht oder sehr viel grösser ist als die anderen im Verbund. Erstelle dennoch eine maximal grosse Partition. Wenn die kleinen Platten in Zukunft alle ausgefallen / ausgetauscht sind kannst Du mit --grow die RAID Partition auch vergrössern und so den zunächst ungenutzen Platz dennoch nutzen.
- Benutze Platten verschiedener Hersteller, oder verschiedene Modelle / Serien, oder verschiedene Chargen Nummern. Dies erhöht die Diversität des Ausfallmomentes.
- Mache Firmware-Updates aller Platten auf einem Windows PC vor dem Einbau
- Bei einer Wartung kann die SATA Verkabelung völlig vertauscht werden, kein Problem!
- Versuche zumindest einen SATA Port freizulassen, hier kann bei einem Plattentausch die "Neue" angeschlossen werden, ohne dass man eine bestehende Platte abziehen muss. Optimal sind z.B. 6x SATA Ports: 1x System 4x RAID6 1x frei
- Mache Dir eine Lageplan-Skizze der Platten mit folgenden Angaben:
- Lage der Platte (aus der Skizze ersichtlich)
- SATA Port Bezeichnung (z.B. "Rot"-"0", ermitteln durch Aufdruck auf dem Mainboard)
- Plattenbezeichnung (z.B. "/dev/sdb", ermitteln durch hwinfo --hdd)
- "Serien-Nummer" der Platte (z.B. "GDCCBSGGS", ermitteln durch smartctl -a /dev/sdb)
- Nummer der Platte inerhalb des RAID-Verbundes (z.B. "3", ermitteln mdadm --detail /dev/md0)
Hardware
Versuchsaufbau
- Hier 4x 1 Terrabyte Festplatten von 2 unterschiedlichen Herstellern (2x ST1000NM0011, 2x WD1003FBYX) im Software RAID 5 Verbund
- Zum Booten und für das openSuSe 11.4 System verwende ich eine Intel SSD
- Man sieht im Versuchsaufbau die 4 Festplatten auf übergrosse Kühlkörper geschraubt
Software
Partition(en) erstellen
- Auf allen RAID Platten des Verbundes: erstelle eine primäre & maximale Partition Typ "fd" (=Linux RAID autodetect)
- Es spielt keine Rolle ob eine DOS-Partitionstabelle (fdisk) oder eine GPT-Partitionstabelle (gdisk) erstellt wird
- Bei OpenSuse verwende ich gerne die Partitionsverwaltung in ...
yast
RAID Partition erstellen
- Erstelle eine raid-Partition aus den Einzelnen
mdadm --create --verbose /dev/md0 --level=6 --raid-devices=5 /dev/sd[bcdef]1
Dateisysten mounten
- Erstelle ein Filesystem auf der raid-Partition
mkfs.ext4 -m 0 /dev/md0
- "-m 0": da die Platte NICHT unsere Systemplatte ist soll für root nichts reserviert werden
- Im Internet gibt es Infos, dass ext4 auf den RAID Betrieb hin optimiert werden kann. Das passiert aber im Rahmen der Erzeugung des Systems von alleine. Die manuelle Berechnung ist hier. Es war bei mir aber immer so dass die werte passten! Hier: http://busybox.net/~aldot/mkfs_stride.html aber der Link für die Berechnung der Werte.
Infos über RAID und ext4
# # Welche Platte hängt an welchem SATA-Controller? # hwinfo --disk | grep ata # # Aktueller Status des RAID Verbundes # cat /proc/mdstat # # Alle Parameter meines RAID 6 # mdadm --detail /dev/md0 # # Alle Infos über den Superblock auf jeder Disk # mdadm --examine /dev/sdb1 mdadm --examine /dev/sdc1 mdadm --examine /dev/sdd1 mdadm --examine /dev/sde1 mdadm --examine /dev/sdf1 # # Alle Parameter meines ext4 Dateisystems # tune2fs -l /dev/md0
Infos
- Sich am besten mal im Wiki über RAID Level informiern
- Das Tool unter Linux heisst mdadm, und es ist überall gut dokumentiert
http://www.ducea.com/2009/03/08/mdadm-cheat-sheet/
- Nicht erschrecken, direkt nach dem erstellen eines RAID 5 Verbundes ist da einige Zeit ein "Spare" Drive, das verschwindet aber wenn das Array vollständig erzeugt ist. Schon in dieser Phase kann das Array benutzt also beschrieben werden.
http://www.spinics.net/lists/raid/msg34976.html
Betrieb
Vollständiger Lesecheck
echo check > /sys/block/mdX/md/sync_action
- Ist die Prüfung beendet lass Dir anzeigen ob es Lesefehler gab
cat mismatch_cnt
Montoring
watch -n.4 'cat /proc/mdstat'
mdadm --detail /dev/md0
Umzug
- Das ganze Array einfach abklemmen, aber die SATA Kanal Reihenfolge auf dem neuen System wieder einhalten. Neu starten, die neue Partition mit dem richtigen FIlesystem mounten fertig.
- 3.0.101-95 nach 3.4.63-2.44 ist ohne Probleme gelungen
Vorsorglicher Austausch einer Platte
Dazu ist es von Vorteil, wenn man eine weitere SATA Schnittstelle im System frei hat. An diesen neuen Port hängt man die neue Platte. Nach dem Start schaut man mit hwinfo --disk wie der Devicename von Linux für die neue Platte vergeben wurde.
- Die neue Platte: Eine maximal grosse Linux-RAID Partition erstellen
fdisk /dev/sdd
- ... (imp pend)
- Die neue Partition der neuen Platte muss man bekannt machen
mdadm /dev/md0 --manage --add /dev/sdd1
- Die alte Partition muss ausgetauscht werden
mdadm /dev/md0 --replace /dev/sde1
- Nun erfolgt die resync-Phase
watch -n.4 'cat /proc/mdstat'
Personalities : [raid6] [raid5] [raid4] md0 : active raid6 sdd1[4](R) sdc1[1] sde1[2] sdb1[0] sdf1[3] 976504832 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/4] [UUUU] [==========>..........] recovery = 53.3% (260476332/488252416) finish=59.5min speed=63787K/sec bitmap: 0/4 pages [0KB], 65536KB chunk unused devices: <none>
- Man erkennt dass RAID-Device "2" (rot) durch "2" (grün) ersetzt wird
mdadm --detail /dev/md0
/dev/md0: Version : 1.2 Creation Time : Wed Jan 28 22:47:57 2015 Raid Level : raid6 Array Size : 976504832 (931.27 GiB 999.94 GB) Used Dev Size : 488252416 (465.63 GiB 499.97 GB) Raid Devices : 4 Total Devices : 5 Persistence : Superblock is persistent Intent Bitmap : Internal Update Time : Mon Mar 30 17:49:32 2015 State : active, recovering Active Devices : 4 Working Devices : 5 Failed Devices : 0 Spare Devices : 1 Layout : left-symmetric Chunk Size : 512K Rebuild Status : 55% complete Name : raib23:0 (local to host raib23) UUID : a9b9721a:7da8602e:313975c3:10fa337e Events : 5132 Number Major Minor RaidDevice State 0 8 17 0 active sync /dev/sdb1 1 8 33 1 active sync /dev/sdc1 2 8 65 2 active sync /dev/sde1 4 8 49 2 spare rebuilding /dev/sdd1 3 8 81 3 active sync /dev/sdf1
- Beobachte während des Resync die Temperatur aller Platten.
- Dies mache ich durch
smartctl -all /dev/sd[abcdef] | grep Airflow_Temperature
für alle Platten
- Dies mache ich durch
190 Airflow_Temperature_Cel 0x0032 071 056 000 Old_age Always - 29
190 Airflow_Temperature_Cel 0x0022 072 072 045 Old_age Always - 28 (Min/Max 26/28)
190 Airflow_Temperature_Cel 0x0022 071 069 045 Old_age Always - 29 (Min/Max 28/29)
190 Airflow_Temperature_Cel 0x0022 055 048 045 Old_age Always - 50 (Min/Max 45/51)
190 Airflow_Temperature_Cel 0x0022 062 059 045 Old_age Always - 38 (Min/Max 38/41)
Vermindere die Sync Leistung massiv ggf. so lange bis die Platten wieder unter 45 Grad sind, durch
echo "5000" /sys/block/md0/md/sync_speed_max
es wird wohl schwer sein ein gutes Mittelmass zu finden, bei mir war es
echo "60000" /sys/block/md0/md/sync_speed_max
Full speed ist ja
echo "200000" /sys/block/md0/md/sync_speed_max
- Erst nachdem der Resync durch ist, steht die auszubauende Platte auf (F)
# cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] md0 : active raid6 sdd1[4] sdc1[1] sde1[2](F) sdb1[0] sdf1[3] 976504832 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/4] [UUUU] bitmap: 0/4 pages [0KB], 65536KB chunk unused devices: <none>
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Jan 28 22:47:57 2015
Raid Level : raid6
Array Size : 976504832 (931.27 GiB 999.94 GB)
Used Dev Size : 488252416 (465.63 GiB 499.97 GB)
Raid Devices : 4
Total Devices : 5
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Mon Mar 30 18:59:42 2015
State : active
Active Devices : 4
Working Devices : 4
Failed Devices : 1
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Name : raib23:0 (local to host raib23)
UUID : a9b9721a:7da8602e:313975c3:10fa337e
Events : 5136
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
4 8 49 2 active sync /dev/sdd1
3 8 81 3 active sync /dev/sdf1
2 8 65 - faulty /dev/sde1
- Nun muss man dieses noch aus dem Array entfernen
mdadm /dev/md0 --manage --remove /dev/sde1
Vergrößern
- Im obigen Schritt habe ich alle 512 GB Platten Schritt für Schritt durch 2 TB Platten ausgetauscht. Es gab immer ein "reboot" weil ich Platten entfernen und neue anklemmen musste - aber niemals war ein unmount des Dateisystems nötig.
- Auch für die folgenden Schritte war kein unmount nötig - alles erfolgte "online" mit ext4 gemountet!
- mdadm --grow ausführen, um das Array wachsen zu lassen
- mdadm --grow /dev/md0 --size=max
- Das Dateisystem vergrössern
- resize2fs /dev/md0
- Nun noch beobachten was der "grow" verursacht. ext4 merkt davon nix.
watch -n.4 'cat /proc/mdstat'
Every 0.4s: cat /proc/mdstat Wed Apr 1 00:15:16 2015 Personalities : [raid6] [raid5] [raid4] md0 : active raid6 sdd1[7] sdc1[4] sdb1[5] sdf1[6] 3906764800 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/4] [UUUU] [=====>...............] resync = 29.3% (573007872/1953382400) finish=327.4min speed=70255K/sec bitmap: 3/4 pages [12KB], 262144KB chunk unused devices: <none>
Autostart
- mit systemd.mount
- joe /etc/systemd/system/srv-smb-ra6.mount
[Unit] Description=srv-smb-ra6 [Mount] What=/dev/md0 Where=/srv/smb/ra6 [Install] WantedBy=local-fs.target