¿Qué es el multipath en Linux?

El servicio de multipath es el que se encarga de configurar el sistema operativo para que sea capaz de acceder a los discos de cabina por diferentes caminos.

¿Qué significa el acceso a los discos por diferentes caminos?

Una cabina de discos tiene diferentes controladoras y switches que se cablean hasta los servidores para que el acceso a los discos esté disponible en todo momento, incluso, si existe alguna avería hardware en alguno de estos elementos.

Los servidores también tienen diferentes controladoras de acceso a la cabina.

Cada uno de los accesos es un camino diferente. Esto significa que en el sistema operativo veremos el mismo disco varias veces (por diferentes caminos).

¿Cómo configuramos el multipath en Linux RedHat?

Tanto en RedHat6 como en RHEL7, la configuración del servicio es la misma. El fichero de configuración se ubica en /etc/multipath.conf y tiene el siguiente aspecto:

Configuración por defecto

## Use user friendly names, instead of using WWIDs as names.
defaults {
       udev_dir                /dev
       polling_interval        5
       path_selector           "round-robin 0"
       path_grouping_policy    failover
       getuid_callout          "/lib/udev/scsi_id --whitelisted --device=/dev/%n"
       prio                    const
       path_checker            directio
       rr_min_io               1000
       rr_weight               uniform
       failback                manual
       no_path_retry           fail
       user_friendly_names     yes
}
#

Configuración para una cabina 3PAR

En el momento en que escribo este artículo, estoy usando cabinas HP modelo 3PAR.

devices {
        device {
                vendor                  "3PARdata"
                product                 "VV"
                path_grouping_policy    multibus
                getuid_callout          "/lib/udev/scsi_id --whitelisted --replace-whitespace  --device=/dev/%n"
                path_selector           "round-robin 0"
                path_checker            tur
                hardware_handler        "0"
                failback                immediate
                rr_weight               uniform
                rr_min_io               100
                no_path_retry           18
        }

        device {
                vendor                  "HP"
                product                 "HSV2[01]0|HSV3[046]0|HSV4[05]0"
                path_grouping_policy    group_by_prio
                getuid_callout          "/lib/udev/scsi_id --whitelisted --replace-whitespace  --device=/dev/%n"
                path_selector           "round-robin 0"
                path_checker            tur
                no_path_retry           18
        }
}

Eliminación de la visibilidad de dispositivos que no queremos configurar en el multipath

blacklist {
        devnode         "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
        devnode         "^hd[a-z][[0-9]*]"
        devnode         "^cciss!c[0-9]d[0-9]*"
        device {
                vendor  "HP"
                product "LOGICAL VOLUME"
        }
}

Personalización del nombre multipath de los discos que han sido presentados al servidor

Siempre es bueno ponerle un nombre relacionado con el servicio que vamos a dar.

multipaths {

# Servicio APP XXX

multipath {
                wwid 360002ac000000000000004680000d02c
                alias pv_p01r1t3d_bob04
        }
        multipath {
                wwid 360002ac00000000000000c99000073ae
                alias pv_p01r1t3e_bob04
        }
        multipath {
                wwid 360002ac000000000000000e9000206ca
                alias md20_bob_1
        }

}

Arranque del servicio multipath y comprobación de su estado

Una vez que ya tenemos configurado el servicio, procederemos a arrancarlo:

  • RHEL6: service multipathd start
  • RHEL7: systemctl start multipathd

Una vez arrancado, tendremos que ver el WWID (World Wide ID) de los discos por los diferentes caminos presentados al servidor. Veamos un ejemplo:

[[email protected] ~]# multipath -ll
vg2dataguard1 (360002ac0000000000000020100015efd) dm-11 3PARdata,VV
size=500G features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
  |- 1:0:2:3  sdk  8:160  active ready running
  `- 2:0:2:3  sdar 66:176 active ready running
vg4dataguard2 (360002ac0000000000000059200015ef9) dm-24 3PARdata,VV
size=100G features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
  |- 1:0:5:6  sdx  65:112 active ready running
  `- 2:0:5:6  sdbe 67:128 active ready running
