【发布时间】:2014-03-20 04:34:14
【问题描述】:
我想知道如何在 SolrCloud 之上设置负载平衡器,或者不需要负载平衡器?
如果是前者,是否需要将分片领导者添加到负载均衡器中?那么如果分片领导者由于某种原因发生变化怎么办?还是最好将集群中的所有机器(包括副本)都添加到负载均衡器中?
如果是后者,我猜cname需要指向SolrCloud集群并且应该是round robin DNS?
任何来自 Solrcloud 实际操作经验的建议都会非常感激。
【问题讨论】:
我想知道如何在 SolrCloud 之上设置负载平衡器,或者不需要负载平衡器?
如果是前者,是否需要将分片领导者添加到负载均衡器中?那么如果分片领导者由于某种原因发生变化怎么办?还是最好将集群中的所有机器(包括副本)都添加到负载均衡器中?
如果是后者,我猜cname需要指向SolrCloud集群并且应该是round robin DNS?
任何来自 Solrcloud 实际操作经验的建议都会非常感激。
【问题讨论】:
通常SolrCloud与ZooKeeper组合使用,客户端使用CloudSolrServer访问SolrCloud。
查询将按以下流程完成。
请注意,我只是部分阅读了 Solr 的源代码,并且有很多猜测。另外我读的是Solr 4.1的源代码,所以它可能已经过时了。
IPAddress:Port 列表。CloudSolrServer 的实例从 ZooKeeper 检索服务器列表。CloudSolrServer的实例随机选择一个SolrCloud服务器并向其发送查询。 (还有LBHttpSolrServer循环选择服务器?)更新将以与上述相同的方式完成,但也会填充到所有服务器。
请注意,对于 SolrCloud,leader 和 replica 的差异很小,我们可以向任何服务器发送查询/更新。它会自动重定向到其他服务器。
简而言之,负载平衡是在客户端和服务器端完成的。 所以你不必担心。
【讨论】:
需要一个负载均衡器,将由 Zookeeper 与 SolrCloud 结合使用。
当您使用 SolrCloud 时,您必须使用 Zookeeper 设置分片和复制,或者使用与 SolrCloud 捆绑在一起的嵌入式 Zookeeper 服务器,或者使用独立的 Zookeeper ensemble(推荐用于冗余)。
然后您将使用 SolrCloudClient 将您的查询发送到 Zookeeper,然后 Zookeeper 会将您的查询转发到集群中的正确分片。 SolrCloudClient 将在实例化时要求所有 Zookeeper 实例的名称和地址,并且将从那里适当地处理您的负载平衡。
请看以下优秀教程: http://www.francelabs.com/blog/tutorial-solrcloud-amazon-ec2/
Solr 文档: https://cwiki.apache.org/confluence/display/solr/Setting+Up+an+External+ZooKeeper+Ensemble
【讨论】:
这句话指的是 Solr 的最新版本,在撰写本文时是 ver。 7.1
当 Solr 节点接收到搜索请求时,请求被路由 在幕后复制到属于 正在搜索集合。
所选副本充当聚合器:它创建内部请求 随机选择集合中每个分片的副本, 协调响应,发出任何后续内部请求 需要(例如,细化构面值,或请求额外的 存储字段),并为客户端构造最终响应。
在 SolrCloud 集群中,每个单独的节点负载平衡读取 跨集合中所有副本的请求。你仍然需要一个负载 与集群通信的“外部”平衡器,或者您需要一个 了解如何阅读 Solr 并与之交互的智能客户端 ZooKeeper 中的元数据,并且只请求 ZooKeeper 集合的 地址开始发现它应该向哪些节点发送请求。 (Solr 提供了一个名为 CloudSolrClient 的智能 Java SolrJ 客户端。)
【讨论】:
我处于类似的情况,我不能依赖 CloudSolrServer 进行负载平衡,我正在评估的一个可能的解决方案是使用 Airbnb 的突触 (http://nerds.airbnb.com/smartstack-service-discovery-cloud/) 根据状态动态重新配置现有的 haproxy 负载平衡器我们从 Zookeeper 获得的 SolrCloud 集群。
【讨论】: