【问题标题】:Solr API for getting shard's leader/replica statusSolr API 用于获取分片的领导者/副本状态
【发布时间】:2019-08-17 17:17:26
【问题描述】:

Solr 有一个管理 UI,我们可以在其中检查部署到 Solr Cloud 的每个集合。例如,我可以看到集合中的切片/分片向上或未在下面的 URL 中提及。

出于安全原因,我们的生产环境不提供对此管理 UI 的访问权限。我需要提供一个 API 来获取每个集合的状态,以及它的分片和每个分片的副本。我正在使用 Solr API 来做到这一点

http://lucene.apache.org/solr/4_7_2/solr-solrj/index.html

CloudSolrServer server = new CloudSolrServer(<zk quorum>);
ZkStateReader reader = server.getZkStateReader();
Collection<Slice> slices = reader.getClusterState().getSlices(collection);
Iterator<Slice> iter = slices.iterator();
while (iter.hasNext()) {
    Slice slice = iter.next();
    System.out.println(slice.getName());
    System.out.println(slice.getState());
}

上面的代码总是返回 Active 作为分片的状态,即使它的副本也在 UI 中显示出来。我假设这仅返回分片的状态,而不是分片的领导者或副本的状态。

如何通过 Solr API 获取副本状态?有没有这方面的API? Solr Admin UI 使用什么 API 来获取分片的副本/领导者状态?

谢谢

【问题讨论】:

    标签: solr lucene


    【解决方案1】:

    代码未查看副本状态。这是打印副本状态的一个:

    CloudSolrServer server = new CloudSolrServer(zknodesurlstring);
    
        server.setDefaultCollection("mycollection");
        server.connect();
    
        ZkStateReader reader = server.getZkStateReader();
        Collection<Slice> slices = reader.getClusterState().getSlices("mycollection");
        Iterator<Slice> iter = slices.iterator();
    
        while (iter.hasNext()) {
            Slice slice = iter.next();
            for(Replica replica:slice.getReplicas()) {
    
                System.out.println("replica state for " + replica.getStr("core") + " : "+ replica.getStr( "state" ));
    
                System.out.println(slice.getName());
                System.out.println(slice.getState());
            }
        }
    

    【讨论】:

    • 这有帮助.. 谢谢!!我想知道 slice.getState() 如果其所有副本都已关闭,则应该返回 slice 的状态。它实际上没有..
    • 值得注意的是,'getSlices' 方法已在较新版本的 Solr 中被弃用和删除。相反,使用“DocCollection.getSlices()”。例如:reader.getClusterState.getCollection("mycollection").getSlices();
    【解决方案2】:

    查看http://{ipaddress}:{port}/solr/admin/info/system

    【讨论】:

      【解决方案3】:

      浏览网页界面时查看 Solr 日志。由于 Web 界面纯粹是一个客户端应用程序,因此您可以查看它查询 Solr 服务器上的哪些端点以检索有关集群当前状态的信息。

      用于创建图表的响应格式可能非常简单(因为它是在 Web 界面中解析的)。

      这也适用于管理界面中显示的其他信息。

      【讨论】:

      • 感谢 cmets!也许我应该从下次开始尝试这个。目前,上面techuser提供的建议有所帮助。
      【解决方案4】:

      您可以使用 Solr 的 Ping API 检查给定集合的所有副本的健康状态。

      请求格式:http://localhost:8983/solr/Collection-Name/admin/ping?distrib=true&wt=xml

      此命令将 ping 给定集合名称的所有副本

      在 Java 中:

      public boolean isActive(final String collectionName) {
            SolrPing ping = new SolrPing();
            ping.getParams().add("distrib", "true"); //To make it a distributed request against a collection
            SolrPingResponse response = ping.process(solrClient, collectionName);
            return response.getStatus() == 0;
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-27
        • 2021-11-08
        • 1970-01-01
        • 2017-03-07
        • 2013-12-22
        • 2019-09-26
        • 2014-04-18
        相关资源
        最近更新 更多