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.
¿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]).
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:
[root@server ~]# 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:
[root@Server1 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
[root@Server1 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 ]
[root@lastdox1 ~]# 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:
[root@lo02dox01 ~]# 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
[root@lo02dox01 ~]# echo 1 > /sys/block/sdh/device/delete
[root@lo02dox01 ~]# echo 1 > /sys/block/sdar/device/delete
[root@lo02dox01 ~]# service multipathd reload
Redirecting to /bin/systemctl reload multipathd.service
[root@lo02dox01 ~]# multipath -r
[root@lo02dox01 ~]# multipath -ll |grep DG_GIMR_01 -A4
[root@lo02dox01 ~]#
Te puede interesar
Mi pasión por la tecnología me lleva constantemente a explorar las últimas tendencias y aplicaciones, buscando siempre formas de implementar soluciones innovadoras que mejoren la eficiencia. En puerto53.com comparto contenido valioso para ayudar a otros profesionales y entusiastas de la informática a navegar y dominar el complejo mundo de la tecnología. Mi especialidad en Linux RedHat.
Más sobre mí en el este enlace,