Назад | Перейти на главную страницу

Наиболее устойчивая форма (частной) кластеризации DNS?

Я работаю над установкой с двумя центрами обработки данных, связанными с помощью MAN (мост), и все между ними дублируется, в режиме аварийного переключения с RedHat Cluster, DRBD и другими подобными вещами.

У меня есть один DNS-сервер для каждого местоположения, но оказывается, что наличие обоих в /etc/resolv.conf не очень помогает; если один из них выходит из строя, клиент ждет около 10 секунд в половине случаев. Другими словами, он использует их для балансировки нагрузки, а не для отработки отказа. Поэтому я настроил два сервера для использования VIP с ucarp (≈VRRP).

Есть ли способ, чтобы оба моих DNS-сервера работали и, например, все время отвечали на один и тот же IP-адрес? Ничего страшного, если один запрос NS дает два ответа.

Есть ли способ сделать это с помощью Anycast / Multicast и так далее?

Изменить: оказывается, что anycast не принесет мне никакой пользы в моем сценарии, у меня есть только статические маршруты, и большая часть трафика на самом деле проходит через мост.

Было бы интересно, если бы два DNS-сервера отвечали на запросы с одного и того же IP-адреса, если это возможно.

Вы можете значительно уменьшить проблемы, установив несколько параметров в файле resolv.conf:

options rotate timeout:2

rotate заставляет распознаватель выбирать один из ваших серверов имен случайным образом, а не использовать первый, если он не истечет. timeout: 2 уменьшает время ожидания DNS до двух секунд, а не до значения по умолчанию.

(NB: это было протестировано на Debian / Ubuntu, но я не думаю, что это специфическое изменение Debian)

Anycast DNS позволит вам настроить один IP-адрес преобразователя для всех ваших клиентов; клиентские запросы будут перенаправлены на «ближайший» (с точки зрения сетевой маршрутизации) сервер.

Если вы связали рекламу виртуального IP-адреса anycast с проверкой работоспособности (например, запросили запись A для известного домена), то в случае сбоя одного из ваших серверов его маршрут будет отменен. После повторного объединения сети все запросы будут перенаправлены на другое устройство без какой-либо ручной перенастройки.

С точки зрения реализации это можно сделать либо с помощью аппаратных устройств (например, F5 Big IP, Citrix Netscaler), либо с помощью вашей собственной конфигурации. Вы можете либо запустить демон маршрутизации (например, Quagga), работающий на ваших DNS-серверах, либо иметь несколько пользовательских скриптов, которые входят в ваши маршрутизаторы, чтобы изменить состояние каждого виртуального IP-адреса anycast.

Исправьте клиента - используйте лучший резолвер.

lwresd является частью Bind. Он работает как локальная служба. Вы настраиваете libc для использования через /etc/nsswitch.conf, поэтому его использование прозрачно для всех программ, кроме статически скомпилированных.

lwresd отслеживает производительность и доступность настроенных серверов имен (это стандартное поведение Bind). Если хост становится недоступным, lwresd отключается от сервера и отправляет все запросы на другие настроенные серверы. Поскольку он выполняется локально на каждом хосте, он обычно должен отправлять все запросы на ближайший сервер.

Я запускаю внутренний рекурсивный DNS-кластер BGP anycast на двух балансировщиках нагрузки виртуального сервера Linux (IPVS), и он отлично работает.

Базовая настройка описана здесь: отлично: извините, новым пользователям не разрешено добавлять гиперссылки ... (см. Ссылку ниже, а затем)

Проблема с использованием VRRP для IP-адреса службы заключается в том, что он будет перемещаться между двумя вашими серверами, и, следовательно, вашему серверу имен необходимо будет быстро подключиться к нему, чтобы иметь возможность отвечать на запросы в случае аварийного переключения. Вы можете обойти это с помощью NAT, как и в моей настройке IPVS, но я бы рекомендовал балансировку нагрузки с активными проверками служб, чтобы вы знали, когда что-то не так.

Обратите внимание, что, хотя существуют реализации DNS, которые используют многоадресную рассылку (например, Apple Bonjour / mdns), они обычно не подходят для надежной или рекурсивной службы DNS большого объема, а также обычно ограничены для использования в одном и том же домене конфликтов, то есть в локальной сети.

Простой немой способ:

Попросите ваш Linux быть более агрессивным на DNS-серверах в resolv.conf: options timeout: 0.1 rotate

Таким образом, тайм-аут быстрый, а чередование заставляет его использовать оба для циклического перебора нагрузки, без каких-либо VIP / VRRP / персонала для управления, всего 2 DNS-сервера, выполняющих свою работу ...

Anycast часто используется для решения этого требования. Anycast DNS - это использование политик маршрутизации и адресации для воздействия на наиболее эффективный путь между одним источником (DNS-клиент) и несколькими географически разнесенными целями, которые «слушают» службу (DNS) в группе получателей. В Anycast одни и те же IP-адреса используются для адресации каждой из целей прослушивания (в данном случае DNS-серверов). Маршрутизация уровня 3 динамически обрабатывает вычисление и передачу пакетов от нашего источника (DNS-клиент) к его наиболее подходящей цели (DNS-сервер).

Пожалуйста, посетите www.netlinxinc.com для получения всей серии сообщений в блоге, посвященных Anycast DNS. Там вы найдете рецепты настройки Anycast DNS. В этой серии статей рассматривается Anycast DNS с использованием статической маршрутизации и RIP, и в ближайшее время я опубликую рецепты по OSPF и BGP.

