Multipath : configurer plusieurs chemins pour ses accès disques externe

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

Nous allons aborder ici 2 points :

  • Les devices mapper
  • Le multipathing

Nous avons besoin de comprendre comment fonctionne les device mapper avant d'attaquer le multipathing, c'est pourquoi il y aura une explication sur les 2 dans cette documentation.

Dans le noyau Linux, la carte des périphériques (device-mapper en anglais) sert de framework générique pour créer une projection d'un périphérique bloc ("mapper" le périphérique) sur un autre. Elle est à la base de LVM2 et EVMS, des RAIDs logiciels, ou encore du chiffrage de disque; et offre des fonctionnalités supplémentaires telles que l'instantané de système de fichiers (file-system snapshot).
La carte des périphériques fonctionne en traitant les données que lui transmet un périphérique bloc virtuel (fourni par elle-même), et en passant les données résultantes à un autre périphérique bloc.

Le Multipathing permet d'avoir plusieurs chemin pour accéder aux même données. Ceci a pour but d'augmenter les capacités d'accès aux données si l'équipement de stockage le permet (actif/actif) et d'assurer de la redondance en cas de panne d'un équipement, tel qu'un contrôleur. Voici a quoi ressemble une architecture faite de multipathing :

Multipath.png

Cela fonctionne également très bien avec un seul SAN.

2 Device Mapper

Les Device mapper sont très rarement utilisés manuellement. Ce sont généralement des couches supérieurs qui les utilisent tel que LVM. Néanmoins, nous allons voir comment s'en servir.

Pour ajouter une partition dans device mapper :

Command dmsetup
dmsetup create <device> <map_table>

  • device : nom du device a créer
  • map_table : est un fichier qui doit contenir les règles de mapping, exemple :
Configuration File map_table
0 409600 linear /dev/sdal 0
409600 2048000 linear /dev/sda2 0

Si je souhaites créer un device mapper, je peux le faire en une ligne de commande également et sans fichier :

Command dmsetup
echo "0 `blockdev --getsize /dev/sda1` linear /dev/sda1 0" | dmsetup create mynewdm

Il existe plusieurs type de mapping tagets :

  • linera : allocation continue
  • stripped : allocation segmentée entre tous les périphériques
  • erreur : pour générer des erreurs (idéale pour le dev et tests)
  • snapshot - périphérique copy-on-write
  • snapshot-origin : mapping vers un volume originial
  • zero - sparse block devices (équivalent à /dev/null)
  • multipath : multi routes pour une connection à un périphérique

Pour voir toutes les devices mapper disponibles :

Command dmsetup
> dmsetup table
myvg-rootvol: 0 10092544 linear 8:3 2048

Pour supprimer un device mapper :

Command dmsetup
dmsetup remove <disk>

Pour lister tous les devices mapper sous forme d'arbre :

Command dmsetup
dmsetup ls --tree

Dm-tree.png


3 Multipathing

3.1 Installation

Le multipath n'est pas quelque chose d'installé de base, nous allons donc avoir besoin d'installer un package :

Command yum
yum install device-mapper-multipath

Puis nous allons charger les modules et passer le service en persistant :

Command
modprobe dm_multipath
modprobe dm-round-robin
chkconfig multipathd on

3.2 Configuration

Si vous n'avez pas de fichier de configuration, prenez en un dans la doc :

Command cp
cp /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf /etc/

Multipath utilise une notion de groupes allant de 0 à 1024 (du plus prioritaire au moins). Un seul groupe est actif à la fois. Un groupe peut contenir plusieurs chemins.

Nous allons passer à la configuration de notre service de multipathing (je ne présente que les lignes essentielles) :

Configuration File /etc/multipath.conf
...
# Blacklist all devices by default. Remove this to enable multipathing
# on the default devices.
#blacklist {
#        devnode "*"
#}
## Use user friendly names, instead of using WWIDs as names.
defaults {
        user_friendly_names yes
}
##
## Here is an example of how to configure some standard options.
##
#
defaults {
        udev_dir                /dev
        polling_interval        10
        selector                "round-robin 0"
        path_grouping_policy    multibus
        getuid_callout          "/lib/udev/scsi_id --whitelisted --device=/dev/%n"
        prio                    alua
        path_checker            readsector0
        rr_min_io               100
        max_fds                 8192
        rr_weight               priorities
        failback                immediate
        no_path_retry           fail
        user_friendly_names     yes
}
blacklist {
       wwid 26353900f02796769
       devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
       devnode "^hd[a-z]"
}
...

Je vous conseil fortement de regarder le man pour le choix des options ci dessus.

Nous allons pouvoir démarrer notre service :

Command service
service multipathd start

3.3 Utilisation

Voici l'ordre et les outis à utiliser pour la détection de disques, cette section est très importante :

  1. Les devices : partprobe /dev/<device> (ex: sda)
  2. Les device-mapper : kpartx -a /dev/<device-mapper> (ex: dm-1)
  3. Le multipath : partprobe /dev/mapper/<multipath> (ex: mpath0)

Si nous souhaitons voir les paths actifs :

Command multipath
multipath -l

