Лучший подход для указания хостов 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 и т. Д. Просто привязаны к DNS через CNAME для каждого экземпляра 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, а затем просто передайте это моим клиентам:

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

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

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


person Bruce P    schedule 04.12.2015    source источник
comment
Вы попробовали это? Это сработало?   -  person Stephane    schedule 08.02.2017


Ответы (1)


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

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

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

 ec2-describe-instances --filter "tag-key=Zookeeper"
person Mon Villalon    schedule 23.01.2016