Если допустимо иметь несколько секунд сбоя DNS до того, как произойдет переключение, вы можете создать для этого простой сценарий оболочки. Нерабочий псевдокод:

#!/bin/sh
localns=192.168.0.1
remotens=192.168.0.2
currentns=`cat /etc/resolv.conf | grep nameserver | awk '{print $2}'`

while 1; do
    if ping -W1 -q -c3 -i0.5 $localns > /dev/null 2>&1; then
        # Local DNS is up
        [ $currentns != $localns ] || echo "nameserver $localns" > /etc/resolv.conf
        currentns=$localdns
    else;
        # Local DNS is down
        [ $currentns != $remotens ] || echo "nameserver $remotens" > /etc/resolv.conf
        currentns=$remotedns
    sleep 2 # Will detect failures in no more than 5 secs

Если вы используете балансировщики нагрузки где-либо на своем сайте, вы сможете настроить их так, чтобы DNS использовался в качестве виртуальной службы.

Мой Kemp Loadmaster 1500s можно настроить для циклического переключения с переключением при отказе. Это будет использовать их сервисную проверку, чтобы убедиться, что каждый DNS-сервер работает каждые несколько секунд, и разделить трафик между двумя серверами. Если кто-то умирает, он выпадает из пула RR, и запрашивается только «активный» сервер.

Вам просто нужно указать свой resolv.conf на VIP на балансировщике нагрузки.

Вы хотите, чтобы DNS был надежным. Добавление огромного количества сложности к установке вызовет абсолютный кошмар, когда что-то сломается.

Некоторые из предложенных решений работают только тогда, когда резервные DNS-серверы находятся на одном сайте.

Основная проблема заключается в том, что клиент DNS не работает должным образом. Он не помнит, когда сервер был недоступен, и продолжает попытки подключиться к тому же неотвечающему серверу.

NIS решила эту проблему, сохранив состояние ypbind. Корявое решение, но обычно работает.

Решение здесь - положиться на поставщиков, которые предложат разумное решение этой проблемы. С IPV6 ситуация ухудшается, поскольку запросы AAAA увеличивают время, потраченное впустую на таймауты. Я видел, как протоколы терпят неудачу (например, соединение sshd), потому что они тратили много времени на ожидание таймаутов DNS из-за единственного недоступного DNS-сервера.

Тем временем, как предлагалось ранее, напишите сценарий, который заменяет resolv.conf на сценарий, содержащий только допустимые серверы имен. Поделитесь этим сценарием с поставщиками, чтобы продемонстрировать нечистое решение, которое вы были вынуждены реализовать.

Это не было серьезно протестировано и предполагает, что nslookup выполняет синтаксический анализ, как мой, и grep, который поддерживает "-q".

Выполняйте это из cron каждые 5 минут или около того.

Я не говорю всерьез, что кто-то действительно использует cron и сценарий оболочки для управления критическим отказом, неожиданности обработки ошибок просто слишком велики. Это только проверка концепции.

Чтобы проверить это на практике, измените строку «nameservers =» вверху, измените resolv_conf вверху на /etc/resolv.conf, а не на /tmp/resolv.conf, и заголовок по умолчанию для resolv.conf, который содержит example.com .

Вам может потребоваться перезапустить nscd, если вы замените resolv.conf.

#!/bin/bash
# full list of nameservers
nameservers="127.0.0.1 192.168.0.1 192.168.1.1"

# resolv.conf filename, change to /etc/resolv.conf for production use
resolv_conf="/tmp/resolv.conf"

# for tracking during the test
failed_nameservers=""
good_nameservers=""

# test loop
for nameserver in $nameservers; do
    if nslookup localhost $nameserver | grep -q 'Address.*127\.0\.0\.1'; then
        good_nameservers="$good_nameservers $nameserver"
    else
        failed_nameservers="$failed_nameservers $nameserver"
    fi
done

# if none succeded, include them all
if [ -z "$good_nameservers" ]; then
    good_nameservers="$nameservers"
fi

# error reporting, consider writing to syslog
if [ -n "$failed_nameservers" ]; then
    echo warning: failed nameservers $failed_nameservers
fi

# create the temporary replacement resolv.conf
new_rc="$resolv_conf.new.$$"
echo domain example.com  > $new_rc
echo search example.com >> $new_rc
for nameserver in $good_nameservers; do
    echo nameserver $nameserver >> $new_rc
done

# don't deploy a corrupt resolv.conf
if ! grep -q nameserver $new_rc; then
    echo warning: sanity check on $new_rc failed, giving up
    exit 1
fi

# keep a backup
if [ -f $resolv_conf ]; then
    rm -f $resolv_conf.previous
    ln $resolv_conf $resolv_conf.previous
fi
# deploy the new one
mv $new_rc $resolv_conf

Сначала я бы попробовал продублировать ваш VRRP, но с дополнительным VIP. Для каждого VIP чередуйте основной и резервный узлы.

DNS1 = первичный vip1, вторичный vip2 DNS2 = первичный vip2, вторичный vip1

Затем пусть каждая из ваших клиентских машин имеет оба IP-адреса в преобразователе. Таким образом, нагрузка распределяется по серверам имен, но если один из них выходит из строя, другой берет на себя дополнительную нагрузку.

Есть ли шанс, что у вас есть балансировщики нагрузки на обоих сайтах? В противном случае вы могли бы расти с LVS.

Имейте адрес службы DNS на каждом сайте, который является VIP на балансировщике нагрузки. Затем активная / пассивная балансировка нагрузки каждого VIP на двух DNS-серверах в пользу локального.