===== 1. Introduction ===== Le Channel bonding, aussi appelé Port trucking, permet d'appliquer une série de politiques prédéfinies sur un ensemble de liens réseaux regroupés en un seul. Ce groupe d'interfaces réseaux vous donne la possibilité d'effectuer du load-balancing et surtout de la tolérance aux pannes. 7 modes de fonctionnements sont disponibles pour vous permettre d'allier nécessité et flexibilité. Nous allons étudier à travers cet article les possibilités offertes et leurs mises en application ===== 2. Installation ===== ==== 2.1. Prérequis ==== Deux prérequis apparaissent au niveau du switch réseau, où sont connectés les interfaces : - support et configuration du mode "port truking" sur les ports utilisés - support de la norme IEEE 802.3ad Pour votre système linux, il vous faut: - Des cartes réseaux (compatibles ethtools et miitools de préférences). - Module bonding pour le kernel. Kernel 2.4.x [*] Network device support Bonding driver support Kernel 2.6.x [*] Networking support Bonding driver support ==== 2.2. Les différents modes ==== Nous allons voir dans ce chapitre les différents modes proposés par le module bonding. === 2.2.0. 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. === 2.2.1. 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. === 2.2.2. 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. === 2.2.3. Mode 3, le broadcast === Aucune particularité dans ce cas, toutes les données sont transmises sur toutes les interfaces actives. Aucune autre règle. === 2.2.4. Mode 4, la norme 802.3ad === La norme 802.3ad permet l'aggrégation des liens, élargissant dynamiquement la bande passante. Les groupes sont créés dynamiquement sur la base d'un paramètrage commun. === 2.2.5. 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. === 2.2.6. 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. ==== 2.3. Mise en oeuvre ==== === 2.3.1. Présentation par un script === voyons un script minimal : #!/bin/bash #Chargement du module bonding. modprobe bonding mode=0 miimon=100 # On ferme les deux interfaces ethernet ifconfig eth0 down ifconfig eth1 down # On crée une interface bond0, qui recoit une adresse Mac bidon (cela va changer) ifconfig bond0 hw ether 11:22:33:44:55:66 # On lance l'interface, comme s'il s'agit d'une interface ethernet ifconfig bond0 192.168.0.4 netmask 255.255.255.0 gateway 192.168.0.254 up # On ajoute les interfaces à bond0 ifenslave bond0 eth0 ifenslave bond0 eth1 Voyons de plus près : Chargement du module Deux options ont été inclues ici :mode et miimon Il est possible de mettre dans le fichier /etc/modules.conf le chargement du module bonding. alias bond0 bonding options bond0 mode=0 miimon=100 Ce premier exemple montre le cas d'un seul bonding. Il est en effet possible de mettre plusieurs bonding avec des modes différents. Pour cela modifions le /etc/modules.conf en conséquence : alias bond0 bonding options bond0 mode=1 miimon=100 max_bonds=2 alias bond1 bonding options bond1 mode=1 miimon=100 Ajout des interfaces dans bond0 La commande ifenslave nous permet d'ajouter à bond0 les interfaces ethernet(appelées alors interfaces esclaves). Lors de l'ajout de la première interface réseau dans bond0, ce dernier prend l'adresse MAC de cette interface. Les autres interfaces perdent alors leurs adresses MAC, recouvertes par celle de l'interface bond0. Pour enlever une interface, il suffit de lancer la commande : ifenslave -d bondx ethx Le module bonding redonne alors à ethX sa vraie adresse MAC. Si on enlève la première adresse MAC (celle utilisée par bond0), alors bond0 récupère celle de eth1. === 2.3.2. Fichiers de configuration automatique === Voici les fichiers à modifier pour charger au démarage votre configuration rajoutez dans /etc/modules.conf alias bond0 bonding options bond0 mode=0 miimon=100 Sous Red-Hat/Suse Dans /etc/sysconfig/network/, créé ifcfg-bond0 : /etc/sysconfig/network/ifcfg-bond0 ONBOOT=yes DEVICE=bond0 BOOTPROTO=static IPADDR=192.168.0.4 NETMASK=255.255.255.0 BROADCAST=192.168.0.255 GATEWAY=192.168.0.254 Préparez chaque interface réseau ethX /etc/sysconfig/network/ifcfg-eth0 ONBOOT=yes DEVICE=eth0 MASTER=bond0 SLAVE=yes POST_UP_SCRIPT=ifeneth0 /etc/sysconfig/network/ifcfg-eth1 ONBOOT=yes DEVICE=eth1 MASTER=bond0 SLAVE=yes POST_UP_SCRIPT=ifeneeth1 Il ne manque que les scripts dans /etc/sysconfig/network/script/ /etc/sysconfig/network/ifeneeth0 #!/bin/sh ifenslave bond0 eth0 /etc/sysconfig/network/ifeneeth1 #!/bin/sh ifenslave bond0 eth1 Sous debian /etc/network/interfaces auto eth0 auto eth1 auto bond0 iface bond0 inet static address 192.168.0.1 network 255.255.255.0 gateway 192.168.0.254 up /sbin/ifenslave bond0 eth0 eth1 ==== 2.4. Options du module bonding ==== Voici donc une série d'options pour le module bonding qui permet d'ajuster finement le fonctionnement de votre bonding. Option Description Primary Uniquement pour active-backup. Favorise une interface esclave. Celle-ci redeviendra active dès qu'elle le peut, même si une autre interface est active. updelay (0 par défaut) Temps de latence entre la découverte de la reconnexion d'une interface et de sa ré-utilisation. downdelay (0 par défaut) Temps de latence entre la découverte de la déconnexion d'une interface et de sa désactivation de bond0. miimon (0 par défaut) Fréquence de surveillance des interfaces par Mii ou ethtool. La valeur conseillée est 100. use_carrier (1 par défaut) Utilisation de la surveillance des interfaces par "carrier". arp_interval (en ms) Système de surveillance par ARP, évitant l'utilisation de miitool et ethtool. Si aucune trame est arrivée pendant l'arp_interval, on envoie par cette interface jusqu'à 16 requêtes ARP à 16 adresses IP. Si aucune réponse n'est obtenue, l'interface est désactivée. arp_ip_target Liste des adresses IP, séparées par une virgule, utilisée par la surveillance ARP. Si aucune n'est renseignée, la surveillance ARP est inactive ==== 2.5. Quelques exemples ==== Une simple redondance avec priorité sur eth1 #!/bin/bash modprobe bonding -o bond0 mode=1 miimon=100 priority=eth1 ifconfig eth0 down ifconfig eth1 down ifconfig bond0 hw ether 11:22:33:44:55:66 ifconfig bond0 192.168.0.4 netmask 255.255.255.0 gateway 192.168.0.254 up ifenslave bond0 eth0 ifenslave bond0 eth1 Un équilibrage de charge avec vérification par requêtes ARP #!/bin/bash modprobe bonding -o bond1 mode=0 arp_interval=1000 arp_ip_target=216.239.57.104 ifconfig eth0 down ifconfig eth1 down ifconfig eth2 down ifconfig bond1 hw ether 11:22:33:44:55:77 ifconfig bond1 192.168.1.5 netmask 255.255.255.0 gateway 192.168.1.254 up ifenslave bond1 eth0 ifenslave bond1 eth1 ifenslave bond1 eth2 ===== 3. Tableau récapitulatif des modes ===== ^Mode^Description^Load-Balancing^ |0|l'équilibrage de charges|entrante| |1|la sauvegarde active|aucune| |2|la balance Xor|entrante| |3|le broadcast|aucune| |4|la norme 802.3ad|aucune| |5|la balance TLB|entrante| |6|la balance ALB|entrante et sortante| ===== 4. Conclusion ===== La redondance des cartes réseaux est souvent perçue comme inutile et couteuse malgré une installation simple. Avec ces 7 modes de fonctionnements, vous avez la possibilité d'obtenir une interface réseau haute disponibilité, répondant même à des besoins précis pour le load-balancing. Alors pourquoi s'en priver? ===== 5. Script de configuration automatique sous Redhat ===== #!/bin/bash ##### modification utilisateur ########## # Mettre ici le nom de l'interface maitre bond0name="bond0" bond0if0="eth4" bond0if1="eth7" bond0ip="10.3.0.5" bond0mask="255.255.0.0" bond0speed="1000" bond0mode="4" # agregation des liens bond1name="bond1" bond1if0="eth5" bond1if1="eth6" bond1ip="10.4.0.5" bond1mask="255.255.0.0" bond1speed="1000" bond1mode="4" # agregation des liens #mode="0" # equilibrage de charge #mode="1" # sauvegarde active #mode="2" # balance Xor #mode="3" # broadcast #mode="4" # agregation des liens #mode="5" # traffic load balancing #mode="6" # adaptive load balancing ######## fin modif utilisateur ######### #---- debut configuration de bond0 grep ${bond0name} /etc/modprobe.conf >> /dev/null 2>&1 if [ "$?" != "0" ] then cat <> /etc/modprobe.conf alias ${bond0name} bonding options ${bond0name} mode=${bond0mode} miimon=100 max_bonds=2 EOF fi # Configuration des interfaces physiques for interface in ${bond0if0} ${bond0if1} do cp /etc/sysconfig/network-scripts/ifcfg-${interface} $HOME/ifcfg-${interface}_`date +%F-%H-%M` cat < /etc/sysconfig/network-scripts/ifcfg-${interface} ONBOOT=yes DEVICE=${interface} MASTER=${bond0name} SLAVE=yes ETHTOOL_OPTS="speed ${bond0speed} duplex full autoneg off" POST_UP_SCRIPT=ifen${interface} EOF # Creation des scripts de mise en esclaces des interfaces physiques cat << EOF > /etc/sysconfig/network-scripts/ifen${interface} #!/bin/sh ifenslave ${bond0name} ${interface} EOF chmod +x /etc/sysconfig/network-scripts/ifen${interface} # Configuration de l'interface cat < /etc/sysconfig/network-scripts/ifcfg-${bond0name} ONBOOT=yes DEVICE=${bond0name} BOOTPROTO=static IPADDR=${bond0ip} NETMASK=${bond0mask} EOF done #---- fin configuration de bond0 if [ ${bond1name} ] then #---- debut configuration de bond1 grep ${bond1name} /etc/modprobe.conf >> /dev/null 2>&1 if [ "$?" != "0" ] then cat <> /etc/modprobe.conf alias ${bond1name} bonding options ${bond1name} mode=${bond1mode} miimon=100 EOF fi # Configuration des interfaces physiques for interface in ${bond1if0} ${bond1if1} do cp /etc/sysconfig/network-scripts/ifcfg-${interface} $HOME/ifcfg-${interface}_`date +%F-%H-%M` cat < /etc/sysconfig/network-scripts/ifcfg-${interface} ONBOOT=yes DEVICE=${interface} MASTER=${bond1name} SLAVE=yes ETHTOOL_OPTS="speed ${bond1speed} duplex full autoneg off" POST_UP_SCRIPT=ifen${interface} EOF # Creation des scripts de mise en esclaces des interfaces physiques cat << EOF > /etc/sysconfig/network-scripts/ifen${interface} #!/bin/sh ifenslave ${bond1name} ${interface} EOF chmod +x /etc/sysconfig/network-scripts/ifen${interface} # Configuration de l'interface cat < /etc/sysconfig/network-scripts/ifcfg-${bond1name} ONBOOT=yes DEVICE=${bond1name} BOOTPROTO=static IPADDR=${bond1ip} NETMASK=${bond1mask} EOF done #---- fin configuration de bond1 fi