Solr原理剖析

一、简介

Solr是一个高性能、基于Lucene的全文检索服务器。Solr对Lucene进行了扩展,提供了比Lucene更为丰富的查询语言,并实现了强大的全文检索功能、高亮显示、动态集群,具有高度的可扩展性。同时从Solr 4.0版本开始,支持SolrCloud模式,该模式下能够进行集中式的配置信息、近实时搜索、自动容错等功能:

  • 利用ZooKeeper作为协同服务,启动时可以指定把Solr的相关配置文件上传ZooKeeper,多机器共用。这些ZooKeeper中的配置不会再拿到本地缓存,Solr直接读取ZooKeeper中的配置信息。配置文件的变动,所有机器都可以感知到。
  • 自动容错,SolrCloud对索引(collection)进行分片(shard),并对每个分片创建多个Replica。一个Replica出现异常并不会影响整个索引搜索服务,每个Replica都可以独立对外提供服务。
  • 索引和查询时的自动负载均衡,SolrCloud索引(collection)的多个Replica可以分布在多台机器上,均衡索引和查询压力。如果索引和查询压力大,可以通过扩展机器,增加Replica来减缓压力。因此,下面的介绍主要是围绕SolrCloud展开描述的。
  • Solr索引数据存储方法有多种,利用HDFS作为其索引文件的存储系统,提供高可靠性、高性能、可伸缩、准实时的全文检索系统;存放到本地磁盘,提供了更加快速的索引和查询速度。

Solr集群方案SolrCloud由多个SolrServer进程组成,如下图所示,模块说明如下表所示。
在这里插入图片描述

名称说明
ClientClient使用HTTP或HTTPS协议同Solr集群(SolrCloud)中的SolrServer进行通信,进行分布式索引和分布式搜索操作。
SolrServerSolrServer负责提供创建索引和全文检索等服务,是Solr集群中的数据计算和处理单元。
ZooKeeper集群ZooKeeper为Solr集群中各进程提供分布式协作服务。各SolrServer将自己的信息(collection配置信息、SolrServer健康信息等)注册到ZooKeeper中,Client据此感知各个SolrServer的健康状态来决定索引和搜索请求的分发。

二、Solr基本概念

  • Collection:在SolrCloud集群中逻辑意义上的完整的索引。它可以被划分为一个或者多个Shard,它们使用相同的Config
    Set。
  • Config Set:Solr Core提供服务必须的一组配置文件。包括solrconfig.xml和managed-schema等。
  • Core:即Solr Core,一个Solr实例中包含一个或者多个Solr Core,每个Solr
    Core可以独立提供索引和查询功能,每个Solr Core对应一个索引或者Collection的Shard的副本(replica)。
  • Shard:Collection的逻辑分片。每个Shard都包含一个或者多个replicas,通过选举确定哪个是Leader。
  • Replica:Shard的拷贝。一个Replica存在于Solr的一个Core中。
  • Leader:赢得选举的Shard
    replicas。当索引documents时,SolrCloud会传递它们到此Shard对应的leader,leader再分发它们到Shard的全部replicas。
  • ZooKeeper:它在SolrCloud是必须的,提供分布式锁、处理Leader选举等功能。

三、Solr原理

倒排序索引

传统的搜索方式(正排序索引,如下图所示)是从关键点出发,然后再通过关键点找到关键点代表的信息中能够满足搜索条件的特定信息,即通过KEY寻找VALUE。通过正排序索引进行搜索,就是从通过文档编号找关键词。
在这里插入图片描述
而Solr(Lucene)的搜索则是采用了倒排序索引(如下图所示)的方式,即通过VALUE找KEY。而在中文全文搜索中VALUE就是要搜索的关键词,存放所有关键词的地方叫词典。KEY是文档标号列表(通过文档标号列表可以找到出现过要搜索关键词–VALUE的文档),具体如下面的图所示:通过倒排序索引进行搜索,就是通过关键词查询相对应的文档编号,再通过文档编号找文档,类似于查字典,或通过查书目录查指定页码书的内容。
倒排序索引

分布式索引操作流程

Solr分布式索引操作流程如下图所示。
在这里插入图片描述
操作流程说明如下:

  1. 当Client发起一次文档索引请求时,首先将从ZooKeeper集群中获取SolrCloud中SolrServer的集群信息,根据请求中的collection信息,获取任意一台包含该collection信息的SolrServer;
  2. Client把文档索引请求发送给SolrServer中该collection对应shard中的一个Replica进行处理;
  3. 如果该Replica不是Leader Replica,则该Replica会把文档索引请求再转发给和自己相同shard中相对应的Leader Replica;
  4. 该Leader Replica在本地完成文档的索引后,会再把文档索引请求路由给本Shard中的其他Replica进行处理;
  5. 如果该文档索引的目标shard并不是本次请求的Shard,那么该Shard的Leader Replica会将文档索引请求再次转发给目标Shard的Leader Replica;
  6. 目标Shard的Leader Replica在本地完成文档的索引后,会再把文档索引请求再次路由给本Shard的其他Replica进行处理。

