2015-04-23 54 views
4

我已經下載並在本地系統上安裝了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獲取這些信息?

回答

6

我看到你試圖用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 
     ] 
    } } 
4

@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