SDB:Bonding

Saltar a: navegación, buscar
Icono-reciclar.png ¡Este artículo puede reciclarse!

Este artículo no cumple los estándares esperados en la wiki de openSUSE.
Con toda probabilidad, este artículo esté desfasado; sin embargo, puede que contenga suficiente material aprovechable. Estás invitado a ayudar a reciclar el artículo. Para más información ver el equipo del wiki.

BONDING CON DOS TARJETAS DE RED: Redundancia en las interfaces de red

El Bonding es una técnica que consiste, básicamente, en configurar dos tarjetas de red con la misma IP. Al hacer esto, conseguimos que ambas tarjetas trabajen como una sola produciendo redundancia con balanceo de carga y tolerancia a fallos en la interfaz. Es posible hacerlo con más tarjetas, pero en este artículo se usarán solo dos.

Este documento lo he desarrollado conforme a una instalación de openSUSE Linux 10.2 sobre un servidor IBM Netfinity 5100 type 8658-21Y, con dos tarjetas de red: la primera es la que trae el equipo de fábrica integrada en la placa base y la segunda es una Intel PRO/1000 MT Server Adapter.

También lo probé, anteriormente, con openSUSE Linux 10.0 sobre servidor un IBM eServer xSeries 206 type 8482-3MG, con dos tarjetas de red: la primera es la que trae el equipo de fábrica integrada en la placa madre (IBM 82547GI Gigabit Ethernet Controller) y la segunda es una Intel PRO/1000 MT Server Adapter (módulo e1000 del kernel, la misma que usé en la instalación referenciada en el párrafo anterior).

En ambas instalaciones ha funcionado perfectamente, tanto al iniciarse los equipos como en tiempo de ejecución.