分布式搜索操作流程:

Solr分布式搜索操作流程如下图所示。
在这里插入图片描述
操作流程说明如下:

  1. 当Client发起一次搜索请求时;Client首先将通过ZooKeeper会获取到SolrServer服务器集群信息,并随机选取一个含有该collection的SolrServer;
  2. Client把搜索请求发送到该Collection在SolrServer上相对应Shard中的任意一个Replica(可以不为Leader
    Replica)进行处理;
  3. 该Replica再根据查询索引的方式,启动分布式查询,基于Collection的Shard个数(在上图中为2个,Shard1和Shard2),把查询转换为多个子查询,并把每个子查询分发到对应Shard的任意一个Replica(可以不为Leader
    Replica)中进行处理;
  4. 每个子查询完成查询操作后,并查询结果返回;
  5. 首次收到查询请求的Replica收到各个子查询的查询结果后,对各个查询结果进行合并处理,然后把最终的查询结果返回给Client。

四、Solr和HDFS的关系

Solr是Apache基金会下的项目,也是Apache Hadoop项目生态系统中重要的一员,Solr可利用HDFS作为其索引文件存储系统。Solr位于结构化存储层,HDFS为Solr提供了高可靠性的存储支持。Solr中的所有索引数据文件都可以存储在HDFS文件系统上。

五、Solr和HBase的关系

HBase提供海量数据存储功能,是一种构建在HDFS上的分布式、面向列的存储系统。Solr索引HBase数据是将HBase数据写到HDFS的同时,Solr建立相应的HBase索引数据。其中索引id与HBase数据的rowkey对应,保证每条索引数据与HBase数据的唯一,实现HBase数据的全文检索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

22. 数据库的隔离级别和锁机制

文章目录 数据库的隔离级别和锁机制一、数据库隔离级别1. 隔离级别说明2. 如何选择隔离级别3. 查询当前客户端隔离级别的命令.4. 修改隔离的命令 二、数据库中的锁1. 共享锁、排他锁2. 死锁3. 行级锁、表级锁 三、解决更新丢失问题1. 解决方案2. 乐观锁、悲观锁3. 乐观锁、悲观…

STM32 CAN通讯实验程序

目录 STM32 CAN通讯实验 CAN硬件原理图 CAN外设原理图 TJA1050T硬件描述 实验线路图 回环实验 CAN头文件配置 CAN_GPIO_Config初始化 CAN初始化结构体 CAN筛选器结构体 接收中断优先级配置 接收中断函数 main文件 实验现象 补充 STM32 CAN通讯实验 CAN硬件原理图…

【RabbitMQ】之高可用集群搭建

目录 一、RabbitMQ 集群原理 1、默认集群原理2、镜像集群原理3、负载均衡方案 二、RabbitMQ 高可用集群搭建 1、RabbitMQ 集群搭建2、配置镜像队列3、HAProxy 环境搭建4、Keepalived 环境搭建 一、RabbitMQ 集群简介 1、默认集群原理 3-1、RabbitMQ 集群简介 单台 RabbitM…

vue项目中对组件使用v-model绑定值,在vue3中如何更新数据

在el-form 中 el-form-item 绑定组件进行校验 想在表单下面爆红提示 可以对组件使用v-model绑定值 vue2 通过this.$emit(‘input’,value) 更新 v-model值 vue3 通过this.$emit(‘update:modelValue’ ,value) 更新 v-model值

腾讯云CVM内存型服务器MA3、M6、M6ce和M5处理器CPU说明

腾讯云内存型CVM服务器CPU处理器大全,CVM内存型MA3、内存型M6、安全增强内存型M6ce、内存型M6p、内存型M5、MA2、M4、M3、M2、M1处理器主频、CPU性能性能大全说明,腾讯云内存型云服务器具有大内存的特点,适合高性能数据库、分布式内存缓存等需…

Settings系列(三)根据需求动态添加删除一级菜单、二级菜单的设置项

一 、背景 当时遇到定制需求,需要根据实际需要隐藏Settings的菜单项,于是开始了寻找方法 二 、准备工作 在看了一下源码,经过尝试后,确认生效后,就简单说明一下Settings中布局中主要组成元素 Settings中的菜单项是由 PreferenceScreen 和Preference组成的。其中Prefer…

Day7 C++ 指针

目录 什么是指针 指针变量的定义 指针变量定义语法 注意 指针所占内存空间 空指针 野指针 函数指针 声明函数指针 初始化函数指针 使用函数指针调用函数 指针的使用 const修饰指针 const修饰指针 --- 指针常量(constant pointer) const修…

libuv库学习笔记-advanced-event-loops

