Proxmox : multipathing disk

Bonjour à tous,

Aujourd'hui, un billet portant sur le multipathing disk.

La situation : un cluster de Proxmox 5 (Debian 9) hébergé sur un châssis Nec FlexPower (Intel MFSYS35) composé de 3 lames. Le châssis possède 2 contrôleurs SAS sur lequel un storage pool est créé qui acceuille les lun pour le stockage des VMs.

Pour pouvoir utiliser les deux contrôleurs en actif/passif, il est nécessaire d'installer un paquet :

root@guerech:~# apt install multipath-tools

Si le stockage où est installé l'OS est également un lun (ce qui est mon cas), un second paquet est nécessaire :

root@guerech:~# apt install multipath-tools-boot

Il est nécessaire de créer le fichier de configuration /etc/multipath.conf.

Avant de l'écrire, il est nécessaire de récupérer certaines informations comme le vendeur et le type de baie :

root@guerech:~# cat /sys/block/sda/device/vendor
Intel 
root@guerech:~# cat /sys/block/sda/device/model
Multi-Flex

Il reste à obtenir les id des disques. Dans mon cas ayant 2 contrôleurs, chaque lun sera présent avec 2 disques :

root@guerech:~# /lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sda
222ff000155ae54b3
root@guerech:~# /lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sdb
222bb0001558b0b23
root@guerech:~# /lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sdc
222ff000155ae54b3
root@guerech:~# /lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sdd
222bb0001558b0b23

On voit donc que le lun0 est présent via les disques sda et sdc, le lun1 avec les disques sdb et sdd.

Il reste le fichier de configuration /etc/multipath.conf à écrire :

devices {
        device {
        vendor                  "Intel"
        product                 "Multi-Flex"
        path_grouping_policy    "group_by_prio"
        uid_attribute           "ID_SERIAL"
        prio                    "alua"
        path_checker            tur
        path_selector           "round-robin 0"
        hardware_handler        "1 alua"
        failback                immediate
        rr_weight               uniform
        rr_min_io               100
        no_path_retry           queue
        features                "1 queue_if_no_path"
        product_blacklist       "VTrak V-LUN"
        }
}

multipaths {
        multipath {
                wwid 222ff000155ae54b3
                alias system_lun0
        }
        multipath {
                wwid 222bb0001558b0b23
                alias data_lun0
        }
}

Un petit détail des différentes options :

  • vendor : nom du constructeur de la baie
  • product : modèle de la baie
  • path_grouping_policy : définit la méthode de sélection du chemin
  • uid_attribute : attribut pour udev définissant l'identifier du chemin unique
  • prio : génère les paramètres de path depuis ALUA-SCSI3
  • path_checker : définit la méthode utilisée pour tester les paths
  • path_selector : définit le type d'algorithmes utiliser pour choisir le prochain chemin
  • hardware_handler : le gestionnaire de matériel pour gérer les lun
  • failback : spécifie un failback immédiat sur le chemin avec la priorité la plus haute
  • rr_weight : définit les priorités de sélection de chemin
  • rr_min_io : définit le nombre d'I/O avant de changer de chemin
  • no_path_retry : laisse les I/O en queue en attendant le rétablissement du chemin
  • features : définit les fonctionnnalités pour mapper les périphériques
  • product_blacklist : spécifie une regex pour blacklister certains devices
  • alias : définit un nom au lun donné

Il est possible de voir un détails des options ici :
https://www.mankier.com/5/multipath.conf
https://help.ubuntu.com/lts/serverguide/multipath-dm-multipath-config-file.html

Il est possible de lister les différents lun de présent :

root@guerech:~# multipath -ll
data_lun0 (222bb0001558b0b23) dm-1 Intel,Multi-Flex
size=920G features='2 queue_if_no_path retain_attached_hw_handler' hwhandler='1 alua' wp=rw
|-+- policy='round-robin 0' prio=50 status=active
| `- 0:0:0:1 sdb 8:16 active ready running
`-+- policy='round-robin 0' prio=1 status=enabled
  `- 0:0:1:1 sdd 8:48 active ready running
system_lun0 (222ff000155ae54b3) dm-0 Intel,Multi-Flex
size=80G features='2 queue_if_no_path retain_attached_hw_handler' hwhandler='1 alua' wp=rw
|-+- policy='round-robin 0' prio=50 status=active
| `- 0:0:0:0 sda 8:0  active ready running
`-+- policy='round-robin 0' prio=1 status=enabled
  `- 0:0:1:0 sdc 8:32 active ready running

J'ai créé un LVM par-dessus, il est à créer sur /dev/mapper/data_lun0 :

root@guerech:~# fdisk -l /dev/mapper/data_lun0 
Disk /dev/mapper/data_lun0: 920 GiB, 987842478080 bytes, 1929379840 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
root@guerech:~# pvs
  PV                            VG     Fmt  Attr PSize   PFree
  /dev/mapper/data_lun0         vmdata lvm2 a--  920.00g    0 

Il ne reste plus qu'à l'utiliser comme vous le souhaitez!

Have a nice day.