Подтвердить что ты не робот

Лучший подход для указания узлов ZooKeeper на клиентах Solr?

У нас есть несколько настроек SolrCloud и ZooKeeper, работающих в AWS EC2, и по большей части они работают бесперебойно, но после недавнего сбоя одного из наших узлов ZooKeeper я начал задаваться вопросом, существует ли какой-либо метод адреса клиентов ZooKeepers был лучше других. Наши клиенты основаны на Java, используя java-клиент Solr 4.1.

Первоначально мы использовали записи хост файла для идентификации ZooKeepers, но при условии, что записи в /etc/hosts были современными, учитывая характер AWS, стало очень утомительно делать это. Таким образом, теперь мы используем собственный DNS через Route53 для идентификации ZooKeepers. Но мы по-прежнему идентифицируем узлы ZooKeeper по отдельности, так что пример, который мы в настоящее время указываем при запуске наших клиентов:

-Dsolr.zookeeperHosts='zk-1.mydomain.com:2181,zk-2.mydomain.com:2181,zk-3.mydomain.com:2181'

Хосты zk-1.mydomain.com и т.д. являются просто CNAME'd для DNS для каждого экземпляра ZooKeeper EC2. Итак, теперь, если Amazon заставляет нас перезагружать ZooKeeper, что заставляет его получать новый IP-адрес, клиент в конечном итоге получит новый IP-адрес при обновлении записи DNS.

Мой вопрос связан с вопросом, есть ли еще лучший подход к решению этой проблемы. Предположим, мы хотели добавить в смесь дополнительные ZooKeepers, поэтому у нас был кворум из 5 узлов вместо 3. (на самом деле я хочу это сделать.) Было бы разумнее иметь единую DNS-циклическую запись, содержащую все ZooKeepers в нем и передать это единственное DNS-имя клиенту?

Например, настройте запись DNS zookeepers.mydomain.com как CNAME, которая указывает на zk-1.mydomain.com, zk-2.mydomain.com и zk-mydomain.com, а затем просто pas для моих клиентов:

-Dsolr.zookeeperHosts='zookeepers.mydomain.com:2181'

Таким образом, когда я добавляю в кластер новые ZooKeepers, я мог бы просто добавить еще одну запись CNAME в zookeepers.mydomain.com и не беспокоиться об обновлении конфигураций на всех клиентах.

Является ли клиент Solr достаточно умным, чтобы использовать запись DNS с несколькими записями? В частности, если один ZooKeeper отключился и клиент пытается подключиться к нему, будет ли клиент достаточно знать, чтобы снова запросить DNS, чтобы получить IP следующего ZooKeeper и попытаться связаться с ним?

4b9b3361

Ответ 1

Использование CNAME - хорошая идея, но я предлагаю расширить ее с помощью Elastic IPs, чтобы сделать их более надежными, изменения DNS требуют времени для распространения Elastic IPS, которые являются более отзывчивыми.

Однако у меня есть кое-какое предостережение, в наших исследованиях мы попытались выяснить, как Zookeeper/Solr будет реагировать, если вместо использования имен хостов /ips мы использовали балансировщик нагрузки и дадим это Solr НЕ ДОЛЖНЫ ДЕЛАТЬ! Кажется, что внутренне идентифицирует каждую запись solr.zookeeperHosts как сервер zookeeper, а когда она по какой-то причине не удалась, она недействительна, поскольку с точки зрения Solr не было никаких других серверов Zookeeper, поэтому Solr wen Нет. Я предполагаю, что у вас будет такая же проблема, если у вас будет запись с несколькими IP-адресами.

Лучшее решение для этого - автоматизировать как можно больше. В предыдущем проекте я использовал шеф-повар, чтобы собрать все узлы zookeeper и динамически установить имя ips/hostname на каждом solr node. Если шеф-повар будет для вас значительным изменением, то это можно сделать с помощью тегов EC2 и некоторых умных сценариев bash. Вы можете пометить свои экземпляры zookeeper с помощью тега и использовать aws cli для этого, чтобы получить список ips.

 ec2-describe-instances --filter "tag-key=Zookeeper"