如何使用solrZkClient和zkStateReader获取Solr Cloud的群集状态?

问题描述:

我已经下载并在本地系统上安装了Solr(SolrCloud)v。4.10.3,并且可以在没有任何问题的情况下运行它,索引文档以及与其Web UI进行交互。我也可以使用下面的命令行与它的ZooKeeper进行交互:如何使用solrZkClient和zkStateReader获取Solr Cloud的群集状态?

zkcli.sh -z localhost:9983 -cmd get /clusterstate.json 

并且它返回关于SolrCloud的信息。现在我试图通过使用Java以编程方式获得类似的信息集。

我已经试过如下:

SolrZkClient solrZkClient = new SolrZkClient("localhost:9983", 4000); 
ZkStateReader zkStateReader = new ZkStateReader(solrZkClient); 
System.err.println(zkStateReader.getClusterState()); 
System.err.println(zkStateReader.getClusterState().getLiveNodes()); 

但不幸的是zkStateReader.getClusterState()回报null

在日志输出我看到以下内容:

2015-04-23 15:19:04 INFO ZooKeeper:100 - Client environment:zookeeper.version=3.4.5-1392090, built on 09/30/2012 17:52 GMT 
2015-04-23 15:19:04 INFO ZooKeeper:100 - Client environment:host.name=emre-ubuntu 
2015-04-23 15:19:04 INFO ZooKeeper:100 - Client environment:java.version=1.8.0_25 
2015-04-23 15:19:04 INFO ZooKeeper:100 - Client environment:java.vendor=Oracle Corporation 
2015-04-23 15:19:04 INFO ZooKeeper:100 - Client environment:java.home=/usr/lib/jvm/java-8-oracle/jre 
... 
2015-04-23 15:19:04 INFO ZooKeeper:438 - Initiating client connection, connectString=localhost:9983 sessionTimeout=4000 [email protected] 
2015-04-23 15:19:04 INFO ConnectionManager:207 - Waiting for client to connect to ZooKeeper 
2015-04-23 15:19:04 INFO ClientCnxn:966 - Opening socket connection to server localhost/127.0.0.1:9983. Will not attempt to authenticate using SASL (unknown error) 
2015-04-23 15:19:04 INFO ClientCnxn:849 - Socket connection established to localhost/127.0.0.1:9983, initiating session 
2015-04-23 15:19:04 INFO ClientCnxn:1207 - Session establishment complete on server localhost/127.0.0.1:9983, sessionid = 0x14ce5f89eec000d, negotiated timeout = 4000 
2015-04-23 15:19:04 INFO ConnectionManager:102 - Watcher [email protected] name:ZooKeeperConnection Watcher:localhost:9983 got event WatchedEvent state:SyncConnected type:None path:null path:null type:None 
2015-04-23 15:19:04 INFO ConnectionManager:225 - Client is connected to ZooKeeper 
null 

我缺少的东西?我如何使用Java获取这些信息?

我看到你试图用java获得solrcloud集群状态,你可以尝试这样的事情..

CloudSolrServer server = new CloudSolrServer("192.112.21.21:9983"); 
server.setZkConnectTimeout(15*60*1000); 
server.setZkClientTimeout(15*60*1000); 
server.setParser(new BinaryResponseParser()); 
server.setRequestWriter(new BinaryRequestWriter()); 
CollectionAdminRequest adminRequest = new CollectionAdminRequest(); 
adminRequest.setAction(CollectionAction.CLUSTERSTATUS); 
CollectionAdminResponse adminResponse = adminRequest.process(server); 
System.out.println(adminResponse.toString()); 

和输出会是这样与2shards集合,

{ 
    responseHeader={ 
     status=0, 
     QTime=1650 
    }, 
    cluster={ 
     collections={ 
      collection1={ 
       shards={ 
        shard1={ 
         range=80000000-ffffffff, 
         state=active, 
         replicas={ 
          core_node2={ 
           state=active, 
           core=collection1_shard1_replica1, 
           node_name=192.112.21.21: 8983_solr, 
           base_url=http: //192.112.21.21: 8983/solr, 
           leader=true 
          } 
         } 
        }, 
        shard2={ 
         range=0-7fffffff, 
         state=active, 
         replicas={ 
          core_node1={ 
           state=active, 
           core=collection1_shard2_replica1, 
           node_name=192.112.21.21: 8984_solr, 
           base_url=http: //192.112.21.21: 8984/solr, 
           leader=true 
          } 
         } 
        } 
       }, 
       maxShardsPerNode=1, 
       router={ 
        name=compositeId 
       }, 
       replicationFactor=1, 
       autoAddReplicas=false, 
       autoCreated=true 
      } 
     }, 
     live_nodes=[ 
      192.112.21.21: 8983_solr, 
      192.112.21.21: 8984_solr 
     ] 
    } } 

@Vijay CloudSolrServer已弃用。请使用CloudSolrClient。感谢您的提示。从那里我达到了这个解决方案。谢谢。

如果你没有解决这个问题,我有一个解决方案给你。 这种方法我也需要它来检查另一个系统的副本。

final CloudSolrClient server = new CloudSolrClient("localhost:2181"); 
try { 
    //probably this is the line that missed from your code... 
    server.connect(); 

    final ClusterState clusterState = server.getZkStateReader().getClusterState(); 
    final DocCollection collection = clusterState.getCollection("collection1"); 
    //EVRIKA! collection object 
    // and get the leader of the collection...pretty easy. 
    Replica leader = clusterState.getLeader("collection1", "shard1"); 
} catch (Exception e) { 
    // do your stuff 
} finally { 
    server.close(); 
} 

我希望我最近的回答对其他人有用。

美好的一天。

+0

谢谢巴迪..从现在开始使用它! – Vijay