5.4-分片及其生命周期

分⽚的内部原理

  • 什么是 ES 的分⽚

    • ES 中最⼩的⼯作单元 / 是⼀个 Lucene 的 Index
  • ⼀些问题:

    • 为什么 ES 的搜索是近实时的(1 秒后被搜到)

    • ES 如何保证在断电时数据也不会丢失

    • 为什么删除⽂档,并不会⽴刻释放空间

倒排索引不可变性

  • 倒排索引采⽤ Immutable Design,⼀旦⽣成,不可更改

  • 不可变性,带来了的好处如下:

    • ⽆需考虑并发写⽂件的问题,避免了锁机制带来的性能问题

    • ⼀旦读⼊内核的⽂件系统缓存,便留在哪⾥。只要⽂件系统存有⾜够的空间,⼤部分请求就会直接请求内 存,不会命中磁盘,提升了很⼤的性能

    • 缓存容易⽣成和维护 / 数据可以被压缩

  • 不可变更性,带来了的挑战:如果需要让⼀个新的⽂档可以被搜索,需要重建整个索引。

Lucene Index

image.png
  • 在 Lucene 中,单个倒排索引⽂件被称为 Segment。Segment 是⾃包含的,不可变更的。 多个 Segments 汇总在⼀起,称为 Lucene 的 Index,其对应的就是 ES 中的 Shard

  • 当有新⽂档写⼊时,会⽣成新 Segment,查询 时会同时查询所有 Segments,并且对结果汇 总。Lucene 中有⼀个⽂件,⽤来记录所有 Segments 信息,叫做 Commit Point

  • 删除的⽂档信息,保存在“.del”⽂件中

什么是 Refresh

image.png
  • 将 Index buffer 写⼊ Segment 的过程叫 Refresh。Refresh 不执⾏ fsync 操作

  • Refresh 频率:默认 1 秒发⽣⼀次,可通过 index.refresh_interval 配置。Refresh 后, 数据就可以被搜索到了。这也是为什么 Elasticsearch 被称为近实时搜索

  • 如果系统有⼤量的数据写⼊,那就会产⽣很 多的 Segment

  • Index Buffer 被占满时,会触发 Refresh,默 认值是 JVM 的 10%

什么是 Transaction Log

image.png
  • Segment 写⼊磁盘的过程相对耗时,借助 ⽂件系统缓存,Refresh 时,先将 Segment 写⼊缓存以开放查询

  • 为了保证数据不会丢失。所以在 Index ⽂ 档时,同时写 Transaction Log,⾼版本 开始,Transaction Log 默认落盘。每个 分⽚有⼀个 Transaction Log

  • 在 ES Refresh 时,Index Buffer 被清空, Transaction log 不会清空

什么是 Flush

image.png
  • ES Flush & Lucene Commit

    • 调⽤ Refresh,Index Buffer 清空并 且 Refresh

    • 调⽤ fsync,将缓存中的 Segments 写⼊磁盘

    • 清空(删除)Transaction Log

    • 默认 30 分钟调⽤⼀次

    • Transaction Log 满 (默认 512 MB)

Merge

  • Segment 很多,需要被定期被合并

    • 减少 Segments / 删除已经删除的⽂档
  • ES 和 Lucene 会⾃动进⾏ Merge 操作

    • POST my_index/_forcemerge

本节知识点回顾

  • Shard 和 Lucene Index

    • Index Buffer / Segment / Transaction Log
  • Refresh & Flush

  • Merge

生命周期

1)客户端发起数据写入请求,对你写的这条数据根据_routing规则选择发给哪个Shard。

  • 确认Index Request中是否设置了使用哪个Filed的值作为路由参数,

  • 如果没有设置,则使用Mapping中的配置,

  • 如果mapping中也没有配置,则使用_id作为路由参数,然后通过_routing的Hash值选择出Shard,最后从集群的Meta中找出出该Shard的Primary节点。

2)写入请求到达Shard后,先把数据写入到内存(buffer)中,同时会写入一条日志到translog日志文件中去。

  • 当写入请求到shard后,首先是写Lucene,其实就是创建索引。

  • 索引创建好后并不是马上生成segment,这个时候索引数据还在缓存中,这里的缓存是lucene的缓存,并非Elasticsearch缓存,lucene缓存中的数据是不可被查询的。

3)执行refresh操作:从内存buffer中将数据写入os cache(操作系统的内存),产生一个segment file文件,buffer清空。

  • 写入os cache的同时,建立倒排索引,这时数据就可以供客户端进行访问了。

  • 默认是每隔1秒refresh一次的,所以es是准实时的,因为写入的数据1秒之后才能被看到。

  • buffer内存占满的时候也会执行refresh操作,buffer默认值是JVM内存的10%。

  • 通过es的restful api或者java api,手动执行一次refresh操作,就是手动将buffer中的数据刷入os cache中,让数据立马就可以被搜索到。

  • 若要优化索引速度, 而不注重实时性, 可以降低刷新频率。

4)translog会每隔5秒或者在一个变更请求完成之后,将translog从缓存刷入磁盘。

  • translog是存储在os cache中,每个分片有一个,如果节点宕机会有5秒数据丢失,但是性能比较好,最多丢5秒的数据。。

  • 可以将translog设置成每次写操作必须是直接fsync到磁盘,但是性能会差很多。

  • 可以通过配置增加transLog刷磁盘的频率来增加数据可靠性,最小可配置100ms,但不建议这么做,因为这会对性能有非常大的影响。

5)每30分钟或者当tanslog的大小达到512M时候,就会执行commit操作(flush操作),将os cache中所有的数据全以segment file的形式,持久到磁盘上去。

  • 第一步,就是将buffer中现有数据refresh到os cache中去。

  • 清空buffer 然后强行将os cache中所有的数据全都一个一个的通过segmentfile的形式,持久到磁盘上去。

  • 将commit point这个文件更新到磁盘中,每个Shard都有一个提交点(commit point), 其中保存了当前Shard成功写入磁盘的所有segment。

  • 把translog文件删掉清空,再开一个空的translog文件。

  • flush参数设置:

    • index.translog.flush_threshold_period:

    • index.translog.flush_threshold_size:

    • 控制每收到多少条数据后flush一次

    • index.translog.flush_threshold_ops:

6)Segment的merge操作:

  • 随着时间,磁盘上的segment越来越多,需要定期进行合并。

  • Es和Lucene 会自动进行merge操作,合并segment和删除已经删除的文档。

  • 我们可以手动进行merge:POST index/_forcemerge。一般不需要,这是一个比较消耗资源的操作。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容