linux bonding, red alta disponibilidad (HA) en Linux (Red Hat/CentOS)

En los entornos de producción es habitual encontrarse los caminos de red redundados, es decir 2 o más tarjetas de red trabajando juntas.

La idea es que cada tarjeta de red va conectada un switch diferente, de esta forma tenemos tolerancia a fallos de las tarjetas de red y la electrónica de red que hay detrás, generalmente un switch.bonding linux

Vamos a ver como configurar un interfaz de tipo bond en Red Hat/CentOS. Para documentar el procedimiento he utilizado concretamente CentOS 6.4.

La situación inicial en cuanto a configuración de red es:

 

Source   
[root@oradb ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:50:56:25:4C:B6
inet addr:192.168.174.100  Bcast:192.168.174.255  Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fe25:4cb6/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:217 errors:0 dropped:0 overruns:0 frame:0
TX packets:33 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:22757 (22.2 KiB)  TX bytes:2555 (2.4 KiB)
 
eth1      Link encap:Ethernet  HWaddr 00:0C:29:F8:6B:64
inet addr:192.168.174.134  Bcast:192.168.174.255  Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fef8:6b64/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:196 errors:0 dropped:0 overruns:0 frame:0
TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:12570 (12.2 KiB)  TX bytes:1298 (1.2 KiB)
 
lo        Link encap:Local Loopback
inet addr:127.0.0.1  Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING  MTU:16436  Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:720 (720.0 b)  TX bytes:720 (720.0 b)

 

Lo primero que debemos hace es desactivar «NetworkManager» y trabajar directamente con el servicio «network». Primero verificamos la situación actual:

Source   
[root@oradb ~]# chkconfig --list NetworkManager
NetworkManager     0:off    1:off    2:on    3:on    4:on    5:on    6:off
[root@oradb ~]# chkconfig --list network
network            0:off    1:off    2:off    3:off    4:off    5:off    6:off

En este caso debemos modificar el arranque automático de los servicios, parar «NetworkManager» y arrancar «network»:

Source   
[root@oradb ~]# chkconfig NetworkManager off
[root@oradb ~]# chkconfig network on
[root@oradb ~]# chkconfig --list NetworkManager
NetworkManager     0:off    1:off    2:off    3:off    4:off    5:off    6:off
[root@oradb ~]# chkconfig --list network
network            0:off    1:off    2:on    3:on    4:on    5:on    6:off
[root@oradb ~]# /etc/init.d/NetworkManager stop
Stopping NetworkManager daemon:                            [  OK  ]
[root@oradb ~]# /etc/init.d/network start
Bringing up loopback interface:                            [  OK  ]
Bringing up interface Auto_eth0:                           [  OK  ]

Podemos reiniciar la máquina si queremos y verificar que arrancan los servicios deseados (no debería existir problema). Una vez reiniciada la situación es:

Source   
[root@oradb ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:50:56:25:4C:B6  
          inet addr:192.168.174.100  Bcast:192.168.174.255  Mask:255.255.255.0
          inet6 addr: fe80::250:56ff:fe25:4cb6/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:130 errors:0 dropped:0 overruns:0 frame:0
          TX packets:36 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:51318 (50.1 KiB)  TX bytes:2514 (2.4 KiB)
 
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:720 (720.0 b)  TX bytes:720 (720.0 b)

Solo vemos una tarjeta de red porque no trabajamos con «network» y no existe configuración por defecto para eth1. Para configurar el bonding necesitamos conocer las MACs de las tarjetas podemos verlas con:

Source   
[root@oradb ~]# ip addr show
1: lo: <loopback,up,lower_up> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <broadcast,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:25:4c:b6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.174.100/24 brd 192.168.174.255 scope global eth0
    inet6 fe80::250:56ff:fe25:4cb6/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <broadcast,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 00:0c:29:f8:6b:64 brd ff:ff:ff:ff:ff:ff

Bueno ya tenemos todo lo necesario, ahora simplemente movemos la configuración existente a otro lugar (como copia de seguridad) y creamos la configuración del bond (ficheros ifcfg-bond0, ifcfg-eth0 y ifcfg-eth1):

 

Source   
[root@oradb network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@oradb network-scripts]# ls
ifcfg-Auto_eth0  ifdown-post    ifup-eth    ifup-routes
ifcfg-lo         ifdown-ppp     ifup-ippp   ifup-sit
ifdown           ifdown-routes  ifup-ipv6   ifup-tunnel
ifdown-bnep      ifdown-sit     ifup-isdn   ifup-wireless
ifdown-eth       ifdown-tunnel  ifup-plip   init.ipv6-global
ifdown-ippp      ifup           ifup-plusb  net.hotplug
ifdown-ipv6      ifup-aliases   ifup-post   network-functions
ifdown-isdn      ifup-bnep      ifup-ppp    network-functions-ipv6
[root@oradb network-scripts]# mv ifcfg-Auto_eth0 ~
[root@oradb network-scripts]# cat ifcfg-bond0
 
DEVICE=bond0
IPADDR=192.168.174.100
NETMASK=255.255.255.0
GATEWAY=192.168.174.2
DNS1=8.8.8.8
DEFROUTE=yes
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
BONDING_OPTS="miimon=100 mode=1 primary=eth0 updelay=50000"
[root@oradb network-scripts]# cat ifcfg-eth0
DEVICE=eth0
HWADDR=00:50:56:25:4C:B6
TYPE=Ethernet
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
[root@oradb network-scripts]# cat ifcfg-eth1
DEVICE=eth1
HWADDR=00:0C:29:F8:6B:64
TYPE=Ethernet
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none

Detalles a tener en cuenta en estos ficheros:

  • ifcfg-bond0, aquí se definen las configuraciones de red tradicionales, es decir IP, máscara, gateway, etc… Para hemos respetado la configuración de red que existía antes de configurar el bond. Además de algunos parámetros específicos dentro de BONDING_OPTS, los comentamos luego.
  • ifcfg-eth0 y ifcfg-eth1, debemos asegurarnos que los parámetros DEVICE (nombre del dispositivo), HWADDR (la MAC), SLAVE (indica que es una tarjeta esclava) y MASTER (esta es la asocición de la tarjeta con el interfaz bond, que es el master)

Reiniciamos el servicio y verificamos el estado:

Source   
[root@oradb network-scripts]# /etc/init.d/network reload
Shutting down interface eth0:  /etc/sysconfig/network-scripts/ifdown-eth: line 116: /sys/class/net/bond0/bonding/slaves: No such file or directory
                                                           [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface bond0:                               [  OK  ]
[root@oradb network-scripts]# ifconfig
bond0     Link encap:Ethernet  HWaddr 00:50:56:25:4C:B6  
          inet addr:192.168.174.100  Bcast:192.168.174.255  Mask:255.255.255.0
          inet6 addr: fe80::250:56ff:fe25:4cb6/64 Scope:Link
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:939 errors:0 dropped:0 overruns:0 frame:0
          TX packets:61 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:101073 (98.7 KiB)  TX bytes:4340 (4.2 KiB)
 
eth0      Link encap:Ethernet  HWaddr 00:50:56:25:4C:B6  
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:929 errors:0 dropped:0 overruns:0 frame:0
          TX packets:61 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:100473 (98.1 KiB)  TX bytes:4340 (4.2 KiB)
 
eth1      Link encap:Ethernet  HWaddr 00:50:56:25:4C:B6  
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:10 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:600 (600.0 b)  TX bytes:0 (0.0 b)
 
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:720 (720.0 b)  TX bytes:720 (720.0 b)

El bond ya está arrancado y las tarjetas eth0 y eth1 son esclavas de bond0-

Vamos ver un poco los parámetros utilizados en BONDING_OPTS de la configuración del fichero ifcfg-bond0:

  • miimon=100, frecuencia en milisegundos en la que se monitoriza el estado de la tarjeta.
  • mode=1, establece el modo de trabajo a activo-pasivo.
  • primary=eth0, indica cual es el interfaz primario. Este será el activo por defecto.
  • updelay=50000, (por defecto es 0) especifica los milisegundos en los que una interfaz se considera activa después de obtener link de nuevo. Este parámetro es muy importante porque el que una tarjeta tenga link no significa que esté lista para trabajar, debemos tener en cuenta que la electrónica de red necesita sus tiempos, que pueden ser 30 segundos antes de enrutar cualquier petición de tráfico. Si por ejemplo el interfaz eth0 cae y pasa a ser activo eth1, más tarde se soluciona el problema y eth0 vuelve a conectarse casi seguro que perdemos conectividad debido a updalay por defecto es 0, esta situación dependiendo del software de alta disponibilidad (por ejemplo Red Hat Cluster Linux) con el que estemos trabajando puede ocasionar incluso un reinicio de la máquina.

Os dejo un link con la documentación de estas opciones:

https://www.centos.org/docs/5/html/5.1/Deployment_Guide/s3-modules-bonding-directives.html

Los mensajes de estado del bond los podemos ver en:

/var/log/messages

Podemos desconectar la tarjeta primaria (eth0) y ver los mensajes indicando el cambio de tarjeta activa (eth1):

 

Source   
[root@oradb network-scripts]# tail -f /var/log/messages
Nov 29 11:35:07 oradb kernel: bonding: bond0: making interface eth0 the new active one.
Nov 29 11:35:07 oradb kernel: bonding: bond0: first active interface up!
Nov 29 11:35:07 oradb kernel: bonding: bond0: Setting eth0 as primary slave.
Nov 29 11:35:07 oradb kernel: ADDRCONF(NETDEV_CHANGE): bond0: link becomes ready
Nov 29 11:35:08 oradb ntpd[2232]: Deleting interface #3 eth0, fe80::250:56ff:fe25:4cb6#123, interface stats: received=0, sent=0, dropped=0, active_time=796 secs
Nov 29 11:35:08 oradb ntpd[2232]: Deleting interface #5 eth0, 192.168.174.100#123, interface stats: received=13, sent=13, dropped=0, active_time=796 secs
Nov 29 11:35:10 oradb ntpd[2232]: Listening on interface #6 bond0, fe80::250:56ff:fe25:4cb6#123 Enabled
Nov 29 11:35:10 oradb ntpd[2232]: Listening on interface #7 bond0, 192.168.174.100#123 Enabled
Nov 29 11:36:00 oradb kernel: bond0: link status definitely up for interface eth1, 1000 Mbps full duplex.
Nov 29 11:45:33 oradb kernel: packagekitd[3674]: segfault at 29 ip 00000030c8e57dd3 sp 00007fff8527d1e0 error 4 in libglib-2.0.so.0.2200.5[30c8e00000+e4000]
 
Nov 29 11:56:03 oradb kernel: e1000: eth0 NIC Link is Down
Nov 29 11:56:03 oradb kernel: bonding: bond0: link status definitely down for interface eth0, disabling it
Nov 29 11:56:03 oradb kernel: bonding: bond0: making interface eth1 the new active one.

Si volvemos a conectar eth0:

 

Source   
[root@oradb network-scripts]# tail -f /var/log/messages
 
Nov 29 11:58:29 oradb kernel: e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Nov 29 11:58:29 oradb kernel: bonding: bond0: link status up for interface eth0, enabling it in 50000 ms.
Nov 29 11:59:23 oradb kernel: bond0: link status definitely up for interface eth0, 1000 Mbps full duplex.
Nov 29 11:59:23 oradb kernel: bonding: bond0: making interface eth0 the new active one.

Vemos que después de conectar la tarjeta eth0, espera el sistema 50000 ms y luego la convierte en primaria.

Podemos conocer el estado del bond en todo momento simplemente con:

 

Source   
[root@oradb network-scripts]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)
 
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: eth0 (primary_reselect always)
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 50000
Down Delay (ms): 0
 
Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 1
Permanent HW addr: 00:50:56:25:4c:b6
Slave queue ID: 0
 
Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:f8:6b:64
Slave queue ID: 0

Espero que os sirva de ayuda esta entrada…

Deja un comentario