Stockage, iSCSI, Multipath et Linux

Ou comment faire tomber tout ce beau monde en marche, assez simplement :)

De quoi parle-t-on ?

iSCSI

iSCSI c’est un protocole pour accéder à un disque, un morceau de disque, bref à un espace de stockage à travers le réseau (via des adresses IP).

Dit autrement, vous avez une machine avec plein de disques d’un côté du réseau, et une machine avec une (ou plusieurs) cartes réseau et vous souhaitez accéder à vos disques directement via le réseau ? C’est ce que permet de faire iSCSI.

Multipath

Le multipath, comme le nom peut le laisser entendre, c’est permettre d’accéder à la même chose par plusieurs chemins.

Appliqué au stockage, ça veut dire qu’on va accéder sur la même ressource de stockage via plusieurs liens, ce qui permet d’avoir de la redondance en cas de perte, et éventuellement, une répartition de charge. Ça peut être vu de manière équivalente à ce qui avait décrit dans ce billet, sur le bonding réseau.

Mise en pratique

Ici, je ne vais pas expliquer comment partager la ressource de stockage. Plusieurs raisons :

  • On utilise en général des technologies de stockage différentes les unes des autres, et chacune a ses propres manières de faire la partie « serveur » (target) ;
  • La ressource de stockage peut être via Ceph/RDB, une baie dédiée (type Dell, IBM, EMC²), du VSAN VMware, une grappe raid… ou un simple disque dur.

En termes de stockage, lorsqu’on partage un espace qui sera vu comme un disque, on appelle ça un LUN (Logical Unit Number), on doit donc définir sur l’équipement qui fait le stockage que le LUN numéro xyz sera publié pour le serveur Charlie. Pour ça, on présente le LUN dans un target et ce target au serveur. Il peut y avoir plusieurs LUN dans le même target et, à ma connaissance, un LUN ne peut pas être dans plusieurs targets.

Puisque l’on souhaite mettre du multipath ensuite, on doit donc s’assurer que le target sera joignable par plusieurs addresses IP (qui seront potentiellement sur des équipements réseau différents le long du chemin, sinon on se retrouve avec un SPoF qu’on va chercher à éviter).

Une fois le LUN « publié » depuis notre serveur Linux, on va pouvoir attacher ce volume au serveur.

Sur CentOS/RedHat, il faut installer le paquet iscsi-initiator-utils ; pour Debian/Ubuntu, il faut installer open-iscsi.

Dans les deux cas, on se retrouve avec une commande : iscsiadm.

iscsiadmin

Avant de commencer, on va (re)définir quelques valeurs par défaut qui sont plus adaptées pour la suite.

Ces réglages se font dans le fichier /etc/iscsi/iscsid.conf

Il y a quelques variables qui peuvent être définies, elles permettent d’avoir des mots de passe et du chiffrement, ce n’est pas obligatoire mais fortement recommandé.

node.session.auth.authmethod = CHAP
node.session.auth.username = username
node.session.auth.password = password!
discovery.sendtargets.auth.authmethod = CHAP
discovery.sendtargets.auth.username = username
discovery.sendtargets.auth.password = password!

Cette valeur doit être modifiée, elle définit au bout de combien de secondes une session iSCSI qui n’est plus valable (par exemple le chemin réseau est KO) l’erreur sera remontée au-dessus. Vu autrement, au bout de combien de secondes, en cas de perte, on aura des erreurs et le LUN sera vu comme hors ligne, comme nous allons mettre du multipath ensuite, il est préférable d’avoir cette valeur à 0.

node.session.timeo.replacement_timeout = 0

Une fois les options modifiées, lancez ou relancez le service iscsid.

Une fois ces réglages faits, avec la commande iscsiadm on va demander à la partie stockage, d’envoyer la liste des « targets » auquels le serveur a accès.

# iscsiadm -m discovery -t sendtargets -p 10.10.199.4
10.10.199.4:3260,2 iqn.1998-01.com.foo:4beb2e86-9c13-45f7-be3d-5eb96b7b62a6

On répète la même commande pour toutes les IP où notre LUN est joignable.

Une fois l’ensemble des discovery réalisés, la commande suivante permet de passer en ligne tous les LUNs.

# iscsiadm -m node -L all

Si vous faites la commande lsblk -pS vous devriez voir plusieurs nouveaux disques (ici de sdb à sdm, je vous laisse deviner la solution de stockage utilisée :)).

