侵权投诉

简述ElasticSearch的实现

马哥Linux运维 2021-10-20 14:45 次阅读

1.近实时搜索

1.1 实时与近实时

实时搜索(Real-time Search)很好理解,对于一个数据库系统,执行插入以后立刻就能搜索到刚刚插入到数据。而近实时(Near Real-time),所谓“近”也就是说比实时要慢一点点。

1.2 近实时的挑战

对于一个单机系统来说,这也并不容易实现,因为还要保证数据的持久化,还要利用缓存等技术加快数据的访问(注:这里不讨论内存计算系统)。对于ElasticSearch这样一个分布式系统,保证持久化的同时,还要初始化好用于全文检索的内部数据结构,做到近实时的难度可想而知。而这就是ElasticSearch大获成功的地方,也正是本文所要学习的主题:ElasticSearch是如何解决这些实现近实时搜索的难题的。

2.ElasticSearch的实现

2.1 不可变的数据结构

有经验的程序员一定知道,在做并发编程时,控制可变数据的并发访问是个难题。古往今来,各种粗细粒度的锁,信号量,Actor模型等概念层出不穷。而另一流派函数式编程更为彻底,尤其是纯函数式比如Haskell,用不可变数据来彻底解决这个问题。

在ElasticSearch这样主要服务全文检索的系统中,Inverted Index是核心数据结构。这里简单说一句,Inverted Index本质上一组document中term的各种统计信息,比如最重要的词频,以及其他许多统计信息,比如文档长度,词序等等。要做到近实时搜索,就要保证新数据能快速构建,已有数据能被高速访问。解决问题的关键就在于Inverted Index的不可变性,这也是ElasticSearch底层依赖的高性能Lucene的根本奥秘。

2.2 从不可变到可变

所以当用户向ElasticSearch中的数据库插入一组document后,底层Lucene构建出一个不可变的Inverted Index。可我们知道,一个数据库不可能是静态的,当用户再次插入新数据时,Lucene该怎样处理呢?答案就是增量保存和逻辑标记

所谓增量保存就是为新数据构建一个新的不可变的Inverted Index,当执行搜索时,要合并每个Inverted Index中的统计信息得到最终结果。保存新数据的问题解决了,而逻辑标记就是解决更新和删除的。Lucene为每个Inverted Index都额外维护一个del数据结构,当执行删除时,只需在del中标记,这样最终结果就会排出掉删除掉document。同理,更新时也是给老数据做标记,新document会保存在新的Inverted Index中,最终结果会使用最新版本数据的统计信息。在Lucene中,每个Inverted Index叫做Segment,而管理这些Segment的叫做Index。

ElasticSearch中一个数据库被称为Index,每个Index可以在创建时指定要划分为几份,每一份叫做Shard。Shard会被ElasticSearch分配到不同结点,运行中还会根据压力做Rebalance。这个Shard其实就是Lucene中的Index。由于不同层级上名字的重复,初学时很容易混淆。

这种思想其实并非独创,在其他一些高级数据结构中也能找到它的影子。如果没记错的话,一个经典的例子就是LSM树:https://en.m.wikipedia.org/wiki/Log-structured_merge-tree。

2.3 分布式数据存储

对于分布式的数据存储,ElasticSearch采取了经典的做法,对数据进行分片和路由,这里每个分片Shard就是一个Lucene数据库Index。对于有副本replica的Shard,ElasticSearch操作完primary后,再去同步到replica。

现在我们已经可以高效地维护全文检索的数据结构,也遵循经典做法解决了分布式数据存储。可就像前面提到的,还有个挑战就是磁盘读写的巨大开销。Lucene的做法是,每个Segment在文件系统Cache中构建起来就可以被访问,同步到磁盘的fsync之后才会执行。Lucene的Index内部的Commit Point会记住哪些Segment还未同步。ElasticSearch默认每隔1秒会用Buffer中的document新建一个Segment,这个操作叫做refresh。正因为这1秒钟的间隔,ElasticSearch支持的是近实时而非实时。

一个很自然的问题就是每秒钟都会新建一个Segment,那Lucene Index中的Segment个数岂不是很容易就爆炸了。每个Segment都是一个物理文件,操作系统中打开文件的句柄个数是有限的,而且即便不考虑上限,过多Segment也会拖慢搜索,因为前面讲过一次搜索的最终结果是要合并所有Segment中的统计信息的。

ElasticSearch的做法是维护一个后台线程去做Merge,Merge的过程中不仅将多个小Segment合并成大的,同时还会排除掉删除或修改的文件的老版本,最终修改Commit Point排除掉老的Segment,这样那些“垃圾”document就彻底被删除了。得益于Segment的不可变性,后台进程Merge时并不会影响数据插入和搜索的性能。

