在solrCloud中,我们发起的一次查询请求绝大部分是朝多个shard发起的请求,但是可能存在这么一个情况,我已经知道这次要查询的sahrd是哪一个了,那么如何只向一个shard发起请求呢?这个博客就是看看solrCloud对分布式请求的判断,代码在HttpShardHandler中,看看checkDistributed方法:
/** * 判断这次请求是不是分布式的请求,根据是不是有zk, * 如果是的话,则找到由Router决定的要路由到的多个shard, * 并添加多个shard的多个replica的url,用|分隔,放在rb的shard和slices中 */ @Override public void checkDistributed(ResponseBuilder rb) { SolrQueryRequest req = rb.req; SolrParams params = req.getParams(); rb.isDistrib = params.getBool("distrib", req.getCore().getCoreDescriptor().getCoreContainer().isZooKeeperAware());// 先检查distrib这个参数,如果指定了则使用,否则默认值是是否启动了zk. String shards = params.get(ShardParams.SHARDS);// 参数中指定的shards参数。 // for back compat, a shards param with URLs like localhost:8983/solr will mean that this // search is distributed. boolean hasShardURL = shards != null && shards.indexOf('/') > 0; rb.isDistrib = hasShardURL | rb.isDistrib;//由distrib、是否使用zk、是否制定了shards三个参数决定一个请求是否是分布式的,即是否要向多个shard转发请求。 if (rb.isDistrib) {// 如果是分布式的。 // since the cost of grabbing cloud state is still up in the air, we grab it only if we need it. ClusterState clusterState = null; Map<String,Slice> slices = null; CoreDescriptor coreDescriptor = req.getCore().getCoreDescriptor(); CloudDescriptor cloudDescriptor = coreDescriptor.getCloudDescriptor(); ZkController zkController = coreDescriptor.getCoreContainer().getZkController(); if (shards != null) {// 如果在请求的参数中指定了shards,则使用给定的shards List<String> lst = StrUtils.splitSmart(shards, ",", true);// 可以指定多个要查询的shard,用英文的逗号分隔。 rb.shards = lst.toArray(new String[lst.size()]); rb.slices = new String[rb.shards.length]; if (zkController != null) { // figure out which shards are slices for (int i = 0; i < rb.shards.length; i++) { if (rb.shards[i].indexOf('/') < 0) { // this is a logical shard rb.slices[i] = rb.shards[i]; rb.shards[i] = null; } } } } else if (zkController != null) {// 如果没有指定shards并且使用了zk // we weren't provided with an explicit list of slices to query via "shards", so use the cluster state clusterState = zkController.getClusterState(); String shardKeys = params.get(ShardParams._ROUTE_);// shardKeys就是参数中的_route_,这个指定要路由到的shard,对于任何的Router都可以使用这个值(像Implicit这个Router可以使用域的名字来指定要查找的shard)。 // This will be the complete list of slices we need to query for this request. slices = new HashMap<>(); // we need to find out what collections this request is for. // A comma-separated list of specified collections. // Eg: "collection1,collection2,collection3" String collections = params.get("collection");// 得到collection,可能有多个collection,有,分隔。 if (collections != null) { // If there were one or more collections specified in the query, split // each parameter and store as a separate member of a List. List<String> collectionList = StrUtils.splitSmart(collections, ",", true); // In turn, retrieve the slices that cover each collection from the // cloud state and add them to the Map 'slices'. for (String collectionName : collectionList) {// 假设只有一个collection. // The original code produced <collection-name>_<shard-name> when the collections // parameter was specified (see ClientUtils.appendMap) // Is this necessary if ony one collection is specified? // i.e. should we change multiCollection to collectionList.size() > 1? addSlices(slices, clusterState, params, collectionName, shardKeys, true);// 根据这个collection的路由策略和参数找到所有要请求的shard。这个方法的实现要涉及到docRouter,关于这个博客参见http://suichangkele.iteye.com/blog/2363305这个博客。 } } else { // just this collection String collectionName = cloudDescriptor.getCollectionName(); addSlices(slices, clusterState, params, collectionName, shardKeys, false); } // Store the logical slices in the ResponseBuilder and create a new // String array to hold the physical shards (which will be mapped // later). rb.slices = slices.keySet().toArray(new String[slices.size()]); rb.shards = new String[rb.slices.length]; }
读完了这个代码,便明白了solrCloud对分布式请求的路由的规则,如果我们指定了shards就会使用查找的shard,如果没有指定,则使用collection中的DocRouter根据参数中的_router_来决定要路由到的shard。对于DocRouter的操作在http://suichangkele.iteye.com/blog/2363305这个博客中写了。
相关推荐
在分布式环境下,Solr能够实现横向扩展,以处理更大规模的数据和更高的并发请求。 **一、Solr分布式架构** 1. **SolrCloud模式**: Solr的分布式特性主要体现在SolrCloud模式中,这是一个基于Zookeeper协调的集群...
Solr的分布式部署是大型搜索应用的关键,它能够提高系统的可扩展性和性能。在本文中,我们将深入探讨如何实现Solr的分布式部署,包括需求、步骤、配置以及执行分发脚本。 首先,理解分布式部署的需求是至关重要的。...
- 当客户端向SolrCloud发送请求时,首先会被转发到ZooKeeper,ZooKeeper根据最新的集群状态信息将请求路由到合适的Solr节点。 - Solr节点内部,请求可能还需要进一步转发到特定的core或者shard副本。 - 在分布式...
Solr作为全文检索的关键技术支撑,其分布式特性则体现在利用多个节点共同处理搜索请求,以提高效率和可靠性。Zookeeper则是作为分布式系统中协调和同步的工具,保证系统中各个节点能够高效地协作。 分类号方面,TP...
ZooKeeper作为分布式协调服务,提供了高可用性以及一致性保证,而Solr则是一款高性能、可扩展的全文搜索引擎。将二者结合,可以构建出一个稳定、高效的企业级搜索解决方案。本文旨在详细介绍如何在两台CentOS 6.3 x...
在分布式环境中的查询执行,Solr会自动处理跨节点的通信,将请求分解为子请求发送到各个节点,然后合并结果。这种并行处理大大提高了查询效率。 总结来说,Solr的分布式索引功能使得我们能够高效地处理大量数据,...
——分布式搜索性能 ——许多Lucene和其他性能的改进 ——支持在单个部署中的多级索引 ——SolrJ客户端和一个二元响应协议,支持更快的客户端-服务器通信 ——搜索组件可以被组成链式结构,用来提供更灵活的查询...
本文的研究主题是基于Solr的高性能分布式搜索引擎的设计与实现,探讨了如何通过分布式系统架构提高搜索引擎的性能。文章首先指出了传统搜索引擎技术面对信息资源快速增长时,无法提供高效和可靠服务的问题。接着,...
本文介绍了基于Solr开源搜索平台实现分布式铁路科技资源整合与检索的实践案例。Solr是一个高性能的搜索服务器,它基于Apache Lucene构建,提供了分布式索引、搜索、排名等功能,广泛应用于企业级搜索解决方案中。...
Java 分布式项(SSM、分布式Dubbo、全文检索Solr、Vue、Zookeeper、文件系统FastDFS、缓存Redis、单点登录CAS,权限控制Spring Security,跨域CORS) 技术选型 后端框架采用 Spring + SpringMVC + MyBatis + DubboX...
### Solr集群搭建与SolrCloud分布式搜索方案详解 #### 一、SolrCloud概述 SolrCloud 是 Apache Solr 提供的一种分布式搜索解决方案。它主要用于处理大规模数据集的索引和检索工作,并具备容错性和分布式特性。当...
大型SpringMVC,Mybatis,Redis,Solr,Nginx,SSM分布式电商项目视频教程由浅到深的详细讲解了电商项目的搭建,有这方面需求的可以下载
权限控制:shiro 搜索引擎:solr 分布式搜索引擎。 数据库:MySQL 开发环境与工具:IDEA+MAVEN 业务管理员:admin/123456 系统管理员:root/123456 校园二手交易平台,系统分为后台管理系统,前台门户子系统。 后台...
标题中的“一键安装伪分布式zk集群-solr集群脚本”指的是使用自动化脚本来部署Zookeeper集群和Solr集群,这种部署方式简化了传统手动安装的复杂过程,适合初学者和快速测试环境。Zookeeper是一个分布式协调服务,而...
在Solr 6.2.0版本中,这个强大的分布式搜索引擎引入了许多新特性和改进,使其在处理大规模数据搜索时更加高效。 一、Solr的架构与工作原理 Solr的核心架构包括客户端API、Solr服务器和索引库。客户端通过HTTP或...
6. **分布式搜索**:Solr支持分布式搜索,这意味着可以在多台服务器上部署Solr,并将索引分布在这些服务器上,以处理大量数据和高并发请求。SolrCloud是Solr的分布式实现,它利用ZooKeeper进行集群协调和配置管理。 ...
5. **请求处理器**:Solr提供多种请求处理器,如标准请求处理器(StandardRequestHandler)用于处理默认的搜索请求,更新请求处理器(UpdateRequestHandler)处理索引更新,以及XML和JSON格式的数据导入处理器。...