У нас есть несколько установок 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 и попытаться связаться с ним?