Emre Sevinç
Emre Sevinç

Reputation: 8521

How to get the cluster state of Solr Cloud using the solrZkClient and zkStateReader?

I've downloaded and installed Solr (SolrCloud) v. 4.10.3 on my local system, and can run it without any problems, index documents, interact with its web UI. I can also use the following command line to interact with its ZooKeeper:

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

and it returns me the information about SolrCloud. Now I'm trying to get a similar set of information programmatically, using Java.

I've tried the following:

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

But unfortunately zkStateReader.getClusterState() returns null.

In the log output I see the following:

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 watcher=org.apache.solr.common.cloud.ConnectionManager@3b22cdd0
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 org.apache.solr.common.cloud.ConnectionManager@3b22cdd0 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

Am I missing something? How can I get that information using Java?

Upvotes: 4

Views: 5022

Answers (2)

Ciobanu Andrei
Ciobanu Andrei

Reputation: 325

@Vijay the CloudSolrServer is deprecated. Instead use CloudSolrClient. Thank you for your tip. From there I reached this solution. Thank you.

If you didn't resolved this, I have a solution for you. This method I need it too in order to check the replicas from another systems.

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

I hope that my lately answer will be useful for others.

Nice day.

Upvotes: 5

Vijay
Vijay

Reputation: 415

I see that you are trying to get solrcloud cluster state using java., You could try something like this..

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

And the output will be something like this for a collection with 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
        ]
    } }

Upvotes: 6

Related Questions