Erfahrungsbericht: RAID1 zu RAID10 online konvertieren

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
Benutzeravatar
heisenberg
Beiträge: 3902
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Erfahrungsbericht: RAID1 zu RAID10 online konvertieren

Beitrag von heisenberg » 10.07.2024 14:46:38

Ich habe habe hier gerade ein Linux Software-RAID von einem RAID1 online in ein RAID10 umgewandelt. Die Erfahrungen dazu möchte ich hier gerade mal teilen.

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
5. RAID1 zu RAID0 migrieren

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
Das dauerte dann ca. 5 Stunden. Danach kann man sehen, dass jetzt nur noch ein RAID0 mit einer Platte konfiguriert ist, mit dem Befehl:

Code: Alles auswählen

mdadm --misc --detail /dev/md0
Den Befehl empfehle ich nach jedem mdadm-Schritt, um den aktuellen Status des Arrays zu sehen.

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
Auch das dauert wieder ca. 5 Stunden. Danach ist es ein RAID10 mit 2 aktiven Platten und 2 Hot-Spares. Also quasi ein RAID10, dass ein RAID1 ist. Jetzt müssen noch die 2 zusätzlichen Platten als aktiv hinzugenommen werden. Das geht dann so:

Code: Alles auswählen

mdadm --grow /dev/md0 --raid-devices=4
Ich meine, dass hätte auch mindestens 5 Stunden gedauert. Danach ist das RAID10 so wie es sein soll.

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
So sieht jetzt das fertige RAID aus:

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
9. EFI-Partition spiegeln

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
10. Grub installieren

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
Wichtig: Grub wird auf das Gerät installiert nicht auf eine Partition. Ich bin da selbst durcheinander gekommen, weil die Bezeichnung der NVMe-Geräte leicht anders ist, als die von herkömmlichen Platten.

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.

juhuu
Beiträge: 25
Registriert: 27.06.2020 17:56:13

Re: Erfahrungsbericht: RAID1 zu RAID10 online konvertieren

Beitrag von juhuu » 04.09.2024 09:13:11

Vielen Dank für Deine Beschreibung.
Werde solches mangels Anwendung und fehlender HW nicht umsetzen, aber interessant und sehr gut ist die Beschreibung.

Antworten