`
suichangkele
  • 浏览: 200339 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

solr分布式请求的判断——HttpShardHandler

    博客分类:
  • solr
阅读更多

在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能够实现横向扩展,以处理更大规模的数据和更高的并发请求。 **一、Solr分布式架构** 1. **SolrCloud模式**: Solr的分布式特性主要体现在SolrCloud模式中,这是一个基于Zookeeper协调的集群...

    solr 分布式部署

    Solr的分布式部署是大型搜索应用的关键,它能够提高系统的可扩展性和性能。在本文中,我们将深入探讨如何实现Solr的分布式部署,包括需求、步骤、配置以及执行分发脚本。 首先,理解分布式部署的需求是至关重要的。...

    56 solrCloud分布式搜索与索引过程

    - 当客户端向SolrCloud发送请求时,首先会被转发到ZooKeeper,ZooKeeper根据最新的集群状态信息将请求路由到合适的Solr节点。 - Solr节点内部,请求可能还需要进一步转发到特定的core或者shard副本。 - 在分布式...

    基于Solr的分布式全文检索系统的研究与实现.pdf

    Solr作为全文检索的关键技术支撑,其分布式特性则体现在利用多个节点共同处理搜索请求,以提高效率和可靠性。Zookeeper则是作为分布式系统中协调和同步的工具,保证系统中各个节点能够高效地协作。 分类号方面,TP...

    solr分布式部署

    ZooKeeper实例 + Solr(tomcat)集群部署

    ZooKeeper作为分布式协调服务,提供了高可用性以及一致性保证,而Solr则是一款高性能、可扩展的全文搜索引擎。将二者结合,可以构建出一个稳定、高效的企业级搜索解决方案。本文旨在详细介绍如何在两台CentOS 6.3 x...

    Solr 学习笔记(五)-Solr扩展之分布式索引实例

    在分布式环境中的查询执行,Solr会自动处理跨节点的通信,将请求分解为子请求发送到各个节点,然后合并结果。这种并行处理大大提高了查询效率。 总结来说,Solr的分布式索引功能使得我们能够高效地处理大量数据,...

    apache solr1.3.0所有最新开发包及源码及文档

    ——分布式搜索性能 ——许多Lucene和其他性能的改进 ——支持在单个部署中的多级索引 ——SolrJ客户端和一个二元响应协议,支持更快的客户端-服务器通信 ——搜索组件可以被组成链式结构,用来提供更灵活的查询...

    高性能分布式搜索引擎Solr的研究与实现.pdf

    本文的研究主题是基于Solr的高性能分布式搜索引擎的设计与实现,探讨了如何通过分布式系统架构提高搜索引擎的性能。文章首先指出了传统搜索引擎技术面对信息资源快速增长时,无法提供高效和可靠服务的问题。接着,...

    基于Solr的分布式铁路科技资源整合与检索实践.pdf

    本文介绍了基于Solr开源搜索平台实现分布式铁路科技资源整合与检索的实践案例。Solr是一个高性能的搜索服务器,它基于Apache Lucene构建,提供了分布式索引、搜索、排名等功能,广泛应用于企业级搜索解决方案中。...

    人工智能-项目实践-信息检索-Java 分布式项(SSM、分布式Dubbo、全文检索Solr、Vue、Zookeeper、文件系

    Java 分布式项(SSM、分布式Dubbo、全文检索Solr、Vue、Zookeeper、文件系统FastDFS、缓存Redis、单点登录CAS,权限控制Spring Security,跨域CORS) 技术选型 后端框架采用 Spring + SpringMVC + MyBatis + DubboX...

    Solr集群搭建,Solr提供的分布式搜索方案

    ### Solr集群搭建与SolrCloud分布式搜索方案详解 #### 一、SolrCloud概述 SolrCloud 是 Apache Solr 提供的一种分布式搜索解决方案。它主要用于处理大规模数据集的索引和检索工作,并具备容错性和分布式特性。当...

    大型SpringMVC,Mybatis,Redis,Solr,Nginx,SSM分布式电商项目视频教程

    大型SpringMVC,Mybatis,Redis,Solr,Nginx,SSM分布式电商项目视频教程由浅到深的详细讲解了电商项目的搭建,有这方面需求的可以下载

    基于SSM框架+solr搜索框架实现的校园二手交易平台源码+数据库

    权限控制:shiro 搜索引擎:solr 分布式搜索引擎。 数据库:MySQL 开发环境与工具:IDEA+MAVEN 业务管理员:admin/123456 系统管理员:root/123456 校园二手交易平台,系统分为后台管理系统,前台门户子系统。 后台...

    一键安装伪分布式zk集群-solr集群脚本

    标题中的“一键安装伪分布式zk集群-solr集群脚本”指的是使用自动化脚本来部署Zookeeper集群和Solr集群,这种部署方式简化了传统手动安装的复杂过程,适合初学者和快速测试环境。Zookeeper是一个分布式协调服务,而...

    solr-6.2.0源码

    在Solr 6.2.0版本中,这个强大的分布式搜索引擎引入了许多新特性和改进,使其在处理大规模数据搜索时更加高效。 一、Solr的架构与工作原理 Solr的核心架构包括客户端API、Solr服务器和索引库。客户端通过HTTP或...

    solr服务器_solr_

    6. **分布式搜索**:Solr支持分布式搜索,这意味着可以在多台服务器上部署Solr,并将索引分布在这些服务器上,以处理大量数据和高并发请求。SolrCloud是Solr的分布式实现,它利用ZooKeeper进行集群协调和配置管理。 ...

    Apache Solr(solr-8.11.1.zip)

    5. **请求处理器**:Solr提供多种请求处理器,如标准请求处理器(StandardRequestHandler)用于处理默认的搜索请求,更新请求处理器(UpdateRequestHandler)处理索引更新,以及XML和JSON格式的数据导入处理器。...

Global site tag (gtag.js) - Google Analytics