Dans une solution à haute disponibilité on pense souvent à doubler les alimentations, les disques dur, mais on oublie fréquemment la carte réseau. Le concept du channel bonding permet de régler ce SPOF très souvent oublié.
Pour que le channel bonding fonctionne il faut utiliser la commande ifenslave qui est fournie dans le package ifenslave-2.6. Les cartes réseau doivent être compatibles ethtools et miitools. Le module bonding doit avoir été implanté dans la configuration du noyau.
[*] Networking support <M> Bonding driver support
Il existe 7 modes de fonctionnement.
Mode 0, l'équilibrage de charge : Grâce l'équilibrage de charge, les paquets transitent sur une carte réseau active, puis sur une autre, séquentiellement. Le débit de la bande passante est augmenté. Si une des cartes réseaux vient à tomber en rade, l'équilibre de charge saute cette carte et continue à tourner de manière cyclique.
Mode 1, la sauvegarde active : Ce mode est une simple redondance avec basculement. Une seule interface est active. Dès que sa panne est détectée, une autre interface est activée et prend le relais. Votre bande passante ne change pas.
Mode 2, la balance Xor : Une interface est affectée à l'envoi vers une même adresse MAC. Ainsi les transferts sont parallélisés et le choix de l'interface suit la règle : (Adresse MAC de la source XOR Adresse MAC de la destination) modulo nombre d'interfaces.
Mode 3, le broadcast : Aucune particularité dans ce cas, toutes les données sont transmises sur toutes les interfaces actives. Aucune autre règle.
Mode 4, la norme 802.3ad : La norme 802.3ad permet l'agrégation des liens, élargissant dynamiquement la bande passante. Les groupes sont créés dynamiquement sur la base d'un paramétrage commun. Ce mode exige un équipement réseau, switch, offrant cette possibilité.
Mode 5, la balance TLB : "TLB" pour Traffic Load Balancing.Le trafic sortant est distribué selon la charge courante (calculée relativement à la vitesse) de chaque interface. Le trafic entrant est reçu par l'interface courante. Si l'interface de réception devient inactive, une autre interface prend l'adresse MAC de l'interface inactive.
Mode 6, la balance ALB : "ALB" pour Adaptive load balancing. C'est un mode étendu de la balance tlb, qui inclut du load balancing en réception. L'équilibrage de charge de réception est réalisé au niveau des réponses ARP. Le module intercepte les réponses ARP et change l'adresse MAC par celle d'une des interfaces.
Les modes 0, 2, 5 et 6 assurent l'équilibrage de charge.
Installer le package ifenslave.
aptitude install ifenslave-2.6
Configuration Debian ETCH
Modifier le fichier /etc/network/interfaces, mettre en commentaire les lignes relatives aux interfaces eth0 et eth1 et rajouter les lignes suivantes :
auto eth0 auto eth1 auto bond0 iface bond0 inet static address 192.168.1.110 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 up /sbin/ifenslave bond0 eth0 up /sbin/ifenslave bond0 eth1 down /sbin/ifenslave -d bond0 eth0 down /sbin/ifenslave -d bond0 eth1
Ajouter les lignes suivantes dans le fichier /etc/modprobe.d/arch/i386. La configuration retenue est le mode 1, sauvegarde active.
alias bond0 bonding options bonding mode=1 miimon=100 downdelay=200 updelay=200
- miimon : défini la fréquence à laquelle les cartes réseaux sont inspectées pour savoir si ils sont en défaut. La valeur de 100 correspond à 100 millisecondes qui est la valeur recommandée.
- downdelay : spécifie en millisecondes le temps de désactivation d'une interface suite à un problème, le switch est souvent moins rapide en réaction que le registre miimon de la carte réseau. Ce paramètre doit être un multiple de miimon.
- updelay : certains switches présentent l'interface réseau active avant que la connexion soit réellement opérationnelle. updelay gère cette particularité. Ce paramètre doit être aussi un multiple de miimon.
Configuration Lenny et Squeeze
Elle est plus simple et demande uniquement une configuration de /etc/network/interfaces
auto eth0 auto eth1 auto bond0 iface bond0 inet static address 192.168.1.110 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 slaves eth0 eth1 bond_mode active-backup bond_miimon 100 /// Redemarrer le réseau :
/etc/init.d/networking restart
La commande ifconfig renvoie le résultat suivant :
bond0 Link encap:Ethernet HWaddr 00:30:48:89:42:30
inet adr:192.168.1.110 Bcast:192.168.1.255 Masque:255.255.255.0 adr inet6: fe80::230:48ff:fe89:4230/64 Scope:Lien UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1 RX packets:212 errors:0 dropped:0 overruns:0 frame:0 TX packets:184 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 lg file transmission:0 RX bytes:20049 (19.5 KiB) TX bytes:20458 (19.9 KiB)
eth0 Link encap:Ethernet HWaddr 00:30:48:89:42:30
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1 RX packets:202 errors:0 dropped:0 overruns:0 frame:0 TX packets:179 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 lg file transmission:100 RX bytes:19317 (18.8 KiB) TX bytes:19960 (19.4 KiB)
eth1 Link encap:Ethernet HWaddr 00:30:48:89:42:30
UP BROADCAST SLAVE MULTICAST MTU:1500 Metric:1 RX packets:10 errors:0 dropped:0 overruns:0 frame:0 TX packets:5 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 lg file transmission:100 RX bytes:732 (732.0 B) TX bytes:498 (498.0 B)
lo Link encap:Boucle locale
inet adr:127.0.0.1 Masque:255.0.0.0 adr inet6: ::1/128 Scope:Hôte UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 lg file transmission:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
A partir de cet instant le serveur est vu au travers l'IP : 192.168.1.110. Pour ssh, il importe de corriger la clause ListenAdress dans le fichier /etc/ssh/sshd_config. La commnde ip addr retourne également des éléments sur le channel bonding
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,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 100
link/ether 00:30:48:89:42:30 brd ff:ff:ff:ff:ff:ff
3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,SLAVE,UP> mtu 1500 qdisc pfifo_fast master bond0 state DOWN qlen 100
link/ether 00:30:48:89:42:30 brd ff:ff:ff:ff:ff:ff
4: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 00:30:48:89:42:30 brd ff:ff:ff:ff:ff:ff inet 192.168.1.110/24 brd 192.168.1.255 scope global bond0 inet6 fe80::230:48ff:fe89:4230/64 scope link valid_lft forever preferred_lft forever
En consultant le fichier /proc/net/bonding/bond0 on obtient des informations sur l'état du lien channel bonding
cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.2.5 (March 21, 2008)
Bonding Mode: fault-tolerance (active-backup) Primary Slave: None Currently Active Slave: eth0 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 200 Down Delay (ms): 200
Slave Interface: eth0 MII Status: up Link Failure Count: 0 Permanent HW addr: 00:30:48:89:42:30
Slave Interface: eth1 MII Status: up Link Failure Count: 0 Permanent HW addr: 00:30:48:89:42:31
Dans le cas ci-dessus les deux interfaces sont bien connectées. Pour tester débrancher l'une des interfaces et relancer la commande qui montre que l'interface eth1 est hors service.
cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.2.5 (March 21, 2008)
Bonding Mode: fault-tolerance (active-backup) Primary Slave: None Currently Active Slave: eth0 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 200 Down Delay (ms): 200
Slave Interface: eth0 MII Status: up Link Failure Count: 0 Permanent HW addr: 00:30:48:89:42:30
Slave Interface: eth1 MII Status: down Link Failure Count: 1 Permanent HW addr: 00:30:48:89:42:31 ///
Lien intéressant sur le channel bonding