Elasticsearch分⽚及其⽣命周期
分⽚的内部原理
- 什么是 ES 的分⽚:
- ES 中最⼩的⼯作单元 / 是⼀个 Lucene 的 Index。
- ⼀些问题:
- 为什么 ES 的搜索是近实时的(1 秒后被搜到)?
- ES 如何保证在断电时数据也不会丢失?
- 为什么删除⽂档,并不会⽴刻释放空间?
倒排索引不可变性
- 倒排索引采⽤ Immutable Design,⼀旦⽣成,不可更改
- 不可变性,带来了的好处如下:
- ⽆需考虑并发写⽂件的问题,避免了锁机制带来的性能问题
- ⼀旦读⼊内核的⽂件系统缓存,便留在哪⾥。只要⽂件系统存有⾜够的空间,⼤部分请求就会直接请求内存,不会命中磁盘,提升了很⼤的性能
- 缓存容易⽣成和维护 / 数据可以被压缩
- 不可变更性,带来了的挑战:如果需要让⼀个新的⽂档可以被搜索,需要重建整个索引。
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
- 调⽤ Refresh,Index Buffer 清空并且 Refresh
- 调⽤ fsync,将缓存中的 Segments写⼊磁盘
- 清空(删除)Transaction Log
- 默认 30 分钟调⽤⼀次
- Transaction Log 满 (默认 512 MB)
Merge
- Segment 很多,需要被定期被合并
- 减少 Segments / 删除已经删除的⽂档
- ES 和 Lucene 会⾃动进⾏ Merge 操作
- POST my_index/_forcemerge
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!