使用 solrj 和 LBHttpSolrClient 访问单个 solrcloud 实例



是否在solrj中使用LBHttpSolrClient访问单个solrcloud实例,它是否不如使用默认的solrj和zookeeper行为健壮? 它能否在单个 solrcloud 实例上正确实现负载均衡?

我可用的 solrcloud 实例有一个包含大约 900 万个文档的集合,分布在三个分片上,每个分片大约有 300 万个文档。 solrcloud中有三个节点(服务器),有3个分片,copytionFactor为2,maxShardsPerNode为2。 对于这个 solrcloud 实例,这三台服务器上也运行着 3 个 zookeeper 节点。

注意:以下名为solrUrls的变量中列出的值应以"http://"而不是"http_url_"为前缀。 我目前无法发布超过 2 个 URL,因此我必须对它们进行"编码"。 不好意思。

这是我被告知使用的基本代码:

String zkUrls = "solrd1:2181,solrd2:2181,solrd3:2181";
String solrUrls = {"http_url_solrd1:8983", "http_url_solrd2:8983", "http_url_solrd3:8983"};
LBHttpSolrClient.Builder lbclient = 
new BHttpSolrClient.Builder().withBaseSolrUrls(solrUrls);
CloudSolrClient solr = new CloudSolrClient.Builder()
.withLBHttpSolrClientBuilder(lbclient)
.withZkHost(zkUrls)
.build();
cloudServer.setDefaultCollection(defaultCollection);

LBHttpSolrClient客户端是否能够正确使用提供的solrUrls,因为该变量中列出的每个节点都只是单个 solrcloud 中的节点? 此负载平衡客户端是否会自动查询所有其他节点,以确保整个集合(而不仅仅是该节点上存在的分片)的结果完整?

如果使用LBHttpSolrClient客户端是访问单个solrcloud实例的正确方法(比solrj和zookeeper更好),那么有没有更好的方法让Zookeeper提供基本的solr url? 我的印象是,LBHttpSolrClient客户端早于整个 solrcloud 设置,是一种在多个独立的 solr 实例上进行负载平衡的方法;如果是这样的话,那么与Solrj和Zookeeper相比,使用LBHttpSolrClient客户端会过时吗?

引用:

  • 如果我使用不与 solrcloud 中的 zookeeper 通信的负载均衡器,是否会丢失功能?
    • 此链接似乎有一个适当的标题,可能会为我提出的相同问题提供一些见解,但它没有答案。
  • 负载均衡器和 Solrcloud
    • 这个链接讨论了solrj和zookeeper如何协同工作,但没有解决我关于LBHttpSolrClient客户端是否不太健壮的问题,或者它是否可以在小型solrcloud的单个实例上正常工作。
  • SolrCloud负载平衡
    • 不解决 solrj 和 zookeeper 是否比使用LBHttpSolrClient客户端更适合。

我认为你把事情复杂化了,你甚至可以在你的代码中完全跳过LBHttpSolrClient,Solrj将在幕后创建所需的实例。

简而言之,CloudSolrClient使用LBHttpSolrClient向正确的Solr实例发送请求。如果你想充分利用你的Solrcloud设置,使用CloudSolrClient,如果你只使用LBHttpSolrClient(没有CloudSolrClient),那么你不会知道Solr节点已经关闭(直到你得到失败的请求)。

最新更新