如何使用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();
}
我希望我最近的回答对其他人有用。
美好的一天。
谢谢巴迪..从现在开始使用它! – Vijay