Lastverteilung per DNS
Lastverteilung per DNS (englisch Round robin DNS) ist eine einfache Lastverteilung für Netzwerkdienste, bei welchem mehrere IP-Adressen im Domain Name System einem Eintrag zugewiesen werden. Clients müssen einen dieser Einträge per Zufall selbst auswählen.
Mit den meisten modernen Webbrowsern, cURL und Wget funktioniert Lastverteilung per DNS nicht mehr. Der durch die Einführung von IPv6 vermehrt genutzte Resolver getaddrinfo liefert Einträge nicht mehr zufällig, sondern in einer bevorzugten Reihenfolge aus. Der früher verwendete Resolver gethostbyname wählte Einträge noch zufällig aus.[1] Eine Client-Funktion welche Zufälligkeit wieder bietet ist bisher nur in der Programmbibliothek von cURL[2] enthalten, noch nicht aber im Kommandozeilen-Programm cURL[3].
Auch bietet Round robin DNS von sich aus keine Hochverfügbarkeit an, da defekte Einträge vom DNS-Server weiterhin ausgeliefert werden. Beim Ausfall einer IP-Adresse muss der Client selbst den Failover durchführen. Auch wenn defekte Einträge automatisch aus dem DNS entfernt werden, bleiben DNS-Antworten im DNS-Cache des Clients. Im Gegensatz zur Lastverteilung führen die meisten modernen Webbrowser den Failover, beim Ausfall eines DNS-Eintrags, selbständig aus.
Funktionsweise
DNS lässt es zu, dass einem Namen mehrere IP-Adressen zugewiesen werden können. Allgemeiner formuliert: Es können mehrere Resource Records mit gleichem Label, gleicher Klasse und gleichem Typ, aber jeweils unterschiedlichem Datenfeld existieren. Eine derartige Anordnung wird als Resource Record Set bezeichnet.
Durch Resource Record Sets kann eine einfache Lastverteilung (engl. Loadbalancing) realisiert werden.
- Beispiel:
server.example.com. 1800 IN A 192.0.2.70 server.example.com. 1800 IN A 192.0.2.71 server.example.com. 1800 IN A 192.0.2.72
Wird ein derartiger Name von einem Resolver abgefragt, so liefert der DNS-Server grundsätzlich alle bekannten IP-Adressen zurück, allerdings in wechselnder Reihenfolge. Der erste Request wird dann beispielsweise mit [192.0.2.70, 192.0.2.71, 192.0.2.72] beantwortet und der zweite mit [192.0.2.71, 192.0.2.72, 192.0.2.70]. Es liegt dann in der Verantwortung des Resolvers, welche IP-Adresse er tatsächlich verwendet.
Nach welcher Strategie ein DNS-Server die Reihenfolge vorgibt, kann bei BIND-kompatiblen Nameservern konfiguriert werden. Bei BIND sind drei Varianten möglich: zyklisch, zufällig und fest. Bei der Variante fest werden die IP-Adressen in der Reihenfolge zurückgegeben, in der sie im Nameserver abliegen.
Anmerkung: Bei reversen Zonen der IN-ADDR.ARPA-Domäne ist ein Loadbalancing nicht möglich, obwohl für eine IP-Adresse mehrere Namen definiert werden können. Eine Lastverteilung wäre hier auch nicht sinnvoll.
Gewichtung
Bei moderneren Resource-Record-Typen wie SRV oder NAPTR lässt sich außerdem noch eine Gewichtung definieren, die festlegt, welche Server-IP-Adressen am häufigsten an erster Stelle stehen. Die entsprechenden Server werden damit häufiger angesprochen.
Bei Record-Typen, die keine Gewichtungsparameter zur Verfügung stellen, besteht die etwas unschöne, aber machbare Alternative darin, die IP-Adressen entsprechend ihrer Gewichtung mehrfach zu vergeben, z. B. ADSL-Leitung dreimal, Funkstrecke nur einmal.
Außerdem gibt es die Möglichkeit, aus einem Pool von möglichen Servern nur einige zurückzuliefern. So werden beispielsweise vom Google-Nameserver immer drei IP-Adressen zurückgeliefert, die teilweise wechseln. Sinnvoll ist auch eine standortbezogene Rücklieferung von IP-Adressen, wenn mehrere verteilte Rechenzentren zur Verfügung stehen – dies wird z. B. von CDNs genutzt.
Einschränkungen
Die Lastverteilung durch DNS ist natürlich nur in dem Sinn gleichmäßig, was die Zuteilung betrifft. Über die danach entstehende tatsächliche Belastung weiß DNS nichts. Auch wird nicht überprüft, ob die Zielserver überhaupt ansprechbar sind. Vorgeschaltete Skripts können aber die Verfügbarkeit prüfen und nur diejenigen Server im Nameserver eintragen, die aktuell tatsächlich zur Verfügung stehen. Damit lassen sich Lastverteilung und Ausfallsicherheit verbinden.