# lsblk -pS
NAME     HCTL       TYPE VENDOR   MODEL             REV TRAN
/dev/sda 0:0:0:0    disk VMware   Virtual disk     2.0  
/dev/sdb 8:0:0:0    disk VMware   Virtual SAN      0001 iscsi
/dev/sdc 3:0:0:0    disk VMware   Virtual SAN      0001 iscsi
/dev/sdd 9:0:0:0    disk VMware   Virtual SAN      0001 iscsi
/dev/sde 10:0:0:0   disk VMware   Virtual SAN      0001 iscsi
/dev/sdf 8:0:0:1    disk VMware   Virtual SAN      0001 iscsi
/dev/sdg 3:0:0:1    disk VMware   Virtual SAN      0001 iscsi
/dev/sdh 9:0:0:1    disk VMware   Virtual SAN      0001 iscsi
/dev/sdi 10:0:0:1   disk VMware   Virtual SAN      0001 iscsi
/dev/sdj 8:0:0:2    disk VMware   Virtual SAN      0001 iscsi
/dev/sdk 3:0:0:2    disk VMware   Virtual SAN      0001 iscsi
/dev/sdl 9:0:0:2    disk VMware   Virtual SAN      0001 iscsi
/dev/sdm 10:0:0:2   disk VMware   Virtual SAN      0001 iscsi

Le multipath

Pour configurer le multipath, ça va être relativement plus simple à faire. Sous CentOS/RHEL, il faut installer le paquet device-mapper-multipath et sous Debian/Ubuntu : multipath-tools.

Ensuite, il suffit de créer le fichier /etc/multipath.conf avec le contenu suivant :

defaults {
    user_friendly_names  yes
    find_multipaths      yes
    features             "1 queue_if_no_path"
    path_grouping_policy failover
    no_path_retry         100
}

Une relance du service multipathd suffit en général pour prendre en compte les modifs.

Il est possible d’être plus specifique dans le fichier de configuration mais dans le cas présent, ces options suffisent pour nos besoins.

Une fois fait, la commande multipath -l permet de lister les différents agrégats de disque réalisés :

# multipath -l
mpathd (1VMware_VITDEVIDc7593159e1fd795a1d02901b0eafc51b) dm-4 VMware  ,Virtual SAN     
size=400G features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=0 status=enabled
| `- 8:0:0:2  sdj 8:144 active undef running
|-+- policy='service-time 0' prio=0 status=enabled
| `- 9:0:0:2  sdl 8:176 active undef running
|-+- policy='service-time 0' prio=0 status=active
| `- 3:0:0:2  sdk 8:160 active undef running
`-+- policy='service-time 0' prio=0 status=enabled
  `- 10:0:0:2 sdm 8:192 active undef running
mpathc (1VMware_VITDEVIDa05931591221cbf9f449901b0eafc615) dm-3 VMware  ,Virtual SAN     
size=200G features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=0 status=enabled
| `- 8:0:0:1  sdf 8:80  active undef running
|-+- policy='service-time 0' prio=0 status=active
| `- 3:0:0:1  sdg 8:96  active undef running
|-+- policy='service-time 0' prio=0 status=enabled
| `- 9:0:0:1  sdh 8:112 active undef running
`-+- policy='service-time 0' prio=0 status=enabled
  `- 10:0:0:1 sdi 8:128 active undef running
mpatha (1VMware_VITDEVID3dc72e59d49bb331d68b901b0eafc615) dm-2 VMware  ,Virtual SAN     
size=100G features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=0 status=enabled
| `- 3:0:0:0  sdc 8:32  active undef running
|-+- policy='service-time 0' prio=0 status=enabled
| `- 8:0:0:0  sdb 8:16  active undef running
|-+- policy='service-time 0' prio=0 status=active
| `- 9:0:0:0  sdd 8:48  active undef running
`-+- policy='service-time 0' prio=0 status=enabled
  `- 10:0:0:0 sde 8:64  active undef running

Ici, on se retrouve avec 3 disques, mpathd, mpathc, et mpatha qui sont joignables par 4 chemins différents.

Pour l’usage ensuite, on accèdera non plus à sdX mais à mpathX, ainsi l’abstraction multipath permet de garantir l’accès au stockage.

 

 

Haut de page