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
待续
- solr4.0 的零散介绍
- IKAnalyzer与solr4.0的整合方法
- IKAnalyzer与solr4.0的整合方法
- [代码] solrcloud/solr4.0的启动步骤
- IKAnalyzer与solr4.0的整合方法
- Solrj操作Solr4.0/Solr4.3中CloudSolrServer的一般过程
- 零散的记录
- 笔记,零散的东西
- 零散的总结
- 一些零散的笔记
- 零散的感想
- 零散的命令随笔
- java零散的基础
- 零散的记录
- LINUX的零散知识
- MyBatis零散的总结
- 一些零散的笔记
- 零散的东西
- AIX下expr命令的简介及使用
- 摘要: 用VS2005编译Filezilla Server 0.9.39的相关文件下载,及编译方法。
- HTML5_Communication API介绍
- HDU 4288 Coder
- 软件工程总结四:软件设计
- solr4.0 的零散介绍
- 多线程死锁
- myeclipse插件安装示例 -- myeclipse安装svn插件的多种方式
- 关于loadrunner监控windows和linux说明
- Mysql数据事务隔离级别测试
- fedora14下运行程序出现GLib- GIO:ERROR:gdbusconnection.c:2270:initable_init: assertion failed: (connection->
- 显示时钟的JavaScript源码
- 程序中调用一个可执行文件,防止小部分程序down掉导致整个程序down掉
- HDU 2815 离散对数