Solr API用于获取分片的领导/副本状态

时间:2014-09-04 10:03:26

标签: solr lucene

Solr有一个管理界面,我们可以在其中检查部署到Solr Cloud的每个集合。例如,我可以在集合中看到一个Slice / Shard,如下面的URL中所述。

enter image description here

出于安全原因,我们的生产环境无法访问此管理界面。我需要提供一个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来获取分片的副本/领导者状态?

由于

4 个答案:

答案 0 :(得分:6)

代码没有查看副本状态。这是打印出副本状态的那个:

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());
        }
    }

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

您可以使用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;
  }