Elasticsearch分⽚及其⽣命周期

分⽚的内部原理

  • 什么是 ES 的分⽚:
    • ES 中最⼩的⼯作单元 / 是⼀个 Lucene 的 Index。
  • ⼀些问题:
    • 为什么 ES 的搜索是近实时的(1 秒后被搜到)?
    • ES 如何保证在断电时数据也不会丢失?
    • 为什么删除⽂档,并不会⽴刻释放空间?

倒排索引不可变性

  • 倒排索引采⽤ Immutable Design,⼀旦⽣成,不可更改
  • 不可变性,带来了的好处如下:
  1. ⽆需考虑并发写⽂件的问题,避免了锁机制带来的性能问题
  2. ⼀旦读⼊内核的⽂件系统缓存,便留在哪⾥。只要⽂件系统存有⾜够的空间,⼤部分请求就会直接请求内存,不会命中磁盘,提升了很⼤的性能
  3. 缓存容易⽣成和维护 / 数据可以被压缩
  • 不可变更性,带来了的挑战:如果需要让⼀个新的⽂档可以被搜索,需要重建整个索引。

Lucene Index

 

  • 在 Lucene 中,单个倒排索引⽂件被称为Segment。Segment 是⾃包含的,不可变更的。多个 Segments汇总在⼀起,称为 Lucene 的Index,其对应的就是 ES 中的 Shard
  • 当有新⽂档写⼊时,会⽣成新 Segment,查询时会同时查询所有 Segments,并且对结果汇总。Lucene 中有⼀个⽂件,⽤来记录所有Segments 信息,叫做 Commit Point
  • 删除的⽂档信息,保存在“.del”⽂件中

什么是 Refresh

  • 将 Index buffer 写⼊ Segment 的过程叫 Refresh。Refresh 不执⾏ fsync 操作
  • Refresh 频率:默认 1 秒发⽣⼀次,可通过 index.refresh_interval 配置。Refresh 后, 数据就可以被搜索到了。这也是为什么 Elasticsearch 被称为近实时搜索
  • 如果系统有⼤量的数据写⼊,那就会产⽣很多的 Segment
  • Index Buffer 被占满时,会触发 Refresh,默 认值是 JVM 的 10%

什么是 Transaction Log

  • Segment 写⼊磁盘的过程相对耗时,借助⽂件系统缓存,Refresh时,先将Segment 写⼊缓存以开放查询。
  • 为了保证数据不会丢失。所以在 Index ⽂档时,同时写 Transaction Log,⾼版本开始,Transaction Log 默认落盘。每个分⽚有⼀个 Transaction Log。
  • 在ES Refresh时,Index Buffer 被清空, Transaction log 不会清空。

 

什么是 Flush

  • ES Flush & Lucene Commit
  1. 调⽤ Refresh,Index Buffer 清空并且 Refresh
  2. 调⽤ fsync,将缓存中的 Segments写⼊磁盘
  3. 清空(删除)Transaction Log
  4. 默认 30 分钟调⽤⼀次
  5. Transaction Log 满 (默认 512 MB)

Merge

  • Segment 很多,需要被定期被合并
    • 减少 Segments / 删除已经删除的⽂档
  • ES 和 Lucene 会⾃动进⾏ Merge 操作
    • POST my_index/_forcemerge

 

 

 

 

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部