Grundlagen

Unter "Link Aggregation" verstehen wir die gemeinsame Nutzung von Netzwerk-Schnittstellen. Im Klartext bedeutet das, dass zwei oder mehr Netzwerkschnittstellen softwareseitig so kombiniert werden, dass das Betriebssystem diese möglichst transparent gleichmässig auslasten und/oder als Fallback bei einer Störung nutzen kann.

FreeBSD unterstützt verschiedene Modi der Link Aggregation, wobei die folgenden die wohl wichtigsten sind:

  • Failover-Modus: Hierbei wird eine Schnittstelle aktiv genutzt. Fällt diese aus, wird versucht den Datenverkehr über die zweite zu leiten. Hier steht uns die Bandbreite des aktiven Ports zur Verfügung.
  • Aggregations-Modus: Hier wird versucht mehrere Kanäle zu bündeln. Stehen beide Schnittstellen zur Verfügung, können wir die summierte Bandbreite nutzen. Fällt eine Schnittstelle aus, reduziert sich die Bandbreite auf die der verbleibenden Schnittstelle.

Der Loadbalance-Modus klingt am besten, höchste Geschwindigkeit bei gleichzeitiger Ausfallsicherheit. Allerdings setzt dieser Modus auch eine entsprechende Unterstützung auf Seite des Switches voraus. Der zu unterstützende Standard heisst IEEE 802.3ad und ist meist nur bei hochpreisigem Qualitätsequipment verfügbar, es gibt aber auch ein paar wenige Ausnahmen.

Failover-Konfiguration

In diesem Beispiel gehe ich davon aus, dass wir über zwei Schnittstellen verfügen, igb0 und igb1. Diese werden wir nun zu einem Interface lagg0 verbinden. Das Umschalten zwischen den aktiven Kanälen erfolgt dann automatisch und für unsere Applikationen transparent.

Wichtig ist, dass wir in einem ersten Schritt die Schnittstellen aktivieren.

# ifconfig igb0 up
# ifconfig igb1 up

Nun erstellen wir die lagg0-Schnittstelle und weisen ihr die beiden oben erwähnten Schnittstellen igb0 und igb1 zu. Anschliessend ist das Interface auch über den Befehl ifconfig ersichtlich. Die IP-Adresse weisen wir auch gleich noch zu.

# ifconfig lagg0 create
# ifconfig lagg0 up laggproto failover laggport igb0 laggport igb1
# ifconfig lagg0 192.168.0.100

Wollen wir diese Konfiguration nun dauerhaft erhalten, müssen wir folgendes in unsere /etc/rc.conf eintragen:

ifconfig_igb0="up"
ifconfig_igb1="up"
cloned_interfaces="lagg0"
ifconfig_lagg0="laggproto failover laggport igb0 laggport igb1 192.168.0.100/24"

Aggregations-Konfiguration

Schauen wir uns nun an wie wir eine Aggregation unserer Schnittstellen erreichen. Auch hier haben wir zwei Schnittstellen zur Verfügung, diesmal igb2 und igb3. Diese werden wir nun zu einem Interface lagg1 verbinden.

Auch hier müssen wir die Schnittstellen aktivieren.

# ifconfig igb2 up
# ifconfig igb3 up

Nun erstellen wir wieder eine Schnittstelle, lagg1. Diesmal verwenden wir die beiden oben erwähnten Schnittstellen igb2 und igb3. Anschliessend ist das Interface auch über den Befehl ifconfig ersichtlich. Diesmal verwenden wir DHCP für die Zuweisung der IP-Adresse.

# ifconfig lagg1 create
# ifconfig lagg1 up laggproto lacp laggport igb2 laggport igb3
# ifconfig lagg1 dhcp

Wollen wir diese Konfiguration nun dauerhaft erhalten, müssen wir folgendes in unsere /etc/rc.conf eintragen:

ifconfig_igb3="up"
ifconfig_igb4="up"
cloned_interfaces="lagg1"
ifconfig_lagg1="laggproto lacp laggport igb3 laggport igb4 dhcp"

Die Ausgabe von ifconfig sieht dann beispielsweise so aus:

lagg1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=401bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,VLAN_HWTSO>
        ether 00:25:90:d9:60:70
        inet 192.168.0.100 netmask 0xffffffff broadcast 192.168.0.254
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect
        status: active
        laggproto lacp lagghash l2,l3,l4
        laggport: igb3 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING>
        laggport: igb2 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING>

Notlösung

Aber wie sieht das ganze nun aus, wenn wir keinen Switch mit Link Aggregations-Unterstützung haben, aber zwei Netzwerkkarten nutzen können und die komplette Bandbreite ausnutzen wollen? In diesem Fall könnten wir immernoch hergehen und die Netzwerkkarten auf die Jails verteilen, sodass in etwa eine lastverteilte Nutzung entsteht. Ein Failover-Szenario ist hier dann allerdings nicht integriert.

1 GBit + 1 GBit != 2 GBit

Wichtig ist zu verstehen, wie die Link Aggregation funktioniert, um enttäuschten Gesichtern vorzubeugen. Gehen wir beispielsweise davon aus, dass wir zwei Server miteinander verbunden haben, die jeweils beide im Aggregationsmodus betrieben werden.

Kopieren wir nun eine Datei via SCP auf das jeweils andere System, erfolgt dies in der selben Geschwindigkeit, in der sie auch ohne die Link Aggregation übertragen worden wäre. Woran liegt das?

Bei der Link Aggregation wird ein Hash-Wert der Gegenstelle erstellt. Anhand dieses Schlüssels wird die Verbindung dann fix einem Interface (bei uns igb2 oder igb3) zugewiesen. Das ist erforderlich, um die Datenkonsistenz zu bewahren, da es sonst bspw. zu Paketüberholungen kommen könnte.

Wenn wir nun aber parallel noch eine Datei auf ein weitere System kopieren, wird dieses über die nicht ausgelastete Schnittstelle verarbeitet. So haben wir dann gebündelt "2 GBit".