ElasticSearch-分片及其生命周期
什么是ES的分片?
- ES中最小的工作单元,是一个Lucene的index
一些问题:
- 为什么ES的搜索是近实时的(1秒后被搜到)
- ES如何保证在断电时数据也不会丢失
- 为什么删除文档,并不会立刻释放空间
Lucene Index

- 在Lucene中,单个倒排索引文件被称为Segment。Segment是自包含的,不可变更的。多个Segment汇总在一起,称为Lucene的Index,对应ES中的Shard
- 当有新文档写入时,会生成新的Segment,查询时会同时查询所有的Segments, 并且对结果汇总,Lucene中有一个文件,用来记录所有Segments信息,叫做Commit Point
- 删除的文档信息,保存在“.del”文件中
什么是Refresh

- 将Index buffer写入segment的过程叫Refresh
- Refresh频率,默认1秒发生一次,可通过index.refresh_interval配置。Refresh后,数据就可以被搜索到了。这也是为什么ES被称为近实时搜索
- 如果系统由大量的数据写入,那就回产生很多的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
- 调用fync,将缓存中的Segments写入磁盘
- 清空Transaction Log
- 默认30分钟调一次
Merge
- Segment很多,需要定期被合并
- 减少Segments / 删除已经删除的文档
- ES和Lucene会自动进行Merge操作

浙公网安备 33010602011771号