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.

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

Další témata