Para hacer bonding con dichas tarjetas y que se active durante el arranque, al ser un kernel que usa sysconfig hay que hacer los siguientes pasos:

  1. El kernel debe soportar bonding (compilar el kernel o mediante módulos del kernel). En la instalación no tuve que hacer nada especial y el kernel se instaló con soporte para bonding por defecto. Partí de una instalación con “sistema gráfico mínimo sin KDE” añadiéndole “Herramientas de Desarrollo y Compilación” y algunos paquetes que no vienen al caso.
  2. Editamos el fichero /etc/modprobe.conf.local y añadimos las siguientes líneas:
    alias bond0 bonding
    options bond0 mode=modo miimon=100
    install bond0 /sbin/modprobe bonding –o bond0 mode=modo miimon=100
    • mode=modo debe corresponderse con los modos aceptados por el bonding:
      • mode=0 o mode=balance-rr: Configura una política de round-robin para la tolerancia de fallas y balanceo de cargas. Las transmisiones son recibidas y enviadas secuencialmente en cada interfaz esclava vinculada comenzando con la primera disponible.
      • mode=1 o mode=balance-xor: Configura una política de respaldo activa para la tolerancia de fallas. Las transmisiones son recibidas y enviadas a través de la primera interfaz esclava vinculada disponible. Sólo se utiliza otra interfaz esclava vinculada si la interfaz esclava activa falla.
      • mode=2 o mode=balance-xor: Configura una política XOR (o-exclusivo) para la tolerancia de fallas y el balanceo de cargas. Usando este método la interfaz coincide la dirección MAC de las peticiones entrantes con la dirección MAC de una de las NICs esclava. Una vez que se establece el enlace, las transmisiones son enviadas secuencialmente comenzando con la primera interfaz disponible.
      • mode=3 o mode=broadcast: Configura una política de difusión para la tolerancia de fallas. Las transmisiones son enviadas en todas las interfaces esclavas.
      • mode=4 o mode=802.3ad: Configura una política de agregación de enlace dinámico IEEE 802.3ad. Crea grupos de agregación que comparten las mismas especificaciones de velocidad y duplex. Transmite y recibe en todos los esclavos en el agregador activo. Requiere de un switch que sea conforme con 802.3ad.
      • mode=5 o mode=balace-tbl: Configura una política de balanceo de carga de transmisión (Transmit Load Balancing, TLB) para la tolerancia de fallas y el balanceo de cargas. El tráfico saliente es distribuido de acuerdo a la carga actual en cada interfaz esclava. El esclavo actual recibe el tráfico entrante. Si el eslavo receptor falla, otro esclavo toma la dirección MAC del esclavo fallido.
      • mode=6 o mode=balance-alb: Configura una política de balanceo de cargas activa (Active Load Balancing, ALB) para la tolerancia de fallas y el balanceo de cargas. Incluye el balanceo de cargas de transmisión y recepción para el tráfico IPV4. Se logra el balanceo de las cargas recibidas a través de la negociación ARP.
    • miimon= Especifica (en milisegundos) la frecuencia en que ocurre la supervisión MII. Esto es útil si se requiere gran disponibilidad porque MII es utilizado para verificar que la NIC está activa.
    • Para verificar que el controlador para un NIC particular es compatible con la herramienta MII, escriba el comando siguiente como root:
      ethtool <interfaz_red> | grep "Link detected:"
      Si se soporta MII, el comando devuelve:
      Link detected: yes
    • Grabamos los cambios.
  3. Se configuran ambas tarjetas, mediante YaST, con DHCP para que genere los ficheros ifcgf-eth-id-xx:xx:xx:xx:xx:xx (uno por cada tarjeta de red). Anotamos las líneas _nm_name='bus-pci-xxxx:xx:xx.x' de cada fichero (por ejemplo: para la eth0 bus-pci-0000:02:01.0 y para la eth1 bus-pci-0000:03:01.0; en mi caso).
  4. En el directorio /etc/sysconfig/network, creamos un directorio (por ejemplo "copia") y copiamos los dos ficheros ifcfg-eth-id-xx:xx:xx:xx:xx:xx que se han generado en el paso anterior. Esto es sólo como copia de respaldo y si se quiere hacer, puesto que se pueden volver a generar borrándolos y entrando de nuevo en el YaST (paso 3).
  5. Copiamos el fichero ifcfg-eth-id-xx:xx:xx:xx:xx:xx (que se corresponde con la tarjeta eth0, que es la IBM 82547GI) con el comando cp ifcfg-eth-id-xx:xx:xx:xx:xx:xx ifcfg-bond0, que es el que usaremos para crear la interfaz del bonding. Posteriormente borramos ambos ifcfg-eth-id-......
  6. Editamos el fichero ifcfg-bond0 y vemos que el contenido es similar al siguiente:
    BOOTPROTO='dhcp'
    BROADCAST=
    IPADDR=

    MTU=
    NETMASK=

    NETWORK=
    REMOTE_IPADDR=

    STARTMODE='auto'
    UNIQUE='rBUF.qW72CX+fPoA'
    _nm_name='bus-pci-0000:02:01.1'
    USERCONTROL='no'
  7. Hacemos los siguientes cambios:
    BOOTPROTO='static'
    BROADCAST='192.168.1.255'
    IPADDR='192.168.1.40'
    MTU=''
    NETMASK='255.255.255.0'
    NETWORK='192.168.1.0'
    REMOTE_IPADDR=''
    START_MODE='onboot'
    BONDING_MASTER='yes'
    UNIQUE='rBUF.qW72CX+fPoA'
    _nm_name='bus-pci-0000:02:01.1'
    BONDING_SLAVE0='bus-pci-0000:02:01.1'
    BONDING_SLAVE1='bus-pci-0000:03:01.1'
    BONDING_MODULE_OPTS='mode=modo miimon=100 use_carrier=0'
    • NOTA: En negrita están marcados los cambios y en cursiva las líneas añadidas a mano. Las opciones de BONDING_MODULE_OPTS deben corresponderse con las líneas añadidas al modprobe.conf.local del punto 2 de este artículo, tanto para mode como para miimon.
    • Las líneas BROADCAST, IPADDR y NETWORK debes adaptarla a las IP de tu red en caso de que no coincidan con las aquí mostradas. El contenido de BONDING_SLAVE... no se debe copiar literalmente de éste artículo, sino conservar el que genere tu sistema.
  8. Una vez hechos los cambios, los grabamos y copiamos el fichero en el directorio “copia” y borramos los ficheros ifcfg-eth-id-xx:xx:xx:xx:xx:xx que se generaron por el YaST para ambas tarjetas de red.
  9. Reiniciamos el equipo para que active los cambios y observamos que se ejecuta todo correctamente; hay veces que en el arranque se ve que falla el servicio network, pero si entramos como administrador (root) y ejecutamos el comando ifconfig y sale aproximadamente lo siguiente:
bond0  Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
       inet addr:192.168.1.40  Bcast:192.168.1.255  Mask:255.255.255.0
       inet6 addr: xx::xxx:xxxx:xxxx:xxx/xx  Scope:Link
       UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
       RX  packets:xxxx  errors:0  dropped:0  overruns:0  frame:0
       TX  packets:xxxx  errors:0  dropped:0  overruns:0  carrier:0
       collisions:xx  txqueuelen:0
       RX bytes:xxxxxxxx (xxx.x Kb)  TX bytes:xxxxxx (xxx.x Kb)

eth0   Link encap:Ethernet  HWaddr  xx:xx:xx:xx:xx:xx
       inet6 addr: xx::xxx:xxxx:xxxx:xxx/xx  Scope:Link
       UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
       RX  packets:xxxx  errors:0  dropped:0  overruns:0  frame:0
       TX  packets:xxxx  errors:0  dropped:0  overruns:0  carrier:0
       collisions:xx  txqueuelen:0
       RX bytes:xxxxxxxx (xxx.x Kb)  TX bytes:xxxxxx (xxx.x Kb)
       Base address:XxXXXX  Memory:xxxxxxxx-xxxxxxxx

eth1   Link encap:Ethernet  HWaddr  xx:xx:xx:xx:xx:xx
       inet6 addr: xx::xxx:xxxx:xxxx:xxx/xx  Scope:Link
       UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
       RX  packets:xxxx  errors:0  dropped:0  overruns:0  frame:0
       TX  packets:xxxx  errors:0  dropped:0  overruns:0  carrier:0
       collisions:xx  txqueuelen:0
       RX bytes:xxxxxxxx (xxx.x Kb) TX bytes:xxxxxx (xxx.x Kb)
       Base address:XxXXXX  Memory:xxxxxxxx-xxxxxxxx

lo    Link encap:Local  Loopback
       inet addr:127.0.0.1  Mask:255.0.0.0
       inet6 addr: ::x/xx  Scope:Host
       UP LOOPBACK RUNNING MTU:16436  Metric:1
       RX  packets:xxxx  errors:0  dropped:0  overruns:0  frame:0
       TX  packets:xxxx  errors:0  dropped:0  overruns:0  carrier:0
       collisions:xx  txqueuelen:0
       RX bytes:xxxxxxxx (xxx.x Kb)  TX bytes:xxxxxx (xxx.x Kb)

quiere decir que todo está correcto y se ha levantado el “bonding” sin problema.

Si el enrutamiento está bien configurado y ejecutamos el comando route -n nos debe salir aproximadamente lo siguiente (192.168.1.X se corresponde con la IP de nuestra puerta de enlace de salida al exterior, como por ejemplo Internet, o con el router que nos comunica con el resto de las subredes de la WAN):

Kernel IP routing table

Destination     Gateway       Genmask         Flags     Metric     Ref     Use     Iface
192.168.1.0     0.0.0.0       255.255.255.0   U         0          0       0       bond0
127.0.0.0       0.0.0.0       255.0.0.0       U         0          0       0       lo
0.0.0.0         192.168.1.X   0.0.0.0         UG        0          0       0       bond0

Enlaces externos