md1_bob_2 (360002ac0000000000000013c000206ca) dm-32 3PARdata,VV
size=200G features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
  |- 1:0:6:8  sdaf 65:240 active ready running
  `- 2:0:6:8  sdbm 68:0   active ready running

Si nos fijamos en el primer disco, observaremos:

  • Nombre personalizado del disco: vg2dataguard1
  • WWID del disco: 360002ac0000000000000020100015efd
  • Caminos: /dev/sdk y /dev/sdar
  • Ambos caminos están activos

Por cierto, cuando hablo de discos, lo que quiero decir son LUNs (Logical Unit Network) que, al fin y al cabo, es un espacio de disco de la cabina.

Chequeo del doble camino de multipath

En los grandes entornos donde se utilizan cabinas de disco de dedicadas, lo normal es tener más de un camino de acceso al disco, por si se estropea un switch de cabina, una tarjeta de fibra en el servidor con acceso a la SAN, etc.

Muchas veces, durante las intervenciones de mantenimiento de cabinas, como puede ser una actualización de firmware, se suele perder alguno de los caminos de acceso a los discos, así que es conveniente averiguar si todos los caminos está funcionando correctamente antes de que el equipo de Storage realice la intervención, de lo contrario, podríamos quedarnos sin servicio.

Para este caso concreto, al administrar muchos servidores diferentes, suelo lanzar un script de manera masiva para que me devuelva el hostname y el estado de los paths de cabina de todos los servidores. Es el siguiente:

Script para chequear el estado del multipath

[root]# cat check_multipath.sh
#!/bin/sh

PATH=/sbin:/bin:/usr/bin

MULTIPATHDISABLED=$(multipath -ll |grep "DM multipath kernel driver not loaded" |wc -l)

if [ "$MULTIPATHDISABLED" -ge "1" ]
then

   echo "$(hostname);Multipath is disabled"

else

   MULTIPATHFAILED=$(multipath -ll |grep -i failed |wc -l)
   MULTIPATHACTIVE=$(multipath -ll |grep -i active |wc -l)
   RHELVERSION=`cat /etc/redhat-release`
   KERNELRELEASE=$(uname -r)
   DMSETUPLIB=$(dmsetup version|grep "Library version:")
   DMSETUPDRIVER=$(dmsetup version |grep "Driver version:")

   echo "$(hostname);$MULTIPATHFAILED paths failed"
   echo "$(hostname);$MULTIPATHACTIVE paths active"
   echo "$(hostname);$RHELVERSION"
   echo "$(hostname);$KERNELRELEASE"
   echo "$(hostname);Device Mapper - $DMSETUPLIB"
   echo "$(hostname);Device Mapper - $DMSETUPDRIVER"

   ## HBA Version "

   for HBA in `lspci | grep -i fibre |awk '{print $1}'`
   do

      HBADRIVER=$(lspci -v -s $HBA |grep "Kernel modules:" |awk '{print $3}')
      HBADESCRIPTION=$(modinfo -d $HBADRIVER)
      HBAVERSION=$(modinfo $HBADRIVER |grep "version:" |grep -v src |awk '{print $2}')

      echo "$(hostname);HBA $HBA - $HBADESCRIPTION"
      echo "$(hostname);HBA $HBA - Driver version: $HBAVERSION"

   done

fi
[root]# 

Vamos a ejecutarlo sólo en un servidor para que la salida del script sea más bien corta:

[[email protected] admsys]# ./check_multipath.sh
Server1;0 paths failed
Server1;90 paths active
Server1;Red Hat Enterprise Linux Server release 6.9 (Santiago)
Server1;2.6.32-696.20.1.el6.x86_64
Server1;Device Mapper - Library version:   1.02.117-RHEL6 (2016-12-13)
Server1;Device Mapper - Driver version:    4.33.1
Server1;HBA 05:00.0 - QLogic Fibre Channel HBA Driver
Server1;HBA 05:00.0 - Driver version: 8.07.00.26.06.8-k
Server1;HBA 05:00.1 - QLogic Fibre Channel HBA Driver
Server1;HBA 05:00.1 - Driver version: 8.07.00.26.06.8-k
[[email protected] admsys]#

Como vemos, da dos datos importantes sobre lo que estamos buscando:

Server1;0 paths failed
Server1;90 paths active

Pero también da otros datos importantes, como la versión de sistema operativo, de multipath y de los drivers de las tarjetas de fibra.

Problemas encontrados con multipath

Multipath – Segmentation fault (core dumped)

Estaba actualizando un Linux RedHat 6 cuando tuve un problema de comunicaciones y se me cortó la sesión a mitad de la actualización. Debería haber utilizado screen para evitar este tipo de problemas. Ya es casualidad también.

El caso es que cuando volví a recuperar la conexión, la configuración del servidor no estaba muy fina. No me arrancaba el multipath. Por lo tanto, tampoco podía arrancar la base de datos si ésta no veía los discos. El error que daba era:

[root ~]# multipath show config
Segmentation fault (core dumped)
You have mail in /var/spool/mail/root
[root~]#

[root ~]# service multipathd start
Starting multipathd daemon: [ OK ]
[[email protected] ~]# service multipathd status
multipathd dead but pid file exists
[root ~]#

Para solucionar esto, actualicé todos los paquetes de multipath y el glibc y luego ya arrancó el multipath sin problemas y podía ver los discos:

[root~]# rpm -qa |egrep -i "device-mapper|multipath|glibc"
glibc-common-2.12-1.149.el6.x86_64
glibc-devel-2.12-1.209.el6_9.2.x86_64
glibc-2.12-1.209.el6_9.2.x86_64
device-mapper-event-libs-1.02.90-2.el6.x86_64
glibc-devel-2.12-1.149.el6.x86_64
glibc-common-2.12-1.209.el6_9.2.x86_64
device-mapper-multipath-libs-0.4.9-106.el6.x86_64
device-mapper-event-1.02.117-12.el6_9.1.x86_64
glibc-2.12-1.149.el6.x86_64
device-mapper-1.02.90-2.el6.x86_64
device-mapper-event-1.02.90-2.el6.x86_64
device-mapper-persistent-data-0.6.2-0.2.rc7.el6.x86_64
device-mapper-multipath-0.4.9-106.el6.x86_64
glibc-headers-2.12-1.209.el6_9.2.x86_64
device-mapper-libs-1.02.117-12.el6_9.1.x86_64
device-mapper-1.02.117-12.el6_9.1.x86_64
glibc-2.12-1.149.el6.i686
glibc-headers-2.12-1.149.el6.x86_64
device-mapper-event-libs-1.02.117-12.el6_9.1.x86_64
device-mapper-libs-1.02.90-2.el6.x86_64
[root~]#

Te puede interesar

¿Te ha gustado? ¡Compártelo!

Share on facebook
Share on twitter
Share on linkedin
Share on whatsapp
Share on telegram
Share on email

SUSCRÍBETE A PUERTO53

Recibe un email periódico con los artículos más interesantes de Puerto53.com

Antes de suscribirte lee los términos y condiciones. Gracias.

Contenido Relacionado

Deja un comentario

About Author