【问题标题】:Loadbalancer and Solrcloud负载均衡器和 Solrcloud
【发布时间】:2014-03-20 04:34:14
【问题描述】:

我想知道如何在 SolrCloud 之上设置负载平衡器,或者不需要负载平衡器?

如果是前者,是否需要将分片领导者添加到负载均衡器中?那么如果分片领导者由于某种原因发生变化怎么办?还是最好将集群中的所有机器(包括副本)都添加到负载均衡器中?

如果是后者,我猜cname需要指向SolrCloud集群并且应该是round robin DNS?

任何来自 Solrcloud 实际操作经验的建议都会非常感激。

【问题讨论】:

    标签: solr solrcloud


    【解决方案1】:

    通常SolrCloud与ZooKeeper组合使用,客户端使用CloudSolrServer访问SolrCloud。

    查询将按以下流程完成。

    请注意,我只是部分阅读了 Solr 的源代码,并且有很多猜测。另外我读的是Solr 4.1的源代码,所以它可能已经过时了。

    1. ZooKeeper 拥有所有 SolrCloud 服务器的 IPAddress:Port 列表。
    2. 客户端CloudSolrServer 的实例从 ZooKeeper 检索服务器列表。
    3. (客户端)CloudSolrServer的实例随机选择一个SolrCloud服务器并向其发送查询。 (还有LBHttpSolrServer循环选择服务器?)
    4. 服务器端)接收查询的 SolrCloud 服务器从服务器列表中随机选择分片副本(每个分片一个服务器),并将查询重定向到它。 (请注意,所有 SolrCloud 服务器都保存了可以从 ZooKeeper 接收的服务器列表)

    更新将以与上述相同的方式完成,但也会填充到所有服务器。

    请注意,对于 SolrCloud,leader 和 replica 的差异很小,我们可以向任何服务器发送查询/更新。它会自动重定向到其他服务器。

    简而言之,负载平衡是在客户端和服务器端完成的。 所以你不必担心。

    【讨论】:

    • 感谢您的详细回答。不幸的是,我不能使用基于 Java 的客户端,所以 CloudSolrServer 不是一个选项。我想知道是否有任何负载均衡器可以与 Zookeeper 通信以保持服务器状态为最新?
    • AFAIK,除了 Java 之外,没有其他语言中的 CouldSolrServer 等价物。但是,有一些 ZooKeeper 客户端:cwiki.apache.org/confluence/display/ZOOKEEPER/ZKClientBindings,因此您可以使用 ZK 客户端获取服务器列表,并执行与 CloudSolrServer 相同的操作——随机选择服务器并向其发送查询。
    【解决方案2】:

    需要一个负载均衡器,将由 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

    【讨论】:

      【解决方案3】:

      这句话指的是 Solr 的最新版本,在撰写本文时是 ver。 7.1

      Solrcloud - Distributed Requests

      当 Solr 节点接收到搜索请求时,请求被路由 在幕后复制到属于 正在搜索集合。

      所选副本充当聚合器:它创建内部请求 随机选择集合中每个分片的副本, 协调响应,发出任何后续内部请求 需要(例如,细化构面值,或请求额外的 存储字段),并为客户端构造最终响应。

      Solrcloud - Read Side Fault Tolerance

      在 SolrCloud 集群中,每个单独的节点负载平衡读取 跨集合中所有副本的请求。你仍然需要一个负载 与集群通信的“外部”平衡器,或者您需要一个 了解如何阅读 Solr 并与之交互的智能客户端 ZooKeeper 中的元数据,并且只请求 ZooKeeper 集合的 地址开始发现它应该向哪些节点发送请求。 (Solr 提供了一个名为 CloudSolrClient 的智能 Java SolrJ 客户端。)

      【讨论】:

        【解决方案4】:

        我处于类似的情况,我不能依赖 CloudSolrServer 进行负载平衡,我正在评估的一个可能的解决方案是使用 Airbnb 的突触 (http://nerds.airbnb.com/smartstack-service-discovery-cloud/) 根据状态动态重新配置现有的 haproxy 负载平衡器我们从 Zookeeper 获得的 SolrCloud 集群。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-07
          • 1970-01-01
          • 2020-04-17
          • 2012-06-13
          • 1970-01-01
          • 1970-01-01
          • 2014-02-12
          • 2020-08-19
          相关资源
          最近更新 更多