Netzwerk/bonding
02.04.2007 : Die Begriffe "NIC-Bonding" und "Link Aggregation" stehen für die logische Zusammenfassung von 2 oder mehreren physikalischen Netzwerkkarten, um entweder ein Load-Balancing und/oder eine höhere Ausfallsicherheit zu erreichen...
Gehen wir einmal von dem Beispiel aus, daß man ein Server in seinem LAN hat, über den erstens extrem viel Datenverkehr läuft und der zweitens absolut nicht ausfallen darf (in diesem Beispiel geht es um eine defekte Netzwerkkarte oder einen defekten Port an dem entsprechenden Switch). Mittels "NIC-Bonding" kann man nun zwei physikalische Netzwerkkarten zu einer neuen, logischen zusammenfassen.
Zur Vorbereitung sollte unser Server zwei Netzwerkkarten eingebaut bekommen, die auch vom Linux-Kernel erkannt werden. In meinem Beispiel sollen die beiden Karten "eth1" und "eth2" zusammengefasst werden. Zurerst schauen wir aber mittels "mii-tool" (apt-get install mii-diag), ob die Links in Ordnung sind :
mii-tool eth0: negotiated 100baseTx-FD, link ok eth1: negotiated 100baseTx-FD, link ok eth2: negotiated 100baseTx-FD, link ok
Nun sollten wir die Module "bonding" (für das eigentliche
Zusammenfassen) und "mii" (für die Überwachung des Link-Status) laden
(und am besten auch gleich in die Datei /etc/modules eintragen, damit
sie beim nächsten Bootvorgang automatisch geladen werden) :
modprobe bonding modprobe mii
Bei einem "ifconfig -a" sollte man jetzt bereits ein neues Interface mit Namen "bond0" sehen :
mars:~# ifconfig -a bond0 Link encap:Ethernet HWaddr 00:00:00:00:00:00 BROADCAST MASTER MULTICAST MTU:1500 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 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
...
Nun brauchen wir noch das Debian-Paket "ifenslave" :
apt-get install ifenslave
Als nächstes editieren wir mit dem Texteditor unserer Wahl die Datei /etc/modprobe.d/aliases und fügen ff. Zeilen hinzu (meine Netzwerkkarten brauchen den "via_rhine"-Treiber - das muss entsprechend angepasst werden) :
alias bond0 bonding alias eth1 via_rhine alias eth2 via_rhine options bonding mode=0 miimon=100
Anmerkung zum bonding mode:
Modus | Bezeichnung | Zweck | Beschreibung |
0 | balance-rr | Lastverteilung & Ausfallsicherheit | Die genutzte Netzwerkschnittstelle wird im Round-Robin-Verfahren festgelegt, das heißt die verfügbaren Schnittstellen werden in Senderichtung wechselweise genutzt. In Empfangsrichtung kann max. die Geschwindigkeit einer einzelnen Schnittstelle erreicht werden - je mehr Teilnehmer, umso mehr Upload-Gesamtbandbreite, denn diese werden auf die übrigen freien Schnittstellen aufgeteilt. |
1 | active-backup | Ausfallsicherheit | Nur eine Schnittstelle ist aktiv, im Fehlerfalle wird eine der anderen im Verbund genutzt. die Netzwerkkarten können über verschiedene Switches angebunden werden. |
2 | balance-xor | Lastverteilung & Ausfallsicherheit | Es wird für jede Gegenstelle im Netzwerk eine zu nutzende Netzwerkschnittstelle zugewiesen, die Zuordnung geschieht über den Modulo der Division zwischen der Formel (Quell-MAC-Adresse XOR Ziel-MAC-Adresse) und der Anzahl der Slave-Schnittstellen. |
3 | broadcast | Ausfallsicherheit | Daten werden auf allen Netzwerkschnittstellen gesendet. Die Nutzung mehrerer Switches ist möglich. |
4 | 802.3ad | Lastverteilung & Ausfallsicherheit | 802.3ad ist ein Standard der IEEE, der die Bündelung mehrerer Schnittstellen mit gleichen Übertragungseinstellungen (Geschwindigkeit und Duplex-Einstellungen) erlaubt, um eine höhere Bandbreite zu erhalten. Es kann nur ein Switch verwendet werden, dieser muss 802.3ad unterstützen. ethtool oder mii-tool wird benötigt. |
5 | balance-tlb | Lastverteilung | Es wird für jede Gegenstelle im Netzwerk eine zu nutzende Netzwerkschnittstelle zugewiesen. Das Verfahren hierzu ist jedoch komplexer und effizienter als bei balance-xor. Das Programm ethtool wird benötigt. |
6 | balance-alb | Lastverteilung | Erweitertes balance-tlb, zusätzlich zur MAC-basierten Zuordnung der Schnittstellen für ausgehende Verbindungen werden eingehende Verbindungen auf die Schnittstellen verteilt. Das Programm ethtool wird benötigt. |
Ferner sollte ff. Zeile in die Datei /etc/modprobe.d/actions :
probeall bond0 eth1 eth2 bonding
Mit ff. Aufruf werden die Konfigurationsdateien mit den eben gemachten Verädnerungen aktualisiert :
update-modules
Nun editieren wir die Konfigurationsdatei für die Interfaces und IP-Adresse /etc/network/interfaces :
auto bond0 iface bond0 inet static address 192.168.0.100 netmask 255.255.255.0 hwaddress ether 00:40:33:E2:65:87 gateway 192.168.0.1 up ifenslave bond0 eth1 eth2 down ifenslave -d bond0 eth1 eth2
für die Karten eth1 und eth2 bitte keine(!) Konfiguration vornehmen!! |
Nun laden wir das "bonding"-Modul nochmal neu ...
rmmod bonding modprobe bonding
... und starten unser Netzwerk neu :
/etc/init.d/networking stop /etc/init.d/networking start
Sollten keine Fehler zu sehen sein, sollte man bei dem Aufruf von "ifconfig -a" nun bei den Interfaces "bond0", "eth1" und "eth2" überall die gleichen MAC- und IP-Adressen sehen.
Nun kann man spasseshalber einmal das Netzwerkkabel von "eth1" oder "eth2" ziehen und sich die Kernel-Meldungen anschauen, man sollte so etwas wie "eth1 has failed, eth2 becoming primary" usw. sehen.
Verbindet man die beiden Netzwerkkarten über verschiedene Switches oder VLANs, erhöht man entsprechend die Ausfallsicherheit. Bei unserem Beispiel werden die Netzwerkpakete im sogenannten "Round-Robin-Verfahren" verteilt, sprich, sie werden abwechselnd über die eine und die andere Netzwerkkarte versendet.
Neben unserem Beipiel (bonding mode=0 - siehe oben) gibt es noch andere Bonding-Verhaltensvarianten: alle verfügbanre Modi sind in der Kernel-Dokumentation "kernel/Documentation/net/bonding.txt" im Detail aufgeführt.