Load balancing serwera DNS

Zapewnienie wysokiej dostępności usług jest jednym z wymogów nowoczesnych infrastruktur IT. O ile load balncing usług realizowanych w oparciu o protokół połączeniowy (TCP) jest powszechny i dobrze opisany, o tyle rozwiązania dystrybucji ruchu dla usług w oparciu o protokół bezpołączeniowy (UDP) nie są już tak popularne. Zbudowanie systemu umożliwiającego load balancing DNS wymaga użycia kilku specyficznych rozwiązań.

Zapytania DNS realizowane są co do zasady w oparciu o UDP, jednak pełna obsługa load balancignu powinna zakładać także przekazywanie zapytań w oparciu o TCP. Takie założenie wiąże się z uwzględnieniem w implementacji dwóch rodzajów oprogramowania o czym napiszę w dalszej części.

Wdrożenie powinniśmy zacząć od przygotowania serwerów DNS (ja korzystam z serwerów BIND), które będą elementami naszego zaplecza. W najprostszym wariancie zaplecza mogą nasłuchiwać po standardowym porcie 53, jednak jeżeli chcemy mieć pewność, że nie trafią do nich bezpośrednie zapytania powinniśmy go zmienić. Definicję portu na którym nasłuchiwać ma serwer umieszczamy w sekcji options konfiguracji BIND:

options {
        [...]
        listen-on port 5353 { 127.0.0.1; };
        [...]
};

Po konfiguracji backendu należy przystąpić do kolejnego kroku, którym jest odpowiednia  konfiguracja programów do forwardowania ruchu do serwera DNS. W moim systemie użyłem dwóch programów – Haproxy dla loadbalancingu zapytań TCP oraz pen z rozszerzeniem do Zen Load Balancer dla UDP.

Konfigurację Haproxy wykonałem wg standardowych schematów:

listen dnsbalance 0.0.0.0:53
    mode tcp
    option tcplog
    balance leastconn
    server dns01 127.0.0.1:5353
    server dns02 192.168.1.14:5353

Ustawienie loadbalancera zakłada, że będzie on nasłuchiwał po wszystkich możliwych adresach IP. W specyficznych konfiguracjach możemy założyć przypisanie portu do pojedynczego IP  jednak w ogólności nie jest to niezbędne.

Dodatkowo – ze względu na optymalizację – warto pamiętać, że dla potrzeb zapytań DNS wystarczy nam zapewnienie dwukierunkowego przekierowywania pakietów, czyli operowania w tzw. warstwie 4. Haproxy pozwala nam na ustawienie takiego forwardingu (zamiast tradycyjnej warstwy 7) poprzez użycie mode tcp . Pozwala to zmniejszyć obciążenie loadbalancera co jest przydatne przy konfiguracjach obsługujących duży ruch.

Jako typ balansowania ruchu użyty został leastconn, który pozwala na rozkład obciążenia serwerów zaplecza na podstawie analizy ilości połączeń per serwer.

Jak wspomniałem na początku znalezienie dobrego oprogramowania do loadbalncingu ruchu UDP nie jest rzeczą prostą. Nieskomplikowany forwarding i prosty roundrobin może zapewnić użycie iptables, ale rozwiązanie to jest dość toporne i sprawdza się jedynie w prostych konfiguracjach.

Efektem poszukiwań dobrego i elastycznego rozwiązania było użycie pen w wersji 0.18. Program jest nieskomplikowanym loadbalancerem podobnym do innych produktów na rynku. Sięgnąłem po niego ze względu na  fakt, że ludzie z Zen Load Balancer napisali patch do pen, który umożliwia mu sprawne forwardowanie ruchu UDP.

Instalację i konfigurację pen’a musimy więc rozpocząć od implementacji patch’a w źródłach programu. Robimy to z pomocą liux’owego programu patch:

patch pen.c zenlb_pen_c.patch

następnie budujemy pen’a tak jak inne programy ze źródeł:

./configure
make
make install

Po kompilacji pozostaje nam już jedynie ustawienie reguł loadbalancingu. pen’a konfigurujemy wprost z linii komend, a wszystkie parametry i przełączniki dostępne są w manualu z którego korzystać możemy za pomocą man.

Moja konfiguracja wyglądała następująco:

pen -r -U 53 127.0.0.1:5353 192.168.1.14:5353

Podobnie jak w przypadku Haproxy mamy dwa serwery zaplecza, jednak na potrzeby rozdzielania ruchu UDP użyłem algorytmu roundrobin, który umożliwia statystyczny rozkład ruchu.

Tak przygotowana konfiguracja umożliwia nam zachowanie wysokiej dostępności usług DNS dla naszej sieci domowej czy firmowej albo domen bez konieczności podawania w konfiguracjach nadmiarowej liczby serwerów.

Podziel się:

Mikołaj Niedbała

I'm a Poland based IT administrator, linux administrator and IT engineer creating professional IT infrastructure solutions based on Linux and virtual environments.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *