32.13. CARP - Common Address Redundancy Protocol

Beigetragen von Tom Rhodes.

Das Common Address Redundancy Protocol (CARP) erlaubt es, mehreren Rechnern die gleiche IP-Adresse zuzuweisen. Durch ein solches Vorgehen läßt sich beispielsweise die Verfügbarkeit bestimmter Dienste verbessern oder die Last zwischen einzelnen Systemen besser verteilen. Den auf diese Art und Weise konfigurierten Systemen kann zusätzlich eine eigene (im Netzwerk eindeutige) IP-Adresse zugewiesen werden (wie dies auch im folgenden Beispiel erfolgt).

Um CARP zu aktivieren, müssen Sie die FreeBSD-Kernelkonfigurationsdatei um die folgende Option erweitern und danach den FreeBSD-Kernel (wie in Kapitel 9 beschrieben) neu bauen:

device	carp

Alternativ können Sie aber auch das Kernelmodul if_carp.ko beim Systemstart automatisch laden. Dazu nehmen Sie die folgende Zeile in die Datei /boot/loader.conf auf:

if_carp_load="YES"

Danach ist CARP auf Ihrem System verfügbar und kann über verschiedene sysctl-Optionen (OIDs) gesteuert werden.

OID Beschreibung
net.inet.carp.allow Akzeptiert ankommende CARP-Pakete. In der Voreinstellung aktiviert.
net.inet.carp.preempt Diese Option deaktiviert alle CARP-Geräte, sobald eines von ihnen ausfällt. In der Voreinstellung deaktiviert.
net.inet.carp.log Hat diese Variable den Wert 0, wird kein Protokoll generiert, während mit dem Wert 1 nur inkorrekte CARP-Pakete protokolliert werden. Hat die Variable einen Wert größer 1, werden nur die Statuswechsel von CARP-Geräten protokolliert. In der Voreinstellung hat diese Variable den Wert 1.
net.inet.carp.arpbalance Gleicht die Netzwerklast im lokalen Netzwerk durch den Einsatz von ARP aus. In der Voreinstellung deaktiviert.
net.inet.carp.suppress_preempt Eine nur lesbare OID, die den Preemption Suppression-Status anzeigt. Preemption kann verhindert werden. Dies auch dann, wenn ein Gerät ausfällt. Hat die Variable den Wert 0, bedeutet dies, dass Preemption nicht verhindert wird. Tritt ein Problem auf, wird der Wert dieser OID um 1 erhöht.

Das CARP-Gerät selbst erzeugen Sie mit dem ifconfig-Befehl:

# ifconfig carp0 create

Damit Sie dieses Protokoll in Ihrem Netzwerk einsetzen können, muss jede Netzwerkkarte eine eindeutige Identifikationsnummer, die sogenannte VHID (Virtual Host Identification), besitzen, da sich ansonsten die Rechner Ihres Netzwerks nicht voneinander unterscheiden lassen.

32.13.1. Die Serververfügbarkeit mit CARP verbessern

Wie bereits weiter oben erwähnt wurde, können Sie CARP dazu verwenden, die Verfübarkeit Ihrer Server zu verbessern. Im folgenden Bespiel werden insgesamt drei Server (mit jeweils eigener, eindeutiger IP-Adresse), die alle den gleichen Inhalt anbieten, in einer Round Robin DNS-Konfiguration eingerichtet. Der Backup-Server verfügt über zwei CARP-Schnittstellen (für die beiden IP-Adressen der Content-Server). Tritt bei einem Content-Server ein Problem auf, übernimmt der Backup-Server die IP-Adresse des ausgefallenen Servers. Dadurch sollte die Auswahl eines Servers vom Anwender nicht bemerkt werden. Der Backup-Server muss identisch konfiguriert sein und die gleichen Daten und Dienste anbieten wie das System, das er ersetzen soll.

Die beiden Content-Server werden (abgesehen von ihren jeweiligen Hostnamen und VHIDs) identisch konfiguriert und heißen in unserem Beispiel hosta.example.org beziehungsweise hostb.example.org. Damit Sie CARP einsetzen können, müssen Sie als Erstes die Datei rc.conf auf beiden Systemen anpassen. Für das System hosta.example.org nehmen Sie dazu folgende Zeilen in rc.conf auf:

hostname="hosta.example.org"
ifconfig_fxp0="inet 192.168.1.3 netmask 255.255.255.0"
cloned_interfaces="carp0"
ifconfig_carp0="vhid 1 pass testpass 192.168.1.50/24"

Für das System hostb.example.org benötigen Sie zusätzlich folgende Zeilen in rc.conf:

hostname="hostb.example.org"
ifconfig_fxp0="inet 192.168.1.4 netmask 255.255.255.0"
cloned_interfaces="carp0"
ifconfig_carp0="vhid 2 pass testpass 192.168.1.51/24"

Anmerkung: Achten Sie unbedingt darauf, dass die durch die Option pass an ifconfig übergebenen Passwörter auf beiden Systemen identisch sind, da carp-Geräte nur mit Systemen kommunizieren können, die über ein korrektes Passwort verfügen. Beachten Sie weiters, dass sich die VHIDs der beiden Systeme unterscheiden müssen.

Nun richten Sie noch das dritte System, provider.example.org, ein, das aktiviert wird, wenn eines der beiden zuvor konfigurierten Systeme ausfällt. Dieses dritte System benötigt zwei carp-Geräte, um bei Bedarf eines der beiden anderen Systeme ersetzen zu können. Dazu konfigurieren Sie rc.conf analog zur folgenden Beispielkonfiguration:

hostname="provider.example.org"
ifconfig_fxp0="inet 192.168.1.5 netmask 255.255.255.0"
cloned_interfaces="carp0 carp1"
ifconfig_carp0="vhid 1 advskew 100 pass testpass 192.168.1.50/24"
ifconfig_carp1="vhid 2 advskew 100 pass testpass 192.168.1.51/24"

Durch die beiden carp-Geräte ist es provider.example.org möglich, festzustellen, ob eines der beiden anderen Systeme nicht mehr reagiert. In diesem Fall übernimmt provider.example.org die IP-Adresse des betroffenen Systems.

Anmerkung: Ist im installierten FreeBSD-Kernel die Option "preemption" aktiviert, kann es sein, dass provider.example.org die übernommene IP-Adresse nicht mehr an den Content-Server zurückgibt (wenn dieser wieder funktioniert). In diesem Fall muss ein Administrator die entsprechende Schnittstelle dazu zwingen, dies zu tun. Dazu gibt er auf dem Rechner provider.example.org den folgenden Befehl ein:

# ifconfig carp0 down && ifconfig carp0 up

Dieser Befehl muss auf das carp-Gerät ausgeführt werden, das dem betroffenen System zugeordnet ist.

Damit ist CARP vollständig konfiguriert und der Testbetrieb kann beginnen. Zuvor müssen Sie allerdings noch alle Systeme neu starten (beziehungsweise die Netzwerkkonfiguration auf allen Systemen neu einlesen), um die Einstelllungen zu übernehmen.

Für weitere Informtionen lesen Sie bitte die Manualpage carp(4).

Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an <de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <de-bsd-translators@de.FreeBSD.org>.