1、refresh

1.1refresh操作

文档数据刚写入es时,是写在内存buffer中的,这时是不可搜索的。当执行了refresh操作后(默认1 s),会打开一个新的segment并进行写入,并清空原有in-memory index buffer,新写入的段变为可读状态文档的状态才会变为可搜索,所以称es为近实时的搜索系统。
文档写入内存缓存区中,默认每1s生成一个新的段,这个写入并打开一个新段的轻量的过程叫做 refresh。
7b927dcdd75a49ad937bc3cc94210155.png
文档被写入一个新的段后处于searchable状态,但是仍是未提交状态
当有大量数据需要写入时,可以设置参数refresh_interval 控制索引refresh频率,默认为1s,-1为关闭刷新。
合理设置refresh_interval参数,在生产环境中,若我们需要创建一个大索引,可设置该参数为-1,开始使用时再开启参数,减少创建索引时refresh的消耗

1.2refresh的特点

  • 没有完全提交,只是进入可搜索状态
  • 默认每1s进行一次refresh,refresh后的段可以被打开,实现近实时搜索
  • refresh资源消耗相对较小,避免每次文档写入fsync导致资源上的瓶颈

    2、flush

    2.1flush操作

    flush就是一次完整提交的操作,会将对应的段刷进磁盘,并写入一个包含所有段列表的提交点commit point ,Elasticsearch 在启动或重新打开一个索引的过程中使用这个提交点来判断哪些段隶属于当前分片,保证数据的安全。
    将translog中所有的段进行全量提交并对translog进行截断的操作叫做flush
    flush操作期间会做的事项主要有:

  • 强制refresh,将内存缓冲区所有文档写入一个新的段,写入到文件系统缓存并将旧的内存缓冲区被清空(refresh)

  • 将最新的commit point写入磁盘
  • 将文件系统缓存中的段通过fsync进行刷盘
  • 删除老的translog,启动新translog

2.2flush的特点:

1、flush将文件系统中的缓存提交至commit point,并使用fsync进行刷盘
2、es断电/意外重启后,es首先找到commit point,然后通过translog重构commit point之后的segment进行数据恢复。


2.3 translog事务日志

translog就是ES的一个事务日志,当发生一个文档变更操作时,文档不仅会写入到内存缓存区也会同样记录到事务日志中,事务日志保证还没有被刷到磁盘的操作的进行持久化。translog持久化后保证即使意外断电或者ES程序重启,ES首先通过磁盘中最后一次提交点恢复已经落盘的段,然后将该提交点之后的变更操作通过translog进行重放,重构内存中的segment。

translog的基本流程

  • 一个文档被索引之后,就会被添加到内存缓冲区,并且追加到了translog
  • 默认每秒refresh一次,refresh会清空内存缓存,但是不会清空translog

7c3d6c01c64a43ea95e202af9a144da1.png
当refresh操作不断执行时,文档被不停的添加到内存buffer和追加到translog中。

b2679b37ddd04c06b530951cd0a6b93f.png

translog周期性通过fsync进行刷盘,默认5s,可通过参数index.translog.sync_interval、index.translog.durability控制,保证应用重启后先确认最后记录的commit point,commit point之后的变更操作通过落盘的translog进行重构恢复段。
默认当translog太大(512MB)时,进行flush操作
e7def6515e934c21b13ff7a5393fc4b1.png

3、merge

3.1为什么要进行merge

每次refresh操作都会生成一个新的segment,随着时间的增长segmengt会越来越多,这就出现一个比较严重的问题是每次search操作必须依次扫描所有的segment,导致查询效率变慢,为了避免该问题es会定期多这个segment进行合并操作。
将refresh产生的多个小segment整合为一个大的segment的操作就叫做merge。同时merge操作会将已经打.del标签的文档从文件系统进行物理删除。merge属于一个后台操作。
在es中每个delete操作其实都是对将要删除的文档打一个.del的标签,同理update操作就是将原文档进行.del打标然后插入新文档,只有merge操作才会将这些已经打标的.del文件真正进行物理删除。
一个大segment的merge操作是很消耗CPU、IO资源的,如果使用不当会影响到本身的serach查询性能。es默认会控制merge进程的资源占用以保证merge期间search具有足够资源。

3.2merge的过程

refresh操作会相应的产生很多小的segment文件,并刷入到文件系统缓存(此时文件系统中既有已经完全commit的segment也有不完全提交仅searchable的segment)refresh之后的段和flush之后的段
es可以对这些零散的小segment文件进行合并(包含完全提交以及searchalbe的segment)
bf8b0649b46c4b37b2514277f724640e.png

  • es会对merge操作后的segment进行一次flush操作,更新磁盘commit point
  • 将merge之后的segment打开保证searchalbe,然后删除merge之前的零散的小segment
  • 816b8693b65e4dc1b4168ac66e35d382.png

    3.3 merge的特点

    对文件系统中零散的小segment进行合并,合并为一个大的segment,减少search期间依次扫描多个segment带来的资源消耗
    merge操作会消耗CPU、IO资源,ES对于merge操作相对比较保守,会控制每次merge操作的带宽限制
    merge操作不适用于频繁更新的动态索引,相反他更适合只有index的日志型索引,定期将历史索引segment进行合并,加快search效率