簡體   English   中英

如何使用solrZkClient和zkStateReader獲取Solr Cloud的集群狀態?

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

我已經在我的本地系統上下載並安裝了Solr(SolrCloud)v.4.10.3,並且可以毫無問題地運行它,索引文檔,與其Web UI交互。 我還可以使用以下命令行與其ZooKeeper進行交互:

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 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

我錯過了什么嗎? 如何使用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();
}

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

美好的一天。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM