solr4.0 的零散介绍

来源:互联网 发布:mac怎么设置acc模式 编辑:程序博客网 时间:2024/04/28 22:13

经过3年的开发 传说中的solr4.0终于发布了,经一段时间的预研 测试 使用 算是对其有了些零散的认识,现记录如下,想到哪就写到哪。
先说一下客户端cloudsolrserver的请求过程:
大致的过程是先连接zookeeper从zk上随机获得collection的一个leader的url
然后提交数据。
具体的提交过程:
NamedList<Object> org.apache.solr.client.solrj.impl.CloudSolrServer.request(SolrRequest request) throws SolrServerException,IOException
首先连接zookeeper:
调用connect()方法,connect()里会连接zookeeper  获得配置信息并实例化ClusterState对象:
具体:
先确保/clusterstate.json 是否存在
再更新clusterState变量

 synchronized (getUpdateLock()) {      cmdExecutor.ensureExists(CLUSTER_STATE, zkClient);            log.info("Updating cluster state from ZooKeeper... ");            zkClient.exists(CLUSTER_STATE, new Watcher() {                @Override        public void process(WatchedEvent event) {          // session events are not change events,          // and do not remove the watcher          if (EventType.None.equals(event.getType())) {            return;          }          log.info("A cluster state change has occurred - updating...");          try {                        // delayed approach            // ZkStateReader.this.updateClusterState(false, false);            synchronized (ZkStateReader.this.getUpdateLock()) {              // remake watch              final Watcher thisWatch = this;              Stat stat = new Stat();              byte[] data = zkClient.getData(CLUSTER_STATE, thisWatch, stat ,                  true);              // 将zk上的信息实例化成ClusterState对象              ClusterState clusterState = ClusterState.load(stat.getVersion(), data,                  ZkStateReader.this.clusterState.getLiveNodes());              // update volatile 更新volatile变量              ZkStateReader.this.clusterState = clusterState;            }          } catch (KeeperException e) {            if (e.code() == KeeperException.Code.SESSIONEXPIRED                || e.code() == KeeperException.Code.CONNECTIONLOSS) {              log.warn("ZooKeeper watch triggered, but Solr cannot talk to ZK");              return;            }            log.error("", e);            throw new ZooKeeperException(SolrException.ErrorCode.SERVER_ERROR,                "", e);          } catch (InterruptedException e) {            // Restore the interrupted status            Thread.currentThread().interrupt();            log.warn("", e);            return;          }        }              }, true);    }   再获得一次livenodes 重新加载ClusterState     synchronized (ZkStateReader.this.getUpdateLock()) {      List<String> liveNodes = zkClient.getChildren(LIVE_NODES_ZKNODE,          new Watcher() {                        @Override            public void process(WatchedEvent event) {              // session events are not change events,              // and do not remove the watcher              if (EventType.None.equals(event.getType())) {                return;              }              log.info("Updating live nodes");              try {                // delayed approach                // ZkStateReader.this.updateClusterState(false, true);                synchronized (ZkStateReader.this.getUpdateLock()) {                  List<String> liveNodes = zkClient.getChildren(                      LIVE_NODES_ZKNODE, this, true);                  Set<String> liveNodesSet = new HashSet<String>();                  liveNodesSet.addAll(liveNodes);                  ClusterState clusterState = new ClusterState(                      ZkStateReader.this.clusterState.getZkClusterStateVersion(),                      liveNodesSet, ZkStateReader.this.clusterState                          .getCollectionStates());                  ZkStateReader.this.clusterState = clusterState;                }              } catch (KeeperException e) {                if (e.code() == KeeperException.Code.SESSIONEXPIRED                    || e.code() == KeeperException.Code.CONNECTIONLOSS) {                  log.warn("ZooKeeper watch triggered, but Solr cannot talk to ZK");                  return;                }                log.error("", e);                throw new ZooKeeperException(                    SolrException.ErrorCode.SERVER_ERROR, "", e);              } catch (InterruptedException e) {                // Restore the interrupted status                Thread.currentThread().interrupt();                log.warn("", e);                return;              }            }                      }, true);          Set<String> liveNodeSet = new HashSet<String>();      liveNodeSet.addAll(liveNodes);      ClusterState clusterState = ClusterState.load(zkClient, liveNodeSet);      this.clusterState = clusterState;    }  if (!sendToLeaders || (sendToLeaders && coreNodeProps.isLeader())) {              String url = coreNodeProps.getCoreUrl();              urlList.add(url);            } else if (sendToLeaders) {              String url = coreNodeProps.getCoreUrl();              replicas.add(url);            }将leader 和replication都追加到thUelList里 theUrlList.addAll(urlList); theUrlList.addAll(theReplicas);   LBHttpSolrServer.Req req = new LBHttpSolrServer.Req(request, theUrlList);    LBHttpSolrServer.Rsp rsp = lbServer.request(req);


下一步遍历theUrlList  


待续

	
				
		
原创粉丝点击