Noviembre 17

Linux SAN Multipathing

There are a lot of SAN multipathing solutions on Linux at the moment. Two of them are discussesed in this blog. The first one is device mapper multipathing that is a failover and load balancing solution with a lot of configuration options. The second one (mdadm multipathing) is just a failover solution with manuel re-anable of a failed path. The advantage of mdadm multiphating is that it is very easy to configure.

Before using a multipathing solution for a production environment on Linux it is also important to determine if the used solution is supportet with the used Hardware. For example HP doesn’t support the Device Mapper Multipathing solution on their servers yet.

Device Mapper Multipathing

Procedure for configuring the system with DM-Multipath:

  1. Install device-mapper-multipath rpm
  2. Edit the multipath.conf configuration file:
    • comment out the default blacklist
    • change any of the existing defaults as needed
  3. Start the multipath daemons
  4. Create the multipath device with the multipath

Install Device Mapper Multipath

# rpm -ivh device-mapper-multipath-0.4.7-8.el5.i386.rpm
warning: device-mapper-multipath-0.4.7-8.el5.i386.rpm: Header V3 DSA signature:
Preparing...                ########################################### [100%]
1:device-mapper-multipath########################################### [100%]

Initial Configuration

Set user_friendly_name. The devices will be created as /dev/mapper/mpath[n]. Uncomment the blacklist.

# vim /etc/multipath.conf

#blacklist {
#        devnode "*"
#}

defaults {
user_friendly_names yes
path_grouping_policy multibus

}

Load the needed modul and the startup service.

# modprobe dm-multipath
# /etc/init.d/multipathd start
# chkconfig multipathd on

Print out the multipathed device.

# multipath -v2
or
# multipath -v3

Configuration

Configure device type in config file.

# cat /sys/block/sda/device/vendor
HP

# cat /sys/block/sda/device/model
HSV200

# vim /etc/multipath.conf
devices {

device {
vendor                  "HP"
product                 "HSV200"
path_grouping_policy    multibus
no_path_retry           "5"
}
}

Configure multipath device in config file.

# cat /var/lib/multipath/bindings

# Format:
# alias wwid
#
mpath0 3600508b400070aac0000900000080000

# vim /etc/multipath.conf

multipaths {

multipath {
wwid                    3600508b400070aac0000900000080000
alias                   mpath0
path_grouping_policy    multibus
path_checker            readsector0
path_selector           "round-robin 0"
failback                "5"
rr_weight               priorities
no_path_retry           "5"
}
}

Set not mutipathed devices on the blacklist. (f.e. local Raid-Devices, Volume Groups)

# vim /etc/multipath.conf

devnode_blacklist {

devnode "^cciss!c[0-9]d[0-9]*"
devnode "^vg*"
}

Show Configured Multipaths.

# dmsetup ls --target=multipath
mpath0  (253, 1)

# multipath -ll

mpath0 (3600508b400070aac0000900000080000) dm-1 HP,HSV200
[size=10G][features=1 queue_if_no_path][hwhandler=0]
\_ round-robin 0 [prio=4][active]
\_ 0:0:0:1 sda 8:0   [active][ready]
\_ 0:0:1:1 sdb 8:16  [active][ready]
\_ 1:0:0:1 sdc 8:32  [active][ready]
\_ 1:0:1:1 sdd 8:48  [active][ready]

Format and mount Device

Fdisk cannot be used with /dev/mapper/[dev_name] devices. Use fdisk on the underlying disks and execute the following command when device-mapper multipath maps the device to create a /dev/mapper/mpath[n] device for the partition.

# fdisk /dev/sda

# kpartx -a /dev/mapper/mpath0

# ls /dev/mapper/*
mpath0  mpath0p1

# mkfs.ext3 /dev/mapper/mpath0p1

# mount /dev/mapper/mpath0p1 /mnt/san

After that /dev/mapper/mpath0p1 is the first partition on the multipathed device.

Multipathing with mdadm on Linux

The md multipathing solution is only a failover solution what means that only one path is used at one time and no load balancing is made.
Start the MD Multipathing Service

# chkconfig mdmpd on

# /etc/init.d/mdmpd start

On the first Node (if it is a shared device)
Make Label on Disk

# fdisk /dev/sda
Disk /dev/sdt: 42.9 GB, 42949672960 bytes
64 heads, 32 sectors/track, 40960 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

Device Boot      Start         End      Blocks   Id  System
/dev/sdt1               1       40960    41943024   fd  Linux raid autodetect

# partprobe

Bind multiple paths together

# mdadm --create /dev/md4 --level=multipath --raid-devices=4 /dev/sdq1 /dev/sdr1 /dev/sds1 /dev/sdt1

Get UUID

# mdadm --detail /dev/md4
UUID : b13031b5:64c5868f:1e68b273:cb36724e

Set md configuration in config file

# vim /etc/mdadm.conf

# Multiple Paths to RAC SAN
DEVICE /dev/sd[qrst]1
ARRAY /dev/md4 uuid=b13031b5:64c5868f:1e68b273:cb36724e

# cat /proc/mdstat

On the second Node (Copy the /etc/mdadm.conf from the first node)

# mdadm -As

# cat /proc/mdstat

Restore a failed path

# mdadm /dev/md1 -f /dev/sdt1 -r /dev/sdt1 -a /dev/sdt1
Category: MULTIPATH, STORAGE | Los comentarios están deshabilitados en Linux SAN Multipathing
Noviembre 17

Enabling and Disabling Multipathing in the Linux Operating System

This section describes how to enable and disable multipathing in supported versions of the Linux operating system. The following subsections are included:

About Multipathing

After cabling your server for multipath, you will see two copies of each disk from the OS since you are using two separate array paths (SAS A and B). If you want to have multiple hosts accessing disks in the array, you must first set up zoning per host as described in Chapter 3, Adding and Zoning Array Storage Using CAM.

For example, if you have created a zone in each of the array’s SAS domains that includes three disks, when entering the lsscsi command before MPxIO is installed, you will see two of each multipathed disk.

lsscsi

[1:0:0:0] disk SEAGATE ST330055SSUN300G 0B92 /dev/sda
[1:0:1:0] disk SEAGATE ST330055SSUN300G 0B92 /dev/sdb
[1:0:2:0] disk SEAGATE ST330055SSUN300G 0B92 /dev/sdc
[1:0:3:0] enclosu SUN Storage J4500 3R21 -
[2:0:0:0] disk SEAGATE ST330055SSUN300G 0B92 /dev/sdd
[2:0:1:0] disk SEAGATE ST330055SSUN300G 0B92 /dev/sde
[2:0:2:0] disk SEAGATE ST330055SSUN300G 0B92 /dev/sdf
[2:0:3:0] enclosu SUN Storage J4500 3R21 -

Once the multipath daemon is started on the host, you can see multipath details using the multipath command.

multipath -ll

35000c5000357625b dm-2 SEAGATE,ST340008SSUN0.4
[size=373G][features=0][hwhandler=0]
    \_ round-robin 0 [prio=2][active]
    \_ 1:0:1:0  sdb 8:0    [active][ready]
    \_ 2:0:1:0  sde 8:192  [active][ready]

To correlate the dm-2 dual path disks with what’s displayed in CAM (in the Host details page, see Two Hosts With Zoned Disks in CAM), use the lsscsi command with the -g option.

lsscsi -g

[1:0:0:0] disk SEAGATE ST330055SSUN300G 0B92 /dev/sda /dev/sg0
[1:0:1:0] disk SEAGATE ST330055SSUN300G 0B92 /dev/sdb /dev/sg1
[1:0:2:0] disk SEAGATE ST330055SSUN300G 0B92 /dev/sdc /dev/sg2
[1:0:3:0] enclosu SUN Storage J4500 3R21 - /dev/sg3
[2:0:0:0] disk SEAGATE ST330055SSUN300G 0B92 /dev/sdd /dev/sg4
[2:0:1:0] disk SEAGATE ST330055SSUN300G 0B92 /dev/sde /dev/sg5
[2:0:2:0] disk SEAGATE ST330055SSUN300G 0B92 /dev/sdf /dev/sg6
[2:0:3:0] enclosu SUN Storage J4500 3R21 - /dev/sg7

For each disk, CAM will report the device names from the last column in the /dev/sgN format.

To Enable Multipathing in Linux

  1. Attach a J4500 array to a server with a supported version of Linux installed.
  2. On the server, edit or create the /etc/multipath.conf file.
  3. Reboot the server.
  4. After the reboot, make sure that the OS discovers all the disks in the J4500 array either by using the Linux commands, fdisk or lsscsi.
  5. Partition any disks you want to the desired sizes.
  6. Use the Linux command modprobe to add the loadable kernel modules dm-multipath and dm-round-robin.modprobe dm-multipath

    modprobe dm-round-robin

  7. Start the multipathd daemon.For Linux SUSE 9, use the following command:

    multipathd -v0

    For other supported Linux versions, use the following command:

    service multipathd start

  8. Start the multipathing device mapper target autoconfig.multipath -v2
  9. List the multipath devices that have been created.multipath -ll

    The output should list the same number of devices as there are disks in the J4500 array. The following is an example of output:

    35000c5000357625b dm-2 SEAGATE,ST340008SSUN0.4
    [size=373G][features=0][hwhandler=0]
        \_ round-robin 0 [prio=2][active]
        \_ 0:0:0:0  sda 8:0    [active][ready]
        \_ 1:0:0:0  sdm 8:192  [active][ready]

To Disable Multipathing in Linux

  1. If a RAID volume, LVM volume, or volume mount have been placed over the device node of the multipathed disk, quiesce the volume.
  2. Use the multipath -f command to disable multipathing to a specific device.multipath -f mpath1
  3. Use the multipath -F command to disable multipathing on all multipathed devices.multipath -F

    Note – If the message map in use appears for a device when you attempt to disable multipathing, the device is still in use. You must unmount or otherwise quiesce the device before you can disable multipathing. If you cannot quiesce the device, edit the /etc/multipath.conf file to exclude the device and then reboot the server.

  4.  
Category: MULTIPATH, STORAGE | Los comentarios están deshabilitados en Enabling and Disabling Multipathing in the Linux Operating System
Noviembre 17

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

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

 

Category: MULTIPATH, MULTIPATH, STORAGE | Los comentarios están deshabilitados en Multipath : configurer plusieurs chemins pour ses accès disques externe