2.5 保证数据不丢失

一个可以预料到的问题就是,如果当前结点上的ElasticSearch进程意外中止,那Buffer中等待处理的document和未同步到磁盘的Segment中的数据都会丢失。为了避免这一点,ElasticSearch引入了传统数据库中所谓的Write-Ahead Log(WAL)日志,ElasticSearch为其起名为translog。每次插入Buffer时,都会同时写入translog。下面的图示清晰地展示ElasticSearch是如何与Lucene配合的。

当创建新Segment时,Buffer清空,但translog会一直保留到Segment同步到磁盘才会清空。所以当ElasticSearch重启时,先根据Commit Point将所有之前已经commit到磁盘的Segment恢复到Cache,然后再重放(replay)translog中的所有操作。默认每30分钟或者translog很大时,ElasticSearch做一次full commit,即flush操作。

继续刨根问底,translog保证了Buffer和Segment的安全,谁来保证它的安全呢?默认情况下,translog每5秒钟会同步到磁盘,也就是说我们至多会丢失5秒到数据。因为translog只是原始的请求document,所以这里的写磁盘开销是远小于Segment的一次commit的。

3.题外话:如何深入学习ElasticSearch

以本文为例,谈一谈如何学习ElasticSearch。在有了一些分布式系统和开发经验后,像本文2.3和2.5节是完全可以跳过的。前者是分布式系统的通用做法,而后者则早已存在于传统数据库中。要掌握ElasticSearch,基本用法和系统命令是一方面,而设计中的精华往往在前文2.1和2.2中。光理解了设计还不行,就像前面说过的,思想可能流传已久,但做出来东西的质量则可能千差万别。“天下大事,必做于细”,实现中的精髓只能在源代码中体会。

其实这种方法在另一篇文章里也提到过,就是学一门编程语言时也是要抓住它的精髓,而不是每门语言都花很多时间去学基本语法,而没有精力去掌握精华,最终迷失了。在此再次强调一下,自己也引以为戒。

编辑:jq

原文标题:ElasticSearch近实时搜索的实现

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

三星手机云相册同步功能将关停

近日,三星公司发布已经公告称将关闭三星云相册同步功能,12月1日终止服务。为用户提供大容量可扩展的相....
的头像 lhl545545 发表于 12-01 11:29 176次 阅读

如何对重定向到printf()后的串口进行调试呢

什么是预定义宏?预定义宏有哪些呢? 如何对重定向到printf()后的串口进行调试呢? ...
发表于 12-01 08:11 0次 阅读

为什么在调试STM32时发现总是跳不到Main函数中呢

为什么在调试STM32时发现总是跳不到Main函数中呢?如何去解决呢?...
发表于 12-01 07:19 0次 阅读

怎样通过STM32F103C8T6的软件来配置随机数呢

怎样通过STM32F103C8T6的软件来配置随机数呢?在配置过程中使用的思路有哪些?...
发表于 12-01 07:07 0次 阅读

printf函数支持哪些格式的输出呢

printf函数支持哪些格式的输出呢? 怎样在主函数中去调用printf函数呢? ...
发表于 12-01 07:06 0次 阅读

请教大神怎样使用hal库去对printf()函数进行重定向呢

请教大神怎样使用hal库去对printf()函数进行重定向呢?...
发表于 12-01 07:03 0次 阅读

如何用__write函数替换掉原先的fputc函数呢

如何用__write函数替换掉原先的fputc函数呢?
发表于 12-01 06:55 0次 阅读

在Keil中如何对stm32系统进行编程呢

C语言程序里全局变量和局部变量分别是什么意思? 在Keil中如何对stm32系统进行编程呢? ...
发表于 12-01 06:39 0次 阅读

为什么中断处理函数程序执行到OLED显示语句时OLED就会花屛呢

为什么中断处理函数程序执行到OLED显示语句时OLED就会花屛呢?是什么原因导致的?...
发表于 12-01 06:22 0次 阅读

怎样将stm32的起始执行地址更改为0x08010000呢

怎样将stm32的起始执行地址更改为0x08010000呢?有哪些修改要点呢?...
发表于 12-01 06:10 0次 阅读

如何将串口重定向printf函数呢

如何将串口重定向printf函数呢?有哪些操作流程呢? ...
发表于 12-01 06:01 0次 阅读

