(一:原理2)ElasticSearch的数据存储原理

(八)ElasticSearch的数据存储原理

elasticsearch的索引操作以及mapping配置

1:ElasticSearch的数据存储原理

在这里插入图片描述

在 Elasticsearch 中, 每个字段的所有数据 都是 默认被索引的 。 即每个字段都有为了快速检索设置的专用倒排索引
在 Elasticsearch 中,术语 文档 有着特定的含义。它是指最顶层或者根对象,
这个根对象被序列化成 JSON 并存储到 Elasticsearch 中,指定了唯一 ID。

文档元数据:

文档元数据:一个文档不仅仅包含它的数据,也包含元数据—有关文档的信息。三个必须的元数据元素如下:
 _index:文档在哪存放
 _type:文档表示的对象类别
 _id:文档唯一标识

1.1:文档的路由机制

当索引一个文档的时候,文档会被存储到一个主分片中。 Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?

shard = hash(routing) % number_of_primary_shards
routing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值。 routing 通过 hash 函数生成一个数字,
然后这个数字再除以 number_of_primary_shards (主分片的数量)后得到 余数 。这个分布在 0 到 number_of_primary_shards-1 之间的余数,
就是我们所寻求的文档所在分片的位置

1.2:步骤分析

1:写入请求,分发节点。
2:数据写入同时写入内存和translog各一份,tanslog为保证数据不丢失,每 5 秒,或每次请求操作结束前,会强制刷新 translog 日志到磁盘上
3:确定数据给那个分片,refresh 刷新内存中数据到分片的segment,默认1秒刷新一次,为了提高吞吐量可以增大60s。参数refresh_interval
4:segment刷新到磁盘中完成持久化,保存成功清除translog,新版本es的 translog 不会在 segment 落盘就删,而是会保留,默认是512MB,保留12小时。每个分片。所以分片多的话 ,要考虑 translog 会带来的额外存储开销
5:segment过多会进行合并merge为大的segment,消耗大量的磁盘io和网络io

1.3:索引数据的具体保存方式

elasticsearch底层是lucene存储架构
elasticsearch的数据保存在lucene文件中,es的elasticsearch.yml配置文件中配置数据保存路径。
lucene包的文件是由很多segment文件组成的,segments_xxx文件记录了lucene包下面的segment文件数量。每个segment会主要包含如下的文件。

Name					Extension			Brief Description
Segment Info			.si					segment的元数据文件
Compound File			.cfs, .cfe			一个segment包含了如下表的各个文件,为减少打开文件的数量,
											在segment小的时候,segment的所有文件内容都保存在cfs文件中,cfe文件保存了lucene各文件在cfs文件的位置信息
Fields					.fnm				保存了所有fields的类型等信息
Field Index				.fdx				指向字段值的指针。正排存储文件的元数据信息
Field Data				.fdt				存储了正排存储数据,写入的原文存储在这
Term Dictionary			.tim				倒排索引的元数据信息
Term Index				.tip				倒排索引文件,也就是单词词典,缓存在内存中,存储了所有单词的倒排索引数据
Frequencies				.doc				保存了每个term的doc id列表和term在doc中的词频
Per-Document Values		.dvd, .dvm			lucene的docvalues文件,即数据的列式存储,用作聚合和排序
Live  ocuments			.liv				记录了segment中删除的doc
照上面的lucene表进行如下的关联。
存储原文_source的文件.fdt .fdm .fdx;
存储倒排索引的文件.tim .tip .doc;
用于聚合排序的列存文件.dvd .dvm;
全文检索文件.pos .pay .nvd .nvm等。
加载到内存中的文件有.fdx .tip .dvm,其中.tip占用内存最大,而.fdt . tim .dvd文件占用磁盘最大

1.2.1 :Field Data

我们写入数据的原始数据保存文件,mapping中无法配置。

1.2.2:Term Index

倒排索引文件,也就是mapping中fields的index属性定义决定改字段是否会建立索引,不需要搜索分析是,关闭此属性,减少存储压力。

