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

使用solrj和LBHttpSolrClient访问单个solrcloud实例,solr,load-balancing,solrj,solrcloud,Solr,Load Balancing,Solrj,Solrcloud,在solrj中使用LBHttpSolrClient访问单个solrcloud实例是否比使用默认solrj和zookeeper行为更健壮?它能在单个solrcloud实例上正确地实现负载平衡吗 我提供的solrcloud实例有一个包含大约900万个文档的集合,分布在三个碎片上,每个碎片包含大约300万个文档。solrcloud中有三个节点(服务器),有3个碎片,replicationFactor为2,maxShardsPerNode为2。对于这个solrcloud实例,这三台服务器上也运行着3个z

在solrj中使用LBHttpSolrClient访问单个solrcloud实例是否比使用默认solrj和zookeeper行为更健壮?它能在单个solrcloud实例上正确地实现负载平衡吗

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

注意:下列名为
solrUrls
的变量中列出的值应以“http://”作为前缀,而不是“http\u 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
客户端会过时吗

参考文献:

    • 这个链接似乎有一个合适的标题,可以为我提出的相同问题提供一些见解,但它没有答案
    • 本链接讨论solrj和zookeeper如何协同工作,但没有回答我的问题,即
      LBHttpSolrClient
      客户端是否不够健壮,或者它是否能在小型solrcloud的单个实例上正常工作
    • 不说明solrj和zookeeper是否比使用
      LBHttpSolrClient
      客户端更合适

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


简而言之,CloudSolrClient使用LBHttpSolrClient将请求发送到正确的Solr实例。如果您想最大限度地利用Solrcloud设置,请使用CloudSolrClient,如果您只使用LBHttpSolrClient(没有CloudSolrClient),那么您将不知道Solr节点已停止运行(直到您收到失败的请求)。

我认为您的操作过于复杂,甚至可以在代码中完全跳过LBHttpSolrClient,Solrj将在幕后创建所需的实例


简而言之,CloudSolrClient使用LBHttpSolrClient将请求发送到正确的Solr实例。如果您想最大限度地利用Solrcloud设置,请使用CloudSolrClient,如果您只使用LBHttpSolrClient(没有CloudSolrClient),那么您将不知道Solr节点已停止运行(直到收到失败的请求)。

那么您是说LBHttpSolrClient比只使用solrj和zookeeper更原始吗?这就是我的印象,因为在浏览LBHttpSolrClient时,zookeeper似乎被完全忽略了,但我找不到支持或反驳这种印象的文档。因此,即使在我的示例中,我有
.withZkHost(zkUrls)
,我完全怀疑这没有任何作用,因为在此之前您必须提供solr URL。谢谢。如果“使用solrj和zookeeper”是指在没有.withLBHttpSolrClientBuilder()行的情况下使用上面的代码,那么很明显,通过使用
.withLBHttpSolrClientBuilder()
它基本上关闭了您从zookeeper获得的任何好处?换句话说,它绕过了任何和所有zookeeper功能。是否有任何理由使用
.withLBHttpSolrClientBuilder()
指令?背景:我被迫使用它将ACL凭据传递给solr,这毫无意义,但对于他们正在使用的ACL类型或清除LBHttpSolrClient的原因,我找不到更好的替代方法。但这可能最好留给另一个帖子。你目前的理由可能是正确的。我没有详细研究过,但是如果你不提供LBHttpSolrClient,SolrJ会为你创建一个,所以这并不是说你在做一些疯狂的事情。那么你是说LBHttpSolrClient比使用SolrJ和zookeeper更原始?这就是我的印象,因为在浏览LBHttpSolrClient时,zookeeper似乎被完全忽略了,但我找不到支持或反驳这种印象的文档。因此,即使在我的示例中,我有
.withZkHost(zkUrls)
,我完全怀疑这没有任何作用,因为在此之前您必须提供solr URL。谢谢。如果“使用solrj和zookeeper”是指在没有.withLBHttpSolrClientBuilder()行的情况下使用上面的代码,那么很明显,通过使用
.withLBHttpSolrClientBuilder()
它基本上关闭了您从zookeeper获得的任何好处?换句话说,它绕过了任何和所有zookeeper功能。是否有任何理由使用
.withLBHttpSolrClientBuilder()
指令?背景:我被迫使用它将ACL凭据传递给solr,这毫无意义,但对于他们正在使用的ACL类型或清除LBHttpSolrClient的原因,我找不到更好的替代方法。但这可能最好留到另一个帖子上去