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

更新时间:2023-05-16 04:21:35 阅读: 评论:0

(⼀:原理2)ElasticSearch的数据存储原理
(⼋)ElasticSearch的数据存储原理
⽂章⽬录
1:ElasticSearch的数据存储原理
在 Elasticarch 中,每个字段的所有数据都是默认被索引的。即每个字段都有为了快速检索设置的专⽤倒排索引
在 Elasticarch 中,术语⽂档有着特定的含义。它是指最顶层或者根对象, 这个根对象被序列化成 JSON 并存储到 Elasticarch 中,指定了唯⼀ ID。⽂档元数据:
⽂档元数据:⼀个⽂档不仅仅包含它的数据,也包含元数据 —— 有关⽂档的信息。三个必须的元数据元素如下:
_index
⽂档在哪存放
_type
vere比较级⽂档表⽰的对象类别
_id
⽂档唯⼀标识
1.1:⽂档的路由机制
当索引⼀个⽂档的时候,⽂档会被存储到⼀个主分⽚中。 Elasticarch 如何知道⼀个⽂档应该存放到哪个分⽚中呢?
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 刷新内存中数据到分⽚的gment,默认1秒刷新⼀次,为了提⾼吞吐量可以增⼤60s。参数
dim
refresh_interval
4:gment刷新到磁盘中完成持久化,保存成功清除translog,新版本es的 translog 不会在 gment 落盘就删,⽽是会保留,默认是512MB,保留12⼩时。每个分⽚。所以分⽚多的话 ,要考虑 translog 会带来的额外存储开销
5:gment过多会进⾏合并merge为⼤的gment,消耗⼤量的磁盘io和⽹络io
1.3:索引数据的具体保存⽅式
elasticarch底层是lucene存储架构
elasticarch的数据保存在lucene⽂件中,es的l配置⽂件中配置数据保存路径。
lucene包的⽂件是由很多gment⽂件组成的,gments_xxx⽂件记录了lucene包下⾯的gment⽂件数量。每个gment会主要包含如下的⽂件。
Name    Extension      Brief Description
Segment Info  .si        gment的元数据⽂件
Compound File  .cfs, .cfe      ⼀个gment包含了如下表的各个⽂件,为减少打开⽂件的数量,在gment⼩的时候,gment的所有⽂件内容都保存在cfs⽂件中,cfe⽂件保存了lucene各⽂件在cfs⽂件的位置信息
Fields    .fnm      保存了所有fields的类型等信息
rcep怎么读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      记录了gment中删除的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:Elasticarch中数据是如何存储的
shard是Elasticarch数据存储的最⼩单位,index的存储容量为所有shard的存储容量之和。Elasticarch集群的存储容量则为所有index存储容量之和。
⼀个shard就对应了⼀个lucene的library。对于⼀个shard,Elasticarch增加了translog的功能,类似于HBa WAL,是数据写⼊过程中的中间数据,其余的数据都在lucene库中管理的。
2.1:lucene数据存储
1:lucene基本概念
gment : lucene内部的数据是由⼀个个gment组成的,写⼊lucene的数据并不直接落盘,⽽是先写在内存中,经过了refresh间隔,lucene才将该时间段写⼊的全部数据refresh成⼀个gment,gment多了之后会进⾏merge成更⼤的gment。lucene查询时会遍历每个gment完成。由于lucene* 写⼊的数据是在内存中完成,所以写⼊效率⾮常⾼。但是也存在丢失数据的风险,所以Elasticarch基于此现象实现了translog,只有在gment数据落盘后,Elasticarch才会删除对应的translog。
doc : doc表⽰lucene中的⼀条记录
field :field表⽰记录中的字段概念,⼀个doc由若⼲个field组成。
term :term是lucene中索引的最⼩单位,某个field对应的内容如果是全⽂检索类型,会将内容进⾏分词,分词的结果就是由term组成的。如果是不分词的字段,那么该字段的内容就是⼀个term。
倒排索引(inverted index): lucene索引的通⽤叫法,即实现了term到doc list的映射。
正排数据:搜索引擎的通⽤叫法,即原始数据,可以理解为⼀个doc list。
docvalues :Elasticarch中的列式存储的名称,Elasticarch除了存储原始存储、倒排索引,还存储了⼀份docvalues,⽤作分析和排序。
2:lucene⽂件内容
lucene包的⽂件是由很多gment⽂件组成的,gments_xxx⽂件记录了lucene包下⾯的gment⽂件数量。每个gment会包含如下的⽂件。
2.1:lucene⽂件内容详解
1:fields信息⽂件
wx⽂件后缀:.fnm
该⽂件存储了fields的基本信息。
bull durham
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查询速度快。
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    | ...**
索引的构成
gment:⼀个索引包含多个段,每个段包含⼀部分索引的操作记录,定期刷新到索引完成更新
可以通过tting设置 refresh_interval ,降低每个索引的刷新频率:优化索引速度⽽不是近实时搜索
translog :translog 的⽬的是保证操作不会丢失
为了保证gment刷新的⾮实时缺陷,⼜不保证数据丢失的情况(段未提交集群挂了),增强记忆力的食物
写数据:新创建的document数据会先进⼊到index buffer之后,与此同时会将操作记录在translog之中,
当发⽣refresh时ranslog中的操作记录并不会被清除,⽽是当数据从filesystem cache中被写⼊磁盘之后才会将 translog中清空。
translog 提供所有还没有被刷到磁盘的操作的⼀个持久化纪录。当 Elasticarch 启动的时候,它会从磁盘中使⽤最后⼀个提交点去恢复已知的段,并且会重放 translog 中所有在最后⼀次提交后发⽣的变更操作。
1:translog官⽅⽂档介绍

本文发布于:2023-05-16 04:21:35,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/110183.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   操作   刷新   类型   是否
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图