TL;DR
Die Online-Migration von RAID1 zu RAID10 hat absolut problemlos funktioniert, obwohl der gewählte Weg insgesamt sehr risikoreich ist.
1. Situation und Aufgabe
Es handelt sich hier um zwei Systeme eines Postgres-Clusters, Primary und StandBy-Server. Beide hatten bisher 3 x 4 TB Samsung PM9A3 / U.2/NVMe SSDs, konfiguriert als RAID-1 einer SSD als Ersatz dazu, die bisher noch nicht als Hot-Spare konfiguriert war. Dazu sind jetzt zwei weitere SSDs des gleichen Modells gekommen und das Ganze ist zu einem RAID-10 konvertiert worden. Die Migration des RAID-Arrays sollte online - also ohne Betriebsunterbrechung - durchgeführt werden.
2. Information zur Datensicherung
Ich habe hier grundsätzlich eine tägliche Sicherung. Zusätzlich gibt es Transaktionsprotokolle und tägliche Datenbankdumps.
3. Datenträger einbauen
Von meinem Hardwarelieferanten habe ich die Info bekommen, dass U.2 - Hot-Swap - obwohl von der Spezifikation für Hot-Swap vorgesehen, gemäß Erfahrung nicht zu 100% sauber funktioniert. D. h. Serverabstürze wurden da berichtet. Ich habe es trotzdem ausprobiert. Erst den StandBy-Server und dann den Primary. Es hat ohne Probleme funktioniert.
4. Datenträger Partitionieren
Anschließend habe ich die neuen Datenträger partitioniert, in dem ich die vorhandene Partitionierung einer vorhandenen SSD übernommen habe:
Code: Alles auswählen
sfdisk -d /dev/nvme0n1 | sfdisk /dev/nvme3n1
Da die Migration von RAID1 zu RAID10 nicht direkt geht, ging ich den Umweg über RAID0. Das ist der höchst riskante Teil an der Geschichte. Wenn hier etwas passiert, bedeutet das viel Extraarbeit, weil der Server aus dem Backup restauriert werden muss.
Ich habe mich nach dieser Anleitung gerichtet:
https://www.berthon.eu/2017/converting- ... 10-online/
Also erst einmal das RAID1 zu RAID0 konvertieren, mit diesem Befehl:
Code: Alles auswählen
mdadm --grow /dev/md0 --level=0 --backup-file=/home/backup-md0
Code: Alles auswählen
mdadm --misc --detail /dev/md0
6. RAID0 zu RAID10 migrieren
Danach kommt der zweite Migrationsschritt: Die Konvertierung in ein RAID10:
Code: Alles auswählen
mdadm --grow /dev/md0 --level=10 \
--backup-file=/home/md0 \
--raid-devices=4 \
--add /dev/nvme2n1p2 \
--add /dev/nvme3n1p2 \
--add /dev/nvme4n1p2
Code: Alles auswählen
mdadm --grow /dev/md0 --raid-devices=4
7. Hotspare hinzufügen
Im Zuge der Änderung möchte ich noch die zusätzliche SSD, die vorher unkonfiguriert im System hing noch als HotSpare konfigurieren.
Das geht so:
Code: Alles auswählen
mdadm --add /dev/md0 /dev/nmve1n1p2
Code: Alles auswählen
# mdadm --misc --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Mon Oct 9 16:14:36 2023
Raid Level : raid10
Array Size : 7501017088 (6.99 TiB 7.68 TB)
Used Dev Size : 3750508544 (3.49 TiB 3.84 TB)
Raid Devices : 4
Total Devices : 5
Persistence : Superblock is persistent
Update Time : Wed Jul 10 13:55:06 2024
State : active
Active Devices : 4
Working Devices : 5
Failed Devices : 0
Spare Devices : 1
Layout : near=2
Chunk Size : 64K
Consistency Policy : resync
Name : postgres08-domain:0 (local to host postgres08-domain)
UUID : 1034ec2e:3d800ba5:4e957b04:d49f20c9
Events : 33986
Number Major Minor RaidDevice State
0 259 6 0 active sync set-A /dev/nvme0n1p2
4 259 14 1 active sync set-B /dev/nvme4n1p2
3 259 12 2 active sync set-A /dev/nvme3n1p2
2 259 10 3 active sync set-B /dev/nvme2n1p2
5 259 3 - spare /dev/nvme1n1p2
8. Dateisystem vergrößern
Weiterhin muss noch das Dateisystem - bei mir ext4 - vergrößert werden. Das geht sehr einfach und schnell mit:
Code: Alles auswählen
resize2fs /dev/md0
Ebenso habe ich noch direkt die EFI-Partitionen auf allen SSDs synchronisiert. Zuerst habe ich mittels lsblk geschaut, was die aktiv gemountete EFI-Partition ist und die dann anschließend mittels dd kopiert - sind ja nur 100 MB. Grundsätzlich ist das ein NoGo, gemountete Platten mit dd zu kopieren. Aber aufgrund der statischen Natur der EFI-Partition habe ich das einfach mal so gemacht.
Code: Alles auswählen
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme2n1 259:0 0 3,5T 0 disk
├─nvme2n1p1 259:9 0 94M 0 part
└─nvme2n1p2 259:10 0 3,5T 0 part
└─md0 9:0 0 7T 0 raid10 /
nvme1n1 259:1 0 3,5T 0 disk
├─nvme1n1p1 259:2 0 94M 0 part
└─nvme1n1p2 259:3 0 3,5T 0 part
└─md0 9:0 0 7T 0 raid10 /
nvme0n1 259:4 0 3,5T 0 disk
├─nvme0n1p1 259:5 0 94M 0 part /boot/efi
└─nvme0n1p2 259:6 0 3,5T 0 part
└─md0 9:0 0 7T 0 raid10 /
nvme3n1 259:7 0 3,5T 0 disk
├─nvme3n1p1 259:11 0 94M 0 part
└─nvme3n1p2 259:12 0 3,5T 0 part
└─md0 9:0 0 7T 0 raid10 /
nvme4n1 259:8 0 3,5T 0 disk
├─nvme4n1p1 259:13 0 94M 0 part
└─nvme4n1p2 259:14 0 3,5T 0 part
└─md0 9:0 0 7T 0 raid10 /
# for id in 1 2 3 4;do dev=/dev/nvme${id}n1p1;echo $dev;dd if=/dev/nvme0n1p1 of=$dev;done
Zum Abschluss habe ich noch grub auf alle vorhandenen SSDs installiert.
Code: Alles auswählen
# for id in 0 1 2 3 4;do dev=/dev/nvme${id}n1;echo $dev; grub-install $dev;done
Einen Reboot-Test des StandBy-Servers habe ich auch nochmal durchgeführt.
Fragen
Was kann man besser machen?
Irgendwelche groben Fehler bei mir?
Gedanken
Ich habe hier bewusst auf btrfs und ZFS verzichtet, weil ich gelesen habe, dass CoW-Dateisysteme und Datenbanken sich nicht sonderlich gut vertragen.
Vielleicht ist es besser in so einem Fall das Initialsetup gleich mit einem RAID10 mit zwei Speichergeräten durchzuführen - wenn das denn möglich ist. Ursprünglich waren hier allerdings 2 TB SSDs vorgesehen, welche dann direkt ein RAID10 mit 4 Geräten ergeben hätten. Leider waren diese SSDs zum Installationszeitpunkt nicht verfügbar.