Intro
La comunicación entre los nodos del cluster, tanto para la replicación de datos por parte de drbd como para el pacemaker se llevaba a cabo por una tarjeta de red de 1GB. Este punto resultaba ser el cuello de botella para un cluster HA de producción que albergase el servidor samba y owncloud como mínimo.
Por este motivo pensamos en añadir una tarjeta de fibra multimodo de 10GB para la comunicación entre nodos. Sin embargo los precios de estos componentes (al de las tarjetas había que añadir el de los transceivers) se disparaban al compararlos con las tarjetas de cuatro puertos GB Ethernet que además conseguimos al precio de las de dos puertos. La idea era hacer un bonding con los cuatro puertos para tener una conexión de 4GB/sec entre los nodos, cuatruplicando así la velocidad inicial. Teniendo en cuenta que nuestros discos duros son SATA III, la velocidad de transferencia máxima teórica es de 6GB/sec, por lo que las conexiones a 10GB estarían un poco sobredimensionadas.
El hardware
Al final las tarjetas elegidas fueron la referencia 593722-B21 de HP. Las conectamos en el puerto PCI express de 16x que además era de perfil alto. Podíamos haberlas conectado en el de 8x, que es de perfil bajo porque las tarjetas venían con adaptadores de perfil bajo.
Para instalarlas pasamos todas las máquinas virtuales a un nodo, pusimos el otro en standby y luego lo paramos.
Al final no conseguimos hacer una instalación «limpia», sin reinicio de máquinas, porque una vez levantado el primer nodo donde se instaló la tarjeta, el otro ejecutó un stonith. Decidimos parar las máquinas virtuales tras ponerlas en disabled para evitar corrupción de datos. Afortunadamente lo pudimos hacer porque el cluster aún no se encuentra en producción.
El bonding
Para crear el bonding de las cuatro tarjetas seguimos las instrucciones del siguiente artículo.
En esencia, creamos el archivo de configuración del bond en /etc/sysconfig/network-scripts. En el nodo1 el archivo sería el siguiente:
DEVICE=bond0
NAME=bond0
BONDING_MASTER=yes
IPADDR=192.168.45.11
PREFIX=24
ONBOOT=yes
BOOTPROTO=none
BONDING_OPTS="mode=0 miimon=100"
NETWORK=192.168.45.0
BROADCAST=192.168.45.255
GATEWAY=
MTU=9000
USERCTL=no
Elegimos el modo 0 porque era el que más nos convenía, sobre todo teniendo en cuenta que se iban a conectar directamente los dos nodos, sin pasar por un switch.
Luego fuimos configurando cada una de las interfaces de red que integrarían el bond.
Para ver los nombres de los interfaces empleamos la opción:
# ifconfig -a
Las interfaces venían nombradas como ens1f0 a ens1f3. Para crear una UUID a cada interfaz e incluirla en su archivo de configuración empleamos el comando:
# uuidgen ens1f0
Cambiando el nombre de la interfaz de red cada vez.
Creamos los archivos de configuración de los interfaces. Para el caso de ens1f0:
HWADDR="ad:16:3e:a1:63:04"
TYPE="Ethernet"
BOOTPROTO="none"
DEFROUTE="no"
PEERDNS="no"
PEERROUTES="no"
IPV4_FAILURE_FATAL="no"
IPV6INIT="no"
NAME="ens1f0"
UUID="b6144da3-efbb-4c8b-88d5-8e23462cb7e8"
ONBOOT="yes"
MASTER="bond0"
SLAVE="yes"
Reiniciamos la red para que los cambios surtieran efecto:
# systemctl restart network
Para comprobar que el bonding está funcionando empleamos:
# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: ens1f1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: ad:16:3e:a1:63:05
Slave queue ID: 0
Slave Interface: ens1f0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: ad:16:3e:a1:63:04
Slave queue ID: 0
Slave Interface: ens1f2
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: ad:16:3e:a1:63:06
Slave queue ID: 0
Slave Interface: ens1f3
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: ad:16:3e:a1:63:07
Slave queue ID: 0
Cambios en los archivos de configuración: hosts y del drbd
Una vez configurado y funcionando el bonding había que cambiar los archivos de configuración del drbd para que empleasen éste en lugar de la conexión ethernet 1GB que habían estado empleando hasta ahora. También había que cambiar la IP de node1 y node2 en /etc/hosts
Modificamos el archivo /etc/drbd.d/discodatos.res
on node1 {
address 192.168.45.11:7788;
disk /dev/sda4;
}
on node2 {
address 192.168.45.12:7788;
disk /dev/sda4;
}
Modificamos /etc/hosts:
192.168.45.11 node1
192.168.45.12 node2
De este modo, el archivo de configuración /etc/corosync/corosync.conf apuntará al bond en la sección ‘nodelist’:
nodelist {
node {
ring0_addr: node1
nodeid: 1
}
node {
ring0_addr: node2
nodeid: 2
}
}
Para evitar problemas y comprobar que la comunicación entre los nodos se estaba llevando a cabo a través del bonding creado, desconectamos el cable de red que unía los nodos anteriormente.
Comprobación de la velocidad del bonding
Para poder comprobar que el bonding funcionaba a la velocidad correcta empleamos el programa iperf3, que no se encuentra disponible como paquete yum para instalar en centOS. Tuvimos que descargarlo del GitHub de esnet, compilarlo e instalarlo en los dos nodos.
En uno de los nodos ejecutamos el servidor:
# iperf3 -s
Mientras que en el otro nodo ejecutamos la prueba:
# iperf3 -c 192.168.45.12
Connecting to host 192.168.45.12, port 5201
[ 4] local 192.168.45.11 port 52856 connected to 192.168.45.12 port 5201
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 449 MBytes 3.77 Gbits/sec 5 446 KBytes
[ 4] 1.00-2.00 sec 455 MBytes 3.82 Gbits/sec 0 446 KBytes
[ 4] 2.00-3.00 sec 453 MBytes 3.80 Gbits/sec 0 446 KBytes
[ 4] 3.00-4.00 sec 450 MBytes 3.77 Gbits/sec 0 446 KBytes
[ 4] 4.00-5.00 sec 454 MBytes 3.80 Gbits/sec 0 463 KBytes
[ 4] 5.00-6.00 sec 452 MBytes 3.79 Gbits/sec 0 463 KBytes
[ 4] 6.00-7.00 sec 446 MBytes 3.74 Gbits/sec 0 463 KBytes
[ 4] 7.00-8.00 sec 450 MBytes 3.78 Gbits/sec 0 778 KBytes
[ 4] 8.00-9.00 sec 455 MBytes 3.82 Gbits/sec 0 778 KBytes
[ 4] 9.00-10.00 sec 455 MBytes 3.81 Gbits/sec 0 778 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 4.41 GBytes 3.79 Gbits/sec 5 sender
[ 4] 0.00-10.00 sec 4.41 GBytes 3.79 Gbits/sec receiver
iperf Done.