【发布时间】:2016-01-23 21:08:49
【问题描述】:
我们在 AWS EC2 中运行了一些 SolrCloud 和 ZooKeeper 设置,并且在大多数情况下它们运行平稳,但是最近我们的一个 ZooKeeper 节点发生故障后,我开始想知道是否有任何一种方法可以让客户端地址ZooKeepers 比其他人好。我们的客户端是基于 Java 的,使用 Solr 4.1 java 客户端。
最初我们使用主机文件条目来识别 ZooKeeper,但鉴于 AWS 的性质,确保 /etc/hosts 中的条目是最新的,这样做变得非常乏味。所以我们现在通过 Route53 使用自定义 DNS 来识别 ZooKeeper。但我们仍在单独识别 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。
我的问题是想知道是否有更好的方法来处理这个问题。假设我们想在混合中添加额外的 ZooKeeper,所以我们有 5 个节点而不是 3 个节点。(我实际上想这样做。)拥有一个包含所有节点的 DNS 循环记录是否更有意义ZooKeepers 在其中并将单个 DNS 名称传递给客户端?
例如,将 DNS 记录 zookeepers.mydomain.com 设置为指向 zk-1.mydomain.com、zk-2.mydomain.com 和 zk-mydomain.com 的 CNAME,然后简单地将其传递给我的客户:
-Dsolr.zookeeperHosts='zookeepers.mydomain.com:2181'
这样,当我向集群添加新的 ZooKeeper 时,我可以简单地将另一条 CNAME 记录添加到 zookeepers.mydomain.com,而无需担心更新所有客户端上的配置。
Solr 客户端是否足够聪明,可以使用包含多个记录的 DNS 记录?具体来说,如果一个 ZooKeeper 发生故障,并且客户端尝试连接它,客户端是否知道足以再次查询 DNS 以获取下一个 ZooKeeper 的 IP 并尝试与之通信?
【问题讨论】:
-
你试过了吗?成功了吗?
标签: amazon-web-services solr apache-zookeeper solrcloud