Pour créer des partitions sur un device mapper multipathé, il faut absolument le faire sur le disque sous jassent (ex: /dev/sda) et non le device mapper multipathé ! Donc la procédure consiste a créer sa partition avec fdisk par exemple, puis faire détecter sa nouvelle partition :

Command
partprobe /dev/sda
partprobe /dev/sdb
kpartx -a /dev/mapper/mpath0

4 FAQ

4.1 Je ne vois toujours pas mes nouveaux LUN, comment rafraichir ?

Il est possible que la création de nouveaux LUN/partition nécessite un nouveau scan pour les détecter. Nous allons avoir besoin de ce package :

Command yum
yum install sg3_utils

Puis lançons le scan :

Command rescan-scsi-bus.sh
rescan-scsi-bus.sh

Ou sinon, nous pouvons le faire directement avec /proc.

  • Si c'est sur une plateforme de type SCSI :
Command echo
echo "- - -" > /sys/class/scsi_host/<HBA>/scan

  • Si c'est pour une baie Fibre Optique :
Command echo
echo "1" > /sys/class/fc_host/<HBA>/issue_lip
echo "- - -" > /sys/class/scsi_host/<HBA>/scan

4.2 Je n'arrive pas à voir correctement ma nouvelle partition, comment m'y prendre ?

Voici comment procéder lorsque l'on rencontre un problème lors de la création d'une partition sur un multipath. Prenons cette exemple  :

  • Je ne vois pas mpath0p2 sur 1 machine, alors que sur les autres machines, je les voit :
Command ls
> ls /dev/mpath/
mpath0  mpath0p1

  • Je vérifie que je vois bien ma partition sur les 2 paths (sda2 et sdb2) :
Command fdisk
> fdisk -l
 
Disk /dev/hda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
 
   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14         274     2096482+  8e  Linux LVM
/dev/hda3             275         339      522112+  82  Linux swap / Solaris
 
Disk /dev/sda: 5368 MB, 5368709120 bytes
166 heads, 62 sectors/track, 1018 cylinders
Units = cylinders of 10292 * 512 = 5269504 bytes
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1          10       51429   83  Linux
/dev/sda2              11         770     3910960   8e  Linux LVM
 
Disk /dev/sdb: 5368 MB, 5368709120 bytes
166 heads, 62 sectors/track, 1018 cylinders
Units = cylinders of 10292 * 512 = 5269504 bytes
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1          10       51429   83  Linux
/dev/sdb2              11         770     3910960   8e  Linux LVM
 
Disk /dev/dm-1: 5368 MB, 5368709120 bytes
166 heads, 62 sectors/track, 1018 cylinders
Units = cylinders of 10292 * 512 = 5269504 bytes
 
     Device Boot      Start         End      Blocks   Id  System
/dev/dm-1p1               1          10       51429   83  Linux
 
Disk /dev/dm-2: 52 MB, 52663296 bytes
255 heads, 63 sectors/track, 6 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
 
Disk /dev/dm-2 doesn't contain a valid partition table

S'assurer que dans la configuration, il n'y a pas des options de blacklist qui m'empêcherait de voir correctement les devices. Pour cela, nous allons commenter toutes les parties blacklist :

Configuration File /etc/multipath.conf
#blacklist {
#       wwid 26353900f02796769
#       devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
#       devnode "^hd[a-z]"
#}

  • On voit que /dev/dm-1p1 est présent, mais pas le 2 (tout du moins qu'il y a une erreur). Je vérifie de nouveau qu'il n'y a aucune présence de mon dm-2 :
Command ls
> ls -l /dev/dm-1
brw-rw---- 1 root root 253, 1 Mar  1 13:42 /dev/dm-1

Command ls
> ls -l /dev/mapper/
total 0
crw------- 1 root root  10, 62 Mar  1 13:41 control
brw-rw---- 1 root disk 253,  1 Mar  1 13:42 mpath0
brw-rw---- 1 root root 253,  2 Mar  1 14:06 mpath0p1
brw------- 1 root root 253,  0 Mar  1 13:41 myvg0-mylv0

  • On voit que "253, 1" correspond à /dev/dm-1. On va faire un kpartx et partprobe sur les 2 pour rafraichir les paths :
Command
kpartx -a /dev/dm-1
kpartx -a /dev/dm-2
partprobe /dev/mapper/mpath0

Même si vous avez des erreurs du type :

device-mapper: create ioctl failed: Device or resource busy

Ce n'est pas grâve, ça lui permet de rafriachir la liste des devices mapper.

  • Et là ça marche :
Command ls
> ls -l /dev/mapper/
total 0
crw------- 1 root root  10, 62 Mar  1 13:41 control
brw-rw---- 1 root disk 253,  1 Mar  1 13:42 mpath0
brw-rw---- 1 root root 253,  2 Mar  1 14:06 mpath0p1
brw-rw---- 1 root disk 253,  3 Mar  1 14:19 mpath0p2brw------- 1 root root 253,  0 Mar  1 13:41 myvg0-mylv0

5 Ressources

http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5/html-single/DM_Multipath/index.html