Advanced event loops libuv提供了非常多的控制event-loop的方法,你能通过使用多loop来实现很多有趣的功能。你还可以将libuv的event loop嵌入到其它基于event-loop的库中。比如,想象着一个基于Qt的UI,然后Qt的event-loop是由libuv驱动的&am…

会议OA项目之会议发布(一)

目录 前言: 会议发布的产品原型图: 1.会议发布 1.1实现的特色功能: 1.2思路: 使用的数据库: 我们要实现多功能下拉框的形式选择可以参考原文档:https://hnzzmsf.github.io/example/example_v4.html#down…

Michael.W基于Foundry精读Openzeppelin第14期——SafeMath.sol

Michael.W基于Foundry精读Openzeppelin第14期——SafeMath.sol 0. 版本0.1 SafeMath.sol 1. 目标合约2. 代码精读2.1 tryAdd(uint256 a, uint256 b) && trySub(uint256 a, uint256 b) && tryMul(uint256 a, uint256 b) && tryDiv(uint256 a, uint256 b…

php的设计模式有哪些

1,创建设计模式(Creational Patterns)(5种): 用于创建对象时的设计模式。更具体一点,初始化对象流程的设计模式。当程序日益复杂时,需要更加灵活地创建对象,同时减少创建时的依赖。而创建设计模…

LlaMA2微调实战

LLaMA2-SFT LLaMA2-SFT, Llama-2-7B微调(transformers)/LORA(peft)/推理 Gtihub地址 https://github.com/yongzhuo/Llama2-SFT prompt text_1 f"".join(["[INST] <<SYS>>\n ""You are a helpful, respectful and honest assista…

数组专题攻破新学习笔记

数组专题攻破新学习笔记 1.移除有序数组中的重复项和移除元素2.二分查找需注意3.在排序数组中查找元素的第一个和最后一个位置4.最长回文串5.区域和检索-数组不可变 1.移除有序数组中的重复项和移除元素 思想一样但是细节不一样 思想一样就是 设置快慢指针&#xff0c;快指针…

ubuntu远程控制小车 运行rviz时报错

我买的是wheeltec的小车&#xff0c;测试rgbd相机时想在ubuntu上的rviz中显示小车的姿态和看到的rgb和depth图&#xff0c;但是ubuntu中rostopic list和rviz都找不到小车发布的话题信息&#xff0c;运行rqt_image_view时可以显示图片信息。 最终wheeltec的技术人员lucas帮我找了…

nodejs+vue+elementui汽车销售网站

前端技术&#xff1a;nodejsvueelementui,视图层其实质就是vue页面&#xff0c;通过编写vue页面从而展示在浏览器中&#xff0c;编写完成的vue页面要能够和控制器类进行交互&#xff0c;从而使得用户在点击网页进行操作时能够正常。 可以设置中间件来响应 HTTP 请求。 Express …

游戏小记-全屏与无边框

“LoL” 是指英雄联盟&#xff08;League of Legends&#xff09;&#xff0c;一款非常流行的多人在线战术游戏。在游戏设置中&#xff0c;“全屏” 和 “无边框” 是两种不同的窗口模式&#xff0c;它们有以下区别&#xff1a; 全屏模式&#xff1a; 在全屏模式下&#xff0c;…

Kafka 入门到起飞 - Kafka怎么做到保障消息不会重复消费的? 消费者组是什么?

Kafka怎么做到避免消息重复消费的&#xff1f; 消费者组是什么&#xff1f; 消费者&#xff1a; 1、订阅Topic&#xff08;主题&#xff09; 2、从订阅的Topic消费&#xff08;pull&#xff09;消息&#xff0c; 3、将消费消息的offset&#xff08;偏移量&#xff09;保存在K…

西安电子科技大学

前言 本篇文章投稿与以下活动 【西安城市开发者社区】探索西安高校&#xff1a;展现历史与创新的魅力 资料参考与百度百科 学校简介 西安电子科技大学&#xff08;Xidian University&#xff09;&#xff0c;简称“西电”&#xff0c;位于陕西省西安市&#xff0c;是中央部…

浅析C++临时变量

在C/C中&#xff0c;临时变量&#xff08;也称为临时对象&#xff09;具有常量性质&#xff0c;是由编译器自动创建的&#xff0c;并在表达式求值期间临时存在。它们主要用于存储中间结果&#xff0c;使表达式的求值过程更加高效和简洁。临时变量的生命周期仅限于表达式的求值过…

14.Netty源码之模拟简单的HTTP服务器

highlight: arduino-light 简单的 HTTP 服务器 HTTP 服务器是我们平时最常用的工具之一。同传统 Web 容器 Tomcat、Jetty 一样&#xff0c;Netty 也可以方便地开发一个 HTTP 服务器。我从一个简单的 HTTP 服务器开始&#xff0c;通过程序示例为你展现 Netty 程序如何配置启动&a…