1.2.3:Per-Document Values

mapping中fields的docvalues 属性,决定是否保存。

2:Elasticsearch中数据是如何存储的

索引的存储
shard是Elasticsearch数据存储的最小单位,index的存储容量为所有shard的存储容量之和。Elasticsearch集群的存储容量则为所有index存储容量之和。

一个shard就对应了一个lucene的library。对于一个shard,Elasticsearch增加了translog的功能,类似于HBase WAL,是数据写入过程中的中间数据,其余的数据都在lucene库中管理的。

2.1:lucene数据存储

1:lucene基本概念

segment : lucene内部的数据是由一个个segment组成的,写入lucene的数据并不直接落盘,而是先写在内存中,经过了refresh间隔,lucene才将该时间段写入的全部数据refresh成一个segment,segment多了之后会进行merge成更大的segment。lucene查询时会遍历每个segment完成。由于lucene* 写入的数据是在内存中完成,所以写入效率非常高。但是也存在丢失数据的风险,所以Elasticsearch基于此现象实现了translog,只有在segment数据落盘后,Elasticsearch才会删除对应的translog。
doc : doc表示lucene中的一条记录
field :field表示记录中的字段概念,一个doc由若干个field组成。
term :term是lucene中索引的最小单位,某个field对应的内容如果是全文检索类型,会将内容进行分词,分词的结果就是由term组成的。如果是不分词的字段,那么该字段的内容就是一个term。
倒排索引(inverted index): lucene索引的通用叫法,即实现了term到doc list的映射。
正排数据:搜索引擎的通用叫法,即原始数据,可以理解为一个doc list。
docvalues :Elasticsearch中的列式存储的名称,Elasticsearch除了存储原始存储、倒排索引,还存储了一份docvalues,用作分析和排序。

2:lucene文件内容

lucene包的文件是由很多segment文件组成的,segments_xxx文件记录了lucene包下面的segment文件数量。每个segment会包含如下的文件。
在这里插入图片描述

2.1:lucene文件内容详解

1:fields信息文件
文件后缀:.fnm

该文件存储了fields的基本信息。
fields信息中包括field的数量,field的类型,以及IndexOpetions,包括是否存储、是否索引,是否分词,是否需要列存等等。

2:倒排索引文件
索引后缀:.tip,.tim

倒排索引也包含索引文件和数据文件,.tip为索引文件,.tim为数据文件,索引文件包含了每个字段的索引元信息,数据文件有具体的索引内容。
3:正排数据存储文件
文件后缀:.fdx, .fdt

索引文件为.fdx,索引文件记录了快速定位文档数据的索引信息。数据文件为.fdt,数据文件记录了所有文档id的具体内容,数据存储文件功能为根据自动的文档id,得到文档的内容,搜索引擎的术语习惯称之为正排数据,即doc_id -> content,es的_source数据就存在这

4:列存文件(docvalues)
文件后缀:.dvm, .dvd

索引文件为.dvm,数据文件为.dvd。

lucene实现的docvalues有如下类型:

1、NONE 不开启docvalue时的状态
2、NUMERIC 单个数值类型的docvalue主要包括(int,long,float,double)
3、BINARY 二进制类型值对应不同的codes最大值可能超过32766字节,
4、SORTED 有序增量字节存储,仅仅存储不同部分的值和偏移量指针,值必须小于等于32766字节
5、SORTED_NUMERIC 存储数值类型的有序数组列表
6、SORTED_SET 可以存储多值域的docvalue值,但返回时,仅仅只能返回多值域的第一个docvalue
7、对应not_anaylized的string字段,使用的是SORTED_SET类型,number的类型是SORTED_NUMERIC类型
其中SORTED_SET 的 SORTED_SINGLE_VALUED类型包括了两类数据 : binary + numeric, binary是按ord排序的term的列表,numeric是doc到ord的映射。

3:lucene字典

