Что случится с Zookeeper, если DNS отключится?
Я изучаю Zookeeper и узнаю, как одним из его самых ценных аспектов является высокая доступность. Недавно у нашего внутреннего DNS возникли проблемы, которые негативно сказались на Zookeeper и других сервисах в зависимости от него.
Я не очень разбираюсь в DNS, статических / динамических IP-адресах, DNS-кэшировании и поиске, но каковы наилучшие практики для решения проблем Zookeeper и DNS?
2 ответа
Проблемы с DNS не должны затрагивать работающий кластер Zookeeper. Каждый экземпляр сервера в кластере является процессом JVM. JVM кэширует записи DNS навсегда или до перезапуска. Как только узлы сервера Zookeeper подключены и находятся в кластере, они больше не должны использовать DNS. Теоретически вы можете настроить параметры безопасности Java таким образом, чтобы они не кэшировали DNS вечно, но в случае ZK это не настройка по умолчанию.
Могут быть проблемы во время запуска сервера. Если экземпляр сервера Zookeeper не может разрешить имена для других узлов в кластере, он откажется обслуживать запрос. Поскольку конфигурация кластера часто мала и в основном статична, вы можете использовать конечные точки IP непосредственно в вашей конфигурации и избежать возможных проблем.
Если у вас есть Java-клиенты, то же самое относится и к DNS-кешированию.
Возможно, что во время сбоя DNS некоторые клиенты не смогут разрешить конечные точки Zookeeper. Технически это не является нарушением свойства высокой доступности Zookeeper. Служба Zookeeper по-прежнему доступна, но недоступна, поскольку что-то еще на критическом пути вашей системы не удалось. Зоопарк не защищает от этого.
В JDK 6 и выше поведение кэширования DNS зависит от того, какой менеджер безопасности установлен. Записи DNS кэшируются только в течение 30 секунд, если диспетчер безопасности не настроен в соответствии с этой страницей:
http://javaeesupportpatterns.blogspot.com/2011/03/java-dns-cache-reference-guide.html
Официальная документация для JDK7 (которую мы используем для запуска zookeeper) находится здесь: https://docs.oracle.com/javase/7/docs/technotes/guides/net/properties.html
Недавно у нас возникла проблема с zookeeper, с которой мы все еще сталкиваемся, но ясно, что он работает с кешем DNS 30 с (без уважения к TTL). Компиляция ниже и запуск его с теми же аргументами jvm, которые использовались для запуска zookeper, покажет вам текущие настройки:
public class DNSTTL {
public static void main(String[] args) {
// Prints "Hello, World" to the terminal window.
System.out.println("DEFAULT DNS TTL: "+sun.net.InetAddressCachePolicy.get());
}
}
Наш результат:
ПО УМОЛЧАНИЮ DNS TTL: 30
Я пока не могу точно сказать, был ли DNS причиной того, что наш кластер zookeeper рухнул (потерял лидера), но это главный подозреваемый на данный момент