Amazon web services 在Solr客户端上指定ZooKeeper主机的最佳方法?

Amazon web services 在Solr客户端上指定ZooKeeper主机的最佳方法?,amazon-web-services,solr,apache-zookeeper,solrcloud,Amazon Web Services,Solr,Apache Zookeeper,Solrcloud,我们在AWS EC2中运行了一些SolrCloud和ZooKeeper设置,在大多数情况下,它们运行得很顺利,但在最近一个ZooKeeper节点出现故障后,我开始怀疑是否有一种让客户端寻址ZooKeeper的方法比其他方法更好。我们的客户机是基于java的,使用Solr4.1Java客户机 最初,我们使用hostfile条目来识别动物园管理员,但鉴于AWS的性质,确保/etc/hosts中的条目是最新的,这样做变得非常乏味。因此,我们现在通过路由53使用自定义DNS来识别动物园管理员。但我们仍在

我们在AWS EC2中运行了一些SolrCloud和ZooKeeper设置,在大多数情况下,它们运行得很顺利,但在最近一个ZooKeeper节点出现故障后,我开始怀疑是否有一种让客户端寻址ZooKeeper的方法比其他方法更好。我们的客户机是基于java的,使用Solr4.1Java客户机

最初,我们使用hostfile条目来识别动物园管理员,但鉴于AWS的性质,确保
/etc/hosts
中的条目是最新的,这样做变得非常乏味。因此,我们现在通过路由53使用自定义DNS来识别动物园管理员。但我们仍在单独识别ZooKeeper节点,因此,作为一个示例,我们目前在启动客户机时指定:

-Dsolr.zookeeperHosts='zk-1.mydomain.com:2181,zk-2.mydomain.com:2181,zk-3.mydomain.com:2181'
对于每个ZooKeeper EC2实例,主机
zk-1.mydomain.com
等都被简单地命名为DNS。因此,如果Amazon强制我们重新启动ZooKeeper,从而使其获得新的IP地址,那么当DNS记录更新时,客户端最终将获得新的IP

我的问题是想知道是否有更好的方法来处理这个问题。假设我们想在混合中添加额外的ZooKeepers,那么我们的仲裁是5个节点,而不是3个。(我真的想这么做。)有一个包含所有动物园管理员的DNS循环记录并将该DNS名称传递给客户端是否更有意义

例如,将DNS记录
zookeers.mydomain.com
设置为指向
zk-1.mydomain.com
zk-2.mydomain.com
zk mydomain.com
的CNAME,然后将其发送给我的客户端:

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


Solr客户端是否足够聪明,可以使用包含多个记录的DNS记录?具体地说,如果一个动物园管理员发生故障,而客户端试图连接到它,客户端是否有足够的知识再次查询DNS以获取下一个动物园管理员的IP并尝试与之通信?

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

然而,我确实有一些警告,在我们的调查中,我们试图探索如果我们使用负载平衡器而不是主机名/IP,Zookeeper/Solr将如何反应,并将其交给Solr不要这样做似乎在内部将每个solr.zookeeperHosts条目标识为zookeeper服务器,当其中一个由于某种原因失败时,它将使其无效,因为从solr的角度来看,没有任何其他zookeeper服务器,所以solr不会关闭。我猜你也会有同样的问题,因为你的唱片有几个IP

最好的解决方案是尽可能地自动化。在上一个项目中,我使用chef收集所有zookeeper节点,并在每个solr节点上动态设置IP/主机名。如果chef对您来说是一个很大的改变,那么同样可以使用EC2标记和一些聪明的bash脚本来完成。您可以使用标记标记zookeeper实例,并像这样使用aws cli获取IP列表

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

你试过了吗?它起作用了吗?