在Solr客户端上指定ZooKeeper主机的最佳方法是什么?

时间:2015-12-04 15:59:53

标签: amazon-web-services solr apache-zookeeper solrcloud

我们有一些SolrCloud& ZooKeeper设置在AWS EC2中运行,并且大多数情况下它们运行顺利,但是在我们的一个ZooKeeper节点最近发生故障之后,我开始想知道是否有任何一种让客户端解决ZooKeeper的方法比其他方法更好。我们的客户端是基于java的,使用Solr 4.1 java客户端。

最初我们使用hostfile条目来识别ZooKeepers,但考虑到AWS的性质,确保/etc/hosts中的条目是最新的,这样做变得非常繁琐。所以我们现在通过Route53使用自定义DNS来识别ZooKeepers。但是我们仍然单独识别ZooKeeper节点,因此我们当前在启动客户端时指定了这一点:

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

主机zk-1.mydomain.com等只是每个ZooKeeper EC2实例的DNS的CNAME。所以现在如果亚马逊强迫我们重新启动ZooKeeper,导致它获得一个新的IP地址,那么当DNS记录更新时,客户端最终将获得新的IP。

我的问题与想知道是否有更好的方法来处理这个问题有关。假设我们想要在混合中添加额外的ZooKeepers,所以我们有5个节点的法定数量而不是3个。(我实际上想要这样做。)拥有一个包含所有的单个DNS循环记录会更有意义吗ZooKeepers在其中并将该单个DNS名称传递给客户端?

例如,将DNS记录zookeepers.mydomain.com设置为指向zk-1.mydomain.comzk-2.mydomain.comzk-mydomain.com的CNAME,然后将其简单地传递给我的客户:

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

这样,当我向集群添加新的ZooKeepers时,我可以简单地将另一个CNAME记录添加到zookeepers.mydomain.com,而不必担心更新所有客户端上的配置。

Solr客户端是否足够智能,可以使用包含多条记录的DNS记录?具体来说,如果一个ZooKeeper碰巧关闭,并且客户端试图连接到它,客户端是否会知道再次查询DNS以获取下一个ZooKeeper的IP并尝试与之通信?

1 个答案:

答案 0 :(得分:0)

使用CNAME是一个好主意,但我建议使用弹性IP扩展它以使其更加健壮,DNS更改需要时间来传播Elastic IPS的方式更具响应性。

但是我确实有一些警告,在我们的调查中,我们试图探索Zookeeper / Solr如何反应,如果不使用主机名/ ips,我们使用负载均衡器并将其交给Solr 不要这样做! / strong>似乎在内部将每个 solr.zookeeperHosts 条目标识为一个zookeeper服务器,当一个失败时由于某种原因导致它失效,因为从Solr的角度来看,没有任何条件其他Zookeeper服务器让Solr感到沮丧。我的猜测是你有一个带有几个IP的记录会遇到同样的问题。

最好的解决方案是尽可能自动化。在之前的项目中,我使用chef来收集所有zookeeper节点,并在每个solr节点上动态设置ips / hostname。如果厨师要为您做出很多改变,那么使用EC2标签和一些聪明的bash脚本可以做到这一点。您可以使用标记标记zookeeper实例,并像这样使用aws cli来获取ips列表。

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