红外遥控系统原理及单片机软件解码实例(汇编,来源论坛网址:http://www.zsMCU.com)

下面是一个对51实验板配套的红外线遥控器的解码程序,它可以把红外遥控器每一个按键的键值读出来,并且通....
发表于 11-30 19:51 2次 阅读
红外遥控系统原理及单片机软件解码实例(汇编,来源论坛网址:http://www.zsMCU.com)

Silicon USB MCU F340使用方法

引言    某型信息化弹药通过对目标的基准弹道与飞行中的攻击弹道进行比较后,给出有限次不连续的修正量....
发表于 11-30 19:51 2次 阅读
Silicon USB MCU F340使用方法

Arduino 常用函数参考文档

Arduino 常用函数参考文档一、程序结构二、数字输入输出三、模拟输入输出四、模拟输入输出一、程序....
发表于 11-30 12:06 9次 阅读
Arduino 常用函数参考文档

关于CC2541蓝牙开发板的学习笔记-2

本节呢,我想跟大家介绍一下BLE协议栈,这一节也就是入门级的知识点吧,适合小白们看一下呦。首先呢,我....
发表于 11-30 09:51 2次 阅读
关于CC2541蓝牙开发板的学习笔记-2

关于CC2541蓝牙开发板的学习笔记-3

下面进行一个简单地BLE协议栈基础实验:数据传输试验。其实就是BLE协议栈安装后的主从通信实验,实现....
发表于 11-30 09:51 4次 阅读
关于CC2541蓝牙开发板的学习笔记-3

关于CC2541蓝牙开发板的学习笔记-1

下一步,我们讨论一下什么叫做协议栈?BLE协议栈,实在TI的开发包里面,顾名思义,协议栈就是包含BL....
发表于 11-30 09:36 7次 阅读
关于CC2541蓝牙开发板的学习笔记-1

欧洲科技企业联盟向微软发起反竞争投诉 30多家欧洲公司投诉微软垄断

近日,根据外媒的消息称,目前已经有30多家欧洲公司正式向欧盟委员会投诉微软的反竞争行为,即微软通过推....
的头像 lhl545545 发表于 11-29 10:25 212次 阅读

信息安全有多重要 “退微信群”谣言背后 总有人用阴谋论湮没常识

近日,有个传闻称腾讯云数据库泄露,部分企业开始退微信群。在网传聊天图片中,有网友称“网信办拉了个腾讯....
的头像 脑极体 发表于 11-29 09:29 437次 阅读

什么是网络认证技术

认证是指用户采用某种方式来证明自己确实是自己宣称的某人,网络中的认证主要包括身份认证和消息认证。身份....
的头像 讯维官方公众号 发表于 11-26 16:21 392次 阅读

设计电动汽车和自动驾驶应用的四个考虑事项

电动汽车和自动驾驶功能的发展,迅速推动汽车行业追求技术变革,带来了汽车制造方式的范式转变。 Mole....
的头像 Molex莫仕连接器 发表于 11-26 16:02 778次 阅读

为何说SPC-1是存储界“奥林匹克”

(作者 :浪潮信息首席架构师 叶毓睿)全球存储性能委员会(SPC)是由世界级存储供应商联合组成的一个....
的头像 浪潮存储 发表于 11-26 14:56 272次 阅读
为何说SPC-1是存储界“奥林匹克”

护航数字经济 浪潮高端增速中国领先

大型银行保管着储户的钱袋、医疗数据关系病患的生死、电网数据影响千行百业的正常运转。在银行、运营商、医....
的头像 浪潮存储 发表于 11-26 14:48 238次 阅读

基于G6新存储打造数字之城

11月2日,IDTC2021浪潮存储数据科技峰会暨G6新品全国巡展在南京顺利举行。浪潮信息存储产品线....
的头像 浪潮存储 发表于 11-26 14:36 558次 阅读

简述Golang熔断器的实现及使用

Go 项目中使用熔断技术提高系统容错性。本文介绍了 go 熔断器和其使用。   熔断器像是一个保险丝....
的头像 马哥Linux运维 发表于 11-26 10:08 193次 阅读
简述Golang熔断器的实现及使用

创略科技获7100万元B轮融资,饿了么、沃尔玛均是客户

11月16日创络(上海)数据科技有限公司(简称“创略科技”)正式宣布已完成7100万元B轮融资,本轮....
发表于 11-24 15:02 20次 阅读
创略科技获7100万元B轮融资,饿了么、沃尔玛均是客户

单片机为什么一直用C语言,不用其他编程语言?只有学过的知道!

单片机为什么还在用C语言编程?答案是:C语言是最适合单片机编程的高级语言。这个问题的意思应该是:现在....
发表于 11-23 17:51 16次 阅读
单片机为什么一直用C语言,不用其他编程语言?只有学过的知道!

单片机工程模块化操作_适用单片机编程新手

对于一些接触单片机编程不久的小萌新来说,模块化编程这个概念刚接触的时候可能会很懵,到底什么是模块化编....
发表于 11-23 17:51 12次 阅读
单片机工程模块化操作_适用单片机编程新手

单片机通信数据校验

最近在调试Modbus通信时需要计算CRC校验,找了好久没有一个找到一个好用的数据校验计算软件,无意....
发表于 11-23 17:36 8次 阅读
单片机通信数据校验

小项目实战:51单片机控制的DS18B20温度测量报警系统(可设置范围) 硬件,接线图,源代码

最近南方天天下大雨,下的人心情都郁闷了,最近应一个粉丝的留言,说毕业设计课题是一个单片机的温度自动测....
发表于 11-23 16:22 12次 阅读
小项目实战:51单片机控制的DS18B20温度测量报警系统(可设置范围)    硬件,接线图,源代码

浪潮信息ISPIM平台基于AI算法,整个数据中心细粒度管理

随着数字化进程的加快,各企业、组织对大规模计算服务集群的需求与日俱增,运维难度也随之加大。浪潮作为全球领先的算
的头像 鹰眼 发表于 11-23 10:01 218次 阅读
浪潮信息ISPIM平台基于AI算法,整个数据中心细粒度管理

小米申请“小米移动”商标 正式注册成立第二家汽车公司

小米公司近日正式申请了一项关于小米移动的商标,目前的商标状态为申请中。根据小编的了解发现,小米申请的....
的头像 lhl545545 发表于 11-22 16:44 1026次 阅读

学号显示电路设计资料汇总

学号显示电路设计资料汇总
发表于 11-22 16:22 15次 阅读

微控制器(单片机)的中断系统及应用

文章目录1. 什么是中断1.1 中断的概念1.2 中断源1.2.1 中断源的种类2. 中断寄存器2.....
发表于 11-22 15:51 22次 阅读
微控制器(单片机)的中断系统及应用

曙光亮相中国CAE工程分析技术年会

11月11日-14日,第 17届中国CAE工程分析技术年会暨第3届中国数字仿真论坛大会在海口召开。大....
的头像 中科曙光 发表于 11-22 11:19 334次 阅读

功能更加强大的GUI神器

关于pandas的GUI工具,我之前介绍过pandasgui。可以说,有了GUI可视化界面,操作就和....
的头像 数据分析与开发 发表于 11-22 10:21 193次 阅读

代码防御性编程不得不知的技巧

1 什么是防御性编程?顾名思义,防御性编程是一种细致、谨慎的编程方法。为了开发可靠的软件,我们要设计....
的头像 嵌入式ARM 发表于 11-22 09:49 185次 阅读

中地数码完成鲲鹏技术全栈适配

NEWS 近日,武汉中地数码科技有限公司与长江鲲鹏生态创新中心联合推进的MapGIS大数据与云平台联....
的头像 华为计算 发表于 11-22 09:22 255次 阅读
中地数码完成鲲鹏技术全栈适配

跳表是用来干什么的

跳表这一数据结构,已经成为了Redis面试的高频考点。前两年没这么卷的时候,可能大家从开始学习,到拿....
的头像 算法与数据结构 发表于 11-21 11:20 346次 阅读

数码管显示拨码开关编码 PROTEUS 和51单片机教程(附仿真文件+源代码)

功能:数码管显示拨码开关编码 (当八个拨码开关拨到不同位置时候,三位数码管会显示不同的编码供参考代码....
发表于 11-20 20:51 16次 阅读
数码管显示拨码开关编码  PROTEUS 和51单片机教程(附仿真文件+源代码)

c语言回调函数的使用及实际作用详解

大家好,我是无际。今天给大家讲一下芯片/模块厂家写SDK必须会使用的一种技术:回调函数。回调函数这个....
发表于 11-20 19:51 13次 阅读
c语言回调函数的使用及实际作用详解

4利用移位函数操作点亮流水灯 PROTEUS 和51单片机教程(附仿真文件+源代码)

功能说明:利用移位函数操作点亮流水灯程序源代码如下:#include #include #defin....
发表于 11-20 17:06 19次 阅读
4利用移位函数操作点亮流水灯 PROTEUS 和51单片机教程(附仿真文件+源代码)

WH-LTE-7S1/WH-LTE-7S1-GN说明书

WH-LTE-7S1 是为实现串口设备与网络服务器,通过LTE Cat-1和GPRS网络相互传输数据....
发表于 11-19 14:48 19次 阅读

WH-G401tf产品说明书

WH-G401tf是有人物联网推出的单模LTE Cat.1联网通信模组。该模组软件功能完善,覆盖绝大....
发表于 11-19 14:40 17次 阅读

M2M系列 WH-GM5产品使用手册

WH-GM5是有人物联网推出的首款Cat.1联网通信模组。该模组软件功能完善,覆盖绝大多数常规应用场....
发表于 11-19 14:37 13次 阅读

虹科案例 | 企业数据保护和存档的理想方案

主动归档存档和数据保护01背景在当今数据密集型计算的大环境下,企业和中小型商业环境都面临着不断增长的....
的头像 Jane 发表于 11-19 14:32 18次 阅读
虹科案例 | 企业数据保护和存档的理想方案

大三学生用两周时间在OpenHarmony上复刻了一款经典游戏

开源项目 OpenHarmony是每个人的 OpenHarmony (以下内容来自嘉宾分享,不代表 ....
的头像 开放原子教育 发表于 11-19 14:28 156次 阅读
大三学生用两周时间在OpenHarmony上复刻了一款经典游戏

设计一个MQ需要考虑哪些问题

本文主要讲解 MQ 的通用知识,让大家先弄明白:如果让你来设计一个 MQ,该如何下手?需要考虑哪些问....
的头像 数据分析与开发 发表于 11-19 14:21 210次 阅读

IP知识百科之什么是YANG

YANG的定义与产生 YANG是一种数据建模语言,可以为NETCONF等协议的数据进行定义与描述。Y....
的头像 华为产品资料 发表于 11-19 10:25 1474次 阅读
IP知识百科之什么是YANG

如何制定完善的数据存储管理策略

  IDG公司与数十位存储和数据管理专家进行了交流和探讨,就企业需要采取哪些措施为其选择合适的数据存....
的头像 存储D1net 发表于 11-19 10:12 1525次 阅读

企业如何选择合适的备份服务

  企业需要备份来自各种业务应用程序的数据,因此需要了解一些业务数据备份的重要提示。   什么是业务....
的头像 存储D1net 发表于 11-19 10:07 1453次 阅读

D10-LIV升级蜕变,加速繁荣算法生态

今天给大家带来了一则好消息 D10-LIV智能双光语音摄像机 迎来了一次重大升级! 无需换机 仅需对....
的头像 华为机器视觉 发表于 11-19 09:55 1486次 阅读
D10-LIV升级蜕变,加速繁荣算法生态

32单片机编程简单吗?单片机程序与桌面编程哪个难?

STM32单片机编程对很多新手来说就像”天书”。我当初是学习了51单片机,然后就去找工作了,这已经是....
发表于 11-19 09:51 13次 阅读
32单片机编程简单吗?单片机程序与桌面编程哪个难?

如何解决回到MQ的消息顺序问题

为了系统间解耦,我们通常会引入MQ框架,大家各司其职共同完成上下游的业务流程。 大致过程: 生产端,....
的头像 数据分析与开发 发表于 11-18 16:07 300次 阅读
如何解决回到MQ的消息顺序问题

一些时间序列算法探索

随着社会的进步,人们生活水平的提高,或是人人都有私家车,然而驱车在外,停车却成了一个头大的问题。而没....
的头像 数据分析与开发 发表于 11-18 15:58 306次 阅读

Hive如何提升查询效率

今天分享一下Hive如何提升查询效率。 Hive作为最常用的数仓计算引擎,是我们必备的技能,但是很多....
的头像 数据分析与开发 发表于 11-18 15:53 314次 阅读

工程师在新设计中必须考虑的电源问题

我们常常想当然地为印刷电路板上的电路上电,殊不知这可能造成破坏以及有损或无损闩锁状况。随着片上系统(....
的头像 亚德诺半导体 发表于 11-18 10:52 290次 阅读
工程师在新设计中必须考虑的电源问题

解析使用RT-Thread Studio指定特殊函数加载到RAM的方法

用ITCM给ART-Pi(STM32H7)代码加速 , 这篇文章就提到了,将特殊的函数(如,算法相关....
的头像 RTThread物联网操作系统 发表于 11-18 10:06 307次 阅读

做数据产品时为什么埋点治理这么难

从做数据产品开始,自己的日常工作就被埋点占据了大部分,到后面做平台类数据产品之后发现埋点问题依旧占据....
的头像 数据分析与开发 发表于 11-17 14:13 219次 阅读
做数据产品时为什么埋点治理这么难

Apache Spark 3.2有哪些新特性

经过七轮投票, Apache Spark 3.2 终于正式发布了。Apache Spark 3.2 ....
的头像 数据分析与开发 发表于 11-17 14:09 291次 阅读