使用lucene进行查询不可避免都会使用到其提供的字典功能,即根据给定的term找到该term所对应的倒排文档id列表等信息。实际上lucene索引文件后缀名为tim和tip的文件实现的就是lucene的字典功能。
term字典是一个已经按字母顺序排序好的数组,数组每一项存放着term和对应的倒排文档id列表。每次载入索引的时候只要将term数组载入内存,通过二分查找即可
实例

4:lucene存储数据结构

引用文档
lucene从4开始大量使用的数据结构是FST(Finite State Transducer)。
FST有两个优点:
1空间占用小。通过对词典中单词前缀和后缀的重复利用,压缩了存储空间
2查询速度快。

参考文献1:

3:倒排索引详解

3.1:倒排索引概念

倒排索引包含一个有序列表,列表包含所有文档出现过的不重复个体,或称为 词项 ,对于每一个词项,包含了它所有曾出现过文档的列表。存储在磁盘。
倒排索引是由段(Segment)组成的,段存储在硬盘(Disk)文件中。索引段不是实时更新的,这意味着,段在写入硬盘之后,就不再被更新

**Term  | Doc 1 | Doc 2 | Doc 3 | ...
brown |   X   |       |  X    | ...
fox   |   X   |   X   |  X    | ...
quick |   X   |   X   |       | ...
the   |   X   |       |  X    | ...**
索引的构成
segment:一个索引包含多个段,每个段包含一部分索引的操作记录,定期刷新到索引完成更新
	        可以通过setting设置 refresh_interval , 降低每个索引的刷新频率:优化索引速度而不是近实时搜索
translog :translog 的目的是保证操作不会丢失
			为了保证segment刷新的非实时缺陷,又不保证数据丢失的情况(段未提交集群挂了),
			写数据:新创建的document数据会先进入到index buffer之后,与此同时会将操作记录在translog之中,
			当发生refresh时ranslog中的操作记录并不会被清除,而是当数据从filesystem cache中被写入磁盘之后才会将translog中清空。
translog 提供所有还没有被刷到磁盘的操作的一个持久化纪录。当 Elasticsearch 启动的时候,它会从磁盘中使用最后一个提交点去恢复已知的段,并且会重放 translog 中所有在最后一次提交后发生的变更操作。

1:translog官方文档介绍

translog文档介绍

2:segment段

segment详解
在这里插入图片描述

问题:

由于自动刷新流程每秒会创建一个新的段 ,这样会导致短时间内的段数量暴增。
而段数目太多会带来较大的麻烦。 每一个段都会消耗文件句柄、内存和cpu运行周期。
更重要的是,每个搜索请求都必须轮流检查每个段;所以段越多,搜索也就越慢。

解决

Elasticsearch通过在后台进行段合并来解决这个问题。小的段被合并到大的段,
然后这些大的段再被合并到更大的段

段的合并:
合并大的段需要消耗大量的I/O和CPU资源,如果任其发展会影响搜索性能。Elasticsearch在默认情况下会对合并流程进行资源限制,所以搜索仍然 有足够的资源很好地执行。
在这里插入图片描述

2.1:段合并的优化以及配置

段合并的优化以及配置

3.2:分析与分析器

保证我们数据的存储格式和分析的单词切分格式。特殊要求时可以指定分析器满足需求

分析 包含下面的过程:

首先,将一块文本分成适合于倒排索引的独立的 词条 ,
之后,将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 recall
分析器执行上面的工作。 分析器 实际上是将三个功能封装到了一个包里:

1:字符过滤器

首先,字符串按顺序通过每个 字符过滤器 。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉HTML,或者将 & 转化成 and。

:2:分词器

其次,字符串被 分词器 分为单个的词条。一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条。

3:Token 过滤器

最后,词条按顺序通过每个 token 过滤器 。这个过程可能会改变词条(例如,小写化 Quick ),删除词条(例如, 像 a, and, the 等无用词),或者增加词条(例如,像 jump 和 leap 这种同义词)。

Elasticsearch提供了开箱即用的字符过滤器、分词器和token 过滤器。 这些可以组合起来形成自定义的分析器以用于不同的目的

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值