undefinedTja, schaut so aus als wäre das Domain Name System des Internet (DNS) irgendwie kaputt gegangen. Ich beobachte, und einige Arbeitskollegen auch, dass die Namensauflösung für Webseiten inzwischen deutlich langsamer ist als bisher. Um manche Seite aufzulösen benötigt ein DNS-Server inzwischen teils bis zu 20 Sekunden (an einer schnellen Leitung).

Weiter lesen? Klicke die Headline um den ganzen Artikel zu sehen!

Wir hatten in unserem Produkt bisher einen eigenen DNS Server als DNS Cache am laufen. Wenn der TTL (Time To Live) eines DNS-Eintrags abgelaufen war, dann wurde eine neue Anfrage gemacht. Das hat bisher gut und zuverlässig Funktioniert. Inzwischen, seit etwa Jahreswechsel 2017/18, ist das so langsam dass wir fast jeden Tag einen Ausfall haben weil wir über 8 Sekunden für den DNS benötigt haben (unser Maximum, bevor unsere Software den zu erreichenden Server als "tot" erklärt). Eine Anfrage bei EURODNS in Luxembourg (zuständig für die Top-Level-Domain des Servers) gibt nur die Auskunft, dass alles okay sei und keine Fehler vorliegen. Interessanterweise hat es dann drei Wochen lang keine Ausfälle mehr gegeben. Inzwischen hat es aber wieder angefangen und wird immer schlimmer.

Also hatten wir unseren eigenen DNS-Cache im Verdacht und den kurzerhand auf drei Systemen ausgeschaltet und durch Google DNS (8.8.8.8) ersetzt. Das Ergebnis: Keinen deut besser. Jetzt benötigt offenbar Google mehr als 8 Sekunden um unsere Server-Domain aufzulösen. Das Ergebnis ist identisch zu vorher. Auch mit den recht neuen und alternativen 9.9.9.9 DNS-Servern ist es nicht besser geworden.

Die Lösung

In unserem Fall haben wir zwei Vorteile, die für unsere Lösung hilfreich waren:

  1. Wir haben einen weiteren zentralen Server (PLS) an anderer Stelle, der nur von uns Kontrolliert wird und auf den alle unsere Produktiv-Systeme jederzeit zugreifen können.
  2. Wir haben Kontrolle über die Produktiv-Systeme und die Software die darauf läuft.

Daher haben wir DNS im ganz kleinen Nachgebaut. Unser PLS Server bekommt eine Datei "hosts" in den Web-Root. In dieser stehen Einträge für das hosts-File unserer Produktiv-Systeme:

# This file is pulled by the productive servers and added to their /etc/hosts
# file. The productive server greps uppercase 'dnshelp' so only lines containing
# that will be inserted. # Lines must be /etc/hosts format so the tag must be commented at the end. 11.104.91.107 serverdomain1.lu # DNSHELP 11.104.91.108 serverdomain2.lu # DNSHELP

Das können sich jetzt also alle Produktiv-Systeme jederzeit abholen.

Dazu haben wir einen CRON-Job etabliert, der alle 6 Stunden ein Bash-Script aufruft:

#!/usr/bin/bash
# Gets hosts file entries from the PLS server to circumvene
# notorious DNS failures.

HOST=ourPLShost.com
TMP=/etc/hosts.tmp
TAG=DNSHELP
set -e
sed "/${TAG}/d" /etc/hosts > ${TMP}
echo "# ${TAG} entries are pulled daily from the PLS server" >> ${TMP}
set -o pipefail
curl -sk https://${HOST}/hosts | grep ${TAG} | sed -re "s/$/ [$(date +%s)] $(date)/" >> ${TMP}
mv -f ${TMP} /etc/hosts

Dadurch landen alle 6 Stunden die Einträge vom PLS-System in den hosts-Files unserer Produktiv-Systeme. Und zwar ergänzt mit einem Unix-Timestamp und lesbarem Datum.

Ein Dank hier an Mario, der das Script erstellt hat.

Überwachung

Es besteht die Gefahr, dass im cron-Job oder sonst wo die Aktualisierung fehlschlägt. Aus diesem Grund prüfen wir einmal täglich, wie alt die Einträge im hosts-File sind (PHP monitoring tool). Dazu nutzen wir den Unix-Timestamp um bei einem Alter von mehr als 5 Tagen einen Alarm im Monitoring auszulösen. Oder wenn die Einträge im hosts-File ganz fehlen. So können wir bemerken, wenn das System fehlerhaft wird oder zB die Information auf unserem PLS nicht mehr angerufen werden kann.

Fazit

Soweit ist das cool und hilft extrem. Und wir haben die Möglichkeit die Einträge alle 6 Stunden anzupassen, falls die DNS-Einträge sich verändern (also der zu erreichende Server umzieht).

Schade dass wir DNS in dieser Weise umgehen müssen. Vielleicht wird es ja mal unnötig, wenn DNS wieder normal funktioniert?