Network failover – bonding

Požadavek na připojení serveru do sítě pomocí dvou síťových karet kvůli zabezpečení proti výpadku trasy připojení je běžný a v případě řešení HA clusteru i nevyhnutelný. V Linuxu je možné zdvojené připojení řešit velmi snadno pomocí tzv. bondingu. Skutečná síťová rozhraní se spojí do jednoho virtuálního přes které poté probíhá veškerá komunikace.

V případě výpadku jednoho ze skutečných fyzických rozhraní bonding tento výpadek odstíní a přesměruje komunikaci přes fungující rozhraní. Proto je vhodné podobné zapojení použít například pro propojení dvou serverů u DRDB (mirror disků přes síť) nebo u replikace MySQL a podobných aplikací.

Dnes používané distribuce jsou na bonding připravené – v jádře je třeba podpora (modul bonding) a nainstalovaný program ifenslave. Popis, který zde uvedu je platný pro RedHat a Fedoru. Samozřejmě lze spojit více rozhraní i v jiných distribucích, ale konfigurace se může mírně lišit. V počítači mám víc síťových karet, ale použiji pouze dvě. Je vhodné vybrat porty na různých kartách – například kartu integrovanou na desce a druhou přidanou do pci-e slotu. Pro konfiguraci použiji síťová rozhraní eth0 a eth1, vytvořím virtuální rozhraní bond0, které dostane IP adresu 172.16.100.10.

Bonding v Linuxu může pracovat ve více režimech, podrobnější popis je možné najít v dokumentaci u jádra nebo například na webu http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5/html/Deployment_Guide/s2-modules-bonding.html.

.

V souboru /etc/modprobe.conf si určím jaký modul pro které zařízení použít:

alias eth0 e1000e
alias eth1 e1000e
alias eth2 e1000e
alias eth3 e1000e
alias bond0 bonding

Soubor /etc/sysconfig/network-scripts/ifcfg-eth1:

DEVICE=eth1
ONBOOT=yes
USERCTL=no
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
HWADDR=00:23:8b:cc:bb:aa

Soubor /etc/sysconfig/network-scripts/ifcfg-eth2:

DEVICE=eth2
ONBOOT=yes
USERCTL=no
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
HWADDR=00:23:8b:ac:ab:ee

Soubor /etc/sysconfig/network-scripts/ifcfg-bond0:

DEVICE=bond0
IPADDR=172.16.100.10
NETMASK=255.255.255.0
NETWORK=172.16.100.0
BROADCAST=172.16.100.255
ONBOOT=yes
BOOTPROTO=none
USERCTL=no

Po nakonfigurování stačí spustit příkaz ifup bond0 a je hotovo. Konfiguraci a nahození rozhraní je samozřejmě nutné provést na obou serverech.

Výsledek po provedení konfigurace by měl být přibližně následující:

[root@clemenza network-scripts]# for i in eth1 eth2 bond0; do ip l show $i; done
5: eth1:  mtu 1500 qdisc pfifo_fast master bond0 qlen 1000
    link/ether 00:23:8b:64:da:0b brd ff:ff:ff:ff:ff:ff
2: eth2:  mtu 1500 qdisc pfifo_fast master bond0 qlen 1000
    link/ether 00:23:8b:64:da:0b brd ff:ff:ff:ff:ff:ff
7: bond0:  mtu 1500 qdisc noqueue 
    link/ether 00:23:8b:64:da:0b brd ff:ff:ff:ff:ff:ff

[root@clemenza network-scripts]# for i in eth1 eth2 bond0; do ip a show $i; done
5: eth1:  mtu 1500 qdisc pfifo_fast master bond0 qlen 1000
    link/ether 00:23:8b:64:da:0b brd ff:ff:ff:ff:ff:ff
2: eth2:  mtu 1500 qdisc pfifo_fast master bond0 qlen 1000
    link/ether 00:23:8b:64:da:0b brd ff:ff:ff:ff:ff:ff
7: bond0:  mtu 1500 qdisc noqueue 
    link/ether 00:23:8b:64:da:0b brd ff:ff:ff:ff:ff:ff
    inet 172.16.100.10/24 brd 172.16.100.255 scope global bond0
    inet6 fe80::223:8bff:fe64:da0b/64 scope link 
       valid_lft forever preferred_lft forever