2015-12-04 4 views
10

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

Первоначально мы использовали записи хост-файла для идентификации 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 для каждого экземпляра EC2 Zookeeper. Итак, теперь, если 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 и попытаться связаться с ним?

+0

Вы дали это идти?Это сработало? – Stephane

ответ

0

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

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

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

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