¿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.

Multipath o Multipathing es la fusión de múltiples conexiones físicas entre una matriz de almacenamiento (cabina de discos) y un servidor en un solo dispositivo virtual. El multipathing puede utilizarse para crear una conexión más fiable con el sistema de almacenamiento, ya que si se cae uno de los caminos seguiremos accediendo a los datos por otro camino.

También podremos usar multipath para aumentar el ancho de banda del almacenamiento y mejorar el rendimiento de acceso a los datos en disco.

El siguiente diagrama muestra un ejemplo: el servidor tiene dos HBAs que están conectados cada uno a un switch de fibra. Estos switches, a su vez, están conectados tarjetas independientes en la cabina de discos.

Esquema basico de multipath

¿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?

El servcio Multipath hace uso del sistema de mapeo de dispositivos del kernel para crear dispositivos virtuales. Está gestionado por el damon multipathd y comando multipath.

Los dispositivos multipath se crean en /dev/mapper/Nombre_del_dispositivo.

En Linux RedHat la configuración del servicio se hace de la misma manera. Al menos, en RedHat 6, 7 y 8.

El fichero de configuración se ubica en /etc/multipath.conf y es ahí donde podemos personalizar el nombre de cada dispositivo a través de su WWD. Si no personalizamos un nombre, el sistema les asignará uno por defecto (mpathN[pM]).

  Configuración de un Cluster de MySQL en Linux con Pacemaker y Réplica de Datos con DRBD

Para que podamos utilizar multipath, debe estar instalado el paquete device-mapper-multipath (en RedHat) y el servicio habilitado (multipathd).

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/8: 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
  Instalación de paquetes de Idiomas en Linux RedHat (langpack)

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.

  Configurar un servidor Memcached en Linux RedHat 7

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~]#

Eliminación de un dispositivo Multipath

Después de haber eliminado todas las rutas de multipath desde la cabina de discos y desde el sistema (echo 1 > /sys/block/sdXXX/device/delete), ejecutaremos el comando multipath -f [dispositivo].

Si multipathd se ha detenido pero el dispositivo todavía no se ha eliminado ejecutaremos multipath -F.

Con el comando multipath -r o systemctl reload multipathd recargaremos las reglas multipath que no estén en uso. El dispositivo eliminado ya no debería aparecer al ejecutar el comando multipath -ll.

Esta es una tara que hago habitualmente en mi trabajo, así que veamos un ejemplo. En este caso, el equipo de Storage ha despresentado un disco que ya no estaba en uso, por lo que el sistema lo veía en estado «failed». Así que vamos a eliminarlo del sistema, eliminando los dos caminos (el sistema los ve como dos discos) y recargando el servicio de multipath:

[[email protected] ~]# multipath -ll |grep DG_GIMR_01 -A4
DG_GIMR_01_TO_REMOVE (360002ac000000000000003140000fa54) dm-23 3PARdata,VV
size=20G features='0' hwhandler='1 alua' wp=rw
`-+- policy='service-time 0' prio=0 status=enabled
  |- 0:0:0:7  sdh  8:112  failed faulty running
  `- 2:0:0:7  sdar 66:176 failed faulty running
[[email protected] ~]# echo 1 > /sys/block/sdh/device/delete
[[email protected] ~]# echo 1 > /sys/block/sdar/device/delete
[[email protected] ~]# service multipathd reload
Redirecting to /bin/systemctl reload multipathd.service
[[email protected] ~]# multipath -r
[[email protected] ~]# multipath -ll |grep DG_GIMR_01 -A4
[[email protected] ~]#

Te puede interesar

Compárteme

Contenido Relacionado

Deja un comentario