ethernet failover (parte 2 de 2)

21 de febrero de 2010

Dentro del archivo de configuración /etc/modprobe.conf podemos utilizar diferentes modos de tolerancia a fallos o balanceo de carga.

options bonding mode=<modo> miimon=<msg> downdelay=<msg> updelay=<msg>

El bonding intenta conseguir estos modos:
+ alta disponibilidad: si una interfaz física deja de funcionar el trafico es redireccionado por la otra interfaz.
+ balanceo de carga: el trafico entrante o saliente se puede ir repartiendo por diferentes interfaces a fin de multiplicar el ancho de banda.
Con estas características se definen 7 modos de bonding:

+ modo 0 o balance-rr: se balancea el trafico de la red utilizando el algoritmo de Round-Robin. Con este modo tenemos alta disponibilidad y balanceo.

+ modo 1 o active backup: creo que es el más sencillo. Solo se utiliza una interfaz activa y las otras estan en reposo en caso de fallo. Hay alta disponibilidad pero no balanceo de carga.

+ modo 2 o balanceo-xor: asigna una interfaz a un conjunto de clientes y la otra interfaz a otro conjunto de cliente. Para ello utiliza una formula con la operación binaria xor. Tenemos balanceo de la carga pero no alta disponibilidad.

+ modo 3 o broadcast: se envía la información por todas las interfaces. No veo que este metodo sea una buena idea ¿no?. Hay alta disponibilidad pero no balanceo.

+ modo 4 o 802.3ad: no lo entiendo mucho, pero básicamente lo que hace es formar agrupaciones de interfaces activas y otras esclabas. Este método se basa en un estandard de trunking 802.3ad.

+ modo 5 o balanceo-tbl: el trafico que sale se balancea por cada interfaz. Permite alta disponibilidad y balanceo. Es la mejor alternativa.

+ modo 6 o balanceo-alb: igual que el anterior pero también se balancea la recepción.

Pasemos ahora a explicar los diferentes parámetros del bonding:

+ modo: es el modo de funcionamiento (0,1,2,3,4,5,6 o 7) tal como hemos explicado en el punto anterior.

+ miimon: es el tiempo en milisegundos entre chequeo y chequeo del estado de cada interfaz física.

+ downdelay: tiempo en milisegundos para considerar que una interfaz física ha caido.

+ updelay: tiempo en milisegundos para considerar que una interfaz vuelve a funcionar.

Como regla general los modos 6 y 7 son los recomendados o habituales ya que cada tarjeta física se conectará a un switch diferente. Durante el balanceo cada interfaz utilizará su propia dirección MAC.

En el caso de los modos 0 y 2, las interfaces físicas pueden ir a mismo switch, pero el caso del modo 1 no ya que se dará el caso en que el switch tendrá la misma MAC por dos interfaces físicas diferentes.

ethernet failover (parte 1 de 2)

Supón que tienes un servidor con varias maquinas virtuales dando servicio y que quieres asegurar la conectividad con la red. Al igual que redundamos las fuentes de alimentación o los discos montando RAIDs, también podemos redundar las interfaces de red Ethernet para asegurar una conectividad de alta disponibilidad. El siguiente esquema de red es típico de un entorno de virtualización, pero puede ser extensible a cualquier tipo de servicio crítico como puede ser una maquina de correo.

La técnica que utilizaremos es el bonding (o vinculación) en la cual crearemos una interfaz virtual vinculada a dos (o más) interfaces Ethernets físicas.


Como veis en el siguiente esquema cada interfaz de red se conecta a un switch redundando y cada switch a su backbone.

Lo que haremos es crear una interfaz virtual llamada bond0 y vincularla con eth0 y eth1. Supondremos que estamos en un CentOS 4.5. Editaremos el /etc/modprobe.conf para que el kernel arranque el modulo de bonding:

alias bond0 bonding
options bond0 miimon=80 mode=5

Ahora crearemos la interfaz virtual bond0. Creamos el archivo /etc/sysconfig/network-scripts/ifcfg-bond0:
DEVICE=bond0
IPADDR=192.168.1.100
NETMASK=255.255.255.0
NETWORK=192.168.1.0
BROADCAST=192.168.1.255
GATEWAY=192.168.1.1
ONBOOT=yes
BOOTPROTO=none
USERCTL=no

Una vez creada la interfaz virtual editamos nuestras dos interfaces físicas (eth0 y eth1) con este contenido:
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
MASTER=bond0
SLAVE=yes

# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
MASTER=bond0
SLAVE=yes

Ahora solo queda reiniciar y hacer pruebas de conectividad con los cables de red para comprobar que efectivamente no perdemos conexión si desconectamos eth0 o eth1.

Si hacemos un ifconfig, veremos como la interfaz virtual es la que coge la dirección IP:
bond0     Link encap:Ethernet  HWaddr 00:1E:C9:D6:DA:6E  
          inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::21e:c9ff:fed6:da6e/64 Scope:Link
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:5157067 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3927169 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2601662632 (2.4 GiB)  TX bytes:2306432451 (2.1 GiB)

eth0      Link encap:Ethernet  HWaddr 00:1E:C9:D6:DA:6E  
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:3593230 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2807046 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2459234475 (2.2 GiB)  TX bytes:2154634747 (2.0 GiB)
          Interrupt:194 Memory:dc000000-dc012800 

eth2      Link encap:Ethernet  HWaddr 00:1E:C9:D6:DA:72  
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:1563837 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1120123 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:142428157 (135.8 MiB)  TX bytes:151797704 (144.7 MiB)
          Interrupt:170 Memory:d8000000-d8012800 

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:6917 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6917 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:6525082 (6.2 MiB)  TX bytes:6525082 (6.2 MiB)

En el siguiente post veremos lo diferentes modos de funcionamiento del bonding y las precauciones que tenemos que tomar según el modo seleccionado.

Más información:
+ Linux Channel Bonding