理解ES的refresh、flush、merge

这篇具有很好参考价值的文章主要介绍了理解ES的refresh、flush、merge。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、refresh

理解ES的refresh、flush、merge,elasticsearch
对于任何数据库的写入来讲fsync刷盘虽然保证的数据的安全但是如果每次操作都必须fsync一次,那fsync操作将是一个巨大的操作代价,在衡量对数据安全与操作代价下,ES引入了一个较轻量的操作refresh操作来避免频繁的fsync操作。

1.1 什么是refresh


在ES中,当写入一个新文档时,首先被写入到内存缓存中,默认每1秒将in-memory index buffer中的文档生成一个新的段并清空原有in-memory index buffer,新写入的段变为可读状态,但是还没有被完全提交。该新的段首先被写入文件系统缓存,保证段文件可以正常被正常打开和读取,后续再进行刷盘操作。由此可以看到,ES并不是写入文档后马上就可以搜索到,而是一个近实时的搜索(默认1s后)。

如图,文档被写入一个新的段后处于searchable状态,但是仍是未提交状态

理解ES的refresh、flush、merge,elasticsearch

文档写入内存缓存区中,默认每1s生成一个新的段,这个写入并打开一个新段的轻量的过程叫做 refresh。

虽然refresh是一个较轻量的操作,但也是有一定的资源消耗的,必要时刻可以手动执行refresh api保证文档可立即被读到。生产环境建议正确使用refresh api,接受ES本身1s后可读的近实时特性。

1.2 refresh api的使用


-- refresh全局索引
POST /_refresh 

-- refresh指定索引
POST /blogs/_refresh 

1.3 refresh相关参数设置


refresh_interval 控制索引refresh频率
默认为1s,可根据实际业务场景设置为n u m {num}num{时间单位},表示索引每${num}s进行一次refresh;若设置为-1表示关闭refresh。

refresh_interval参数设置时是填写具体的一个持续时间值,若该参数设置为1则表示每1毫秒进行一次refresh,若设置不当会导致整个ES集群处于瘫痪状态

PUT /my_logs
{
  "settings": {
    "refresh_interval": "30s"           //设置每30s进行一次refresh
  }
}

合理设置refresh_interval参数,在生产环境中,若我们需要创建一个大索引,可设置该参数为-1,开始使用时再开启参数,减少创建索引时refresh的消耗

1.4 refresh特点


不完整提交(因为没有刷盘)

refresh资源消耗相对较小,避免每次文档写入fsync导致资源上的瓶颈

默认每1s进行一次refresh,refresh后的段可以被打开,实现近实时搜索

二、flush


即使通过每秒refresh实现了近实时搜索,但refresh无法保障数据安全,我们仍然需要经常进行完整提交来确保能从失败中恢复。flush就是一次完全提交的过程,一次完整的提交会将段刷到磁盘,并写入一个包含所有段列表的提交点。Elasticsearch 在启动或重新打开一个索引的过程中使用这个提交点来判断哪些段隶属于当前分片,保证数据的安全。

为此ES增加了一个 translog ,或者叫事务日志,在每一次对 ES的变更操作除写入内存缓存外还会写入到translog中,translog周期性刷盘,保证变更的持久性。

2.1 什么是translog


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

translog也可以被用来实时CRUD搜索,当我们通过_id进行查询/更新/删除文档时,ES在检索该文档对应的segment时会优先检查translog中最近一次的变更操作,以便获取到最新版本的文档记录。

2.2 translog基本流程


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


refresh操作不断发生,更多的文档被添加到内存缓冲区和追加到translog


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

2.3 什么是flush


将translog中所有的段进行全量提交并对translog进行截断的操作叫做flush,flush操作期间会做的事项主要有:

强制refresh,将内存缓冲区所有文档写入一个新的段,写入到文件系统缓存并将旧的内存缓冲区被清空(refresh)
将最新的commit point写入磁盘
将文件系统缓存中的段通过fsync进行刷盘
删除老的translog,启动新translog

2.4 flush api的使用


一般来讲自动刷新就足够了,很少需要自己手动执行 flush 操作。

POST /blogs/_flush 

POST /_flush?wait_for_ongoing 

2.5 flush 相关参数设置

index.translog.sync_interval
    translog通过fsync刷盘的的频率,默认5s,不允许设置100ms以内
    
index.translog.durability
    request(default):默认每次请求(index, delete, update, or bulk request)后都进行fsync和commit
    async:每间隔sync_interval进行一次fsync和commit

index.translog.flush_threshold_size
    translog最大达到512MB的时候强制进行flush操作,flush后将commit point进行刷盘,保证数据安全

2.6 flush的特点


refresh会清空内存缓存,但是不会清空translog

flush操作将文件系统缓存中的segment进行fsync刷盘,并更新commit point

当程序意外重启后,es首先找到commit point,然后通过translog重构commit point之后的segment

三、merge


每次refresh操作都会生成一个新的segment,随着时间的增长segmengt会越来越多,这就出现一个比较严重的问题是每次search操作必须依次扫描所有的segment,导致查询效率变慢,为了避免该问题es会定期多这个segment进行合并操作。

3.1 什么是merge


将refresh产生的多个小segment整合为一个大的segment的操作就叫做merge。同时merge操作会将已经打.del标签的文档从文件系统进行物理删除。merge属于一个后台操作。

在es中每个delete操作其实都是对将要删除的文档打一个.del的标签,同理update操作就是将原文档进行.del打标然后插入新文档,只有merge操作才会将这些已经打标的.del文件真正进行物理删除。

一个大segment的merge操作是很消耗CPU、IO资源的,如果使用不当会影响到本身的serach查询性能。es默认会控制merge进程的资源占用以保证merge期间search具有足够资源。

3.2 merge操作相关流程


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

理解ES的refresh、flush、merge,elasticsearch
es会对merge操作后的segment进行一次flush操作,更新磁盘cpmmit point
将merge之后的segment打开保证searchalbe,然后删除merge之前的零散的小segment

3.3 相关参数API


optimize API通过对max_num_segments参数对merge操作进行控制,默认该参数为1,控制每次merge仅对1个segment进行合并,保证原有的search操作资源充足。

POST /logstash-2014-10/_optimize?max_num_segments=1 

max_bytes_per_sec为限制每次merge操作的带宽限制,默认20MB每秒。若生产环境使用SSD或者es日志中发现“now
throttling indexing”相关INFO等级等信息,可适当调大该参数。

 indices.store.throttle.max_bytes_per_sec

3.4 merge的特点

对文件系统中零散的小segment进行合并,合并为一个大的segment,减少search期间依次扫描多个segment带来的资源消耗
merge操作会消耗CPU、IO资源,ES对于merge操作相对比较保守,会控制每次merge操作的带宽限制
merge操作不适用于频繁更新的动态索引,相反他更适合只有index的日志型索引,定期将历史索引segment进行合并,加快search效率
参考文档:
https://www.elastic.co/guide/en/elasticsearch/guide/current/dynamic-indices.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.x/index-modules-translog.html
————————————————
版权声明:本文为CSDN博主「三思呐三思」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_37692493/article/details/108182161文章来源地址https://www.toymoban.com/news/detail-715344.html

到了这里,关于理解ES的refresh、flush、merge的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (十)ElasticSearch高级使用【别名,重建索引,refresh操作,高亮查询,查询建议】

    在开发中,随着业务需求的迭代,较⽼的业务逻辑就要⾯临更新甚⾄是重构,⽽对于es来说,为了 适应新的业务逻辑,可能就要对原有的索引做⼀些修改,⽐如对某些字段做调整,甚⾄是重建索 引。⽽做这些操作的时候,可能会对业务造成影响,甚⾄是停机调整等问题。由此

    2024年02月02日
    浏览(73)
  • 大数据领域如何理解 Merge、Combine和Aggregate

    在大数据领域,Merge、Combine和Aggregate这三个词通常描述数据处理过程中的不同操作。下面我们分别了解一下这三个概念: Merge(合并) : 合并是指将两个或多个数据集按照某种规则(例如,基于共享的键)组合成一个数据集。在大数据领域,这通常涉及到将不同来源或分布

    2024年02月07日
    浏览(36)
  • flush()函数用法详解

    最近在写一个小项目时用到了Java的序列化,在写入输出流时用到了 flush() 函数。网上搜了一下感觉讲的不是很详细,在此写一下自己的理解 先给出代码片段 在以上代码中我们用ObjectOutputStream 类用来序列化obj对象,并将该对象序列化到一个文件中。 我们给出了细微差别的两

    2024年02月05日
    浏览(82)
  • InnoDB引擎之flush脏页

    利用 WAL 技术,数据库将随机写转换成了顺序写,大大提升了数据库的性能,由此也带来了内存脏页的问题。   脏页会被后台线程自动 flush,也会由于数据页淘汰而触发 flush,而刷脏页的过程由于会占用资源,可能会让你的更新和查询语句的响应时间长一些。   当内存数据页

    2023年04月10日
    浏览(141)
  • ES索引的理解

    理解Elasticsearch索引的原理涉及到分片、倒排索引、分布式搜索等概念。以下是关于Elasticsearch索引的主要原理: 1.倒排索引(Inverted Index): Elasticsearch 使用倒排索引(Inverted Index)来支持高效的全文搜索。倒排索引是一种数据结构,其核心思想是将文档中每个包含的词与包含

    2024年01月16日
    浏览(51)
  • 【elasticsearch】elasticsearch es读写原理

    今天来学习下 es 的写入原理。 Elasticsearch底层使用Lucene来实现doc的读写操作: 没有并发设计 lucene 只是一个搜索引擎库,并没有涉及到分布式相关的设计,因此要想使用Lucene来处理海量数据,并利用分布式的能力,就必须在其之上进行分布式的相关设计。 非实时 将文件写入

    2023年04月08日
    浏览(49)
  • ES(elasticsearch)报错elasticsearch.keystore

    准备启动ES发现报错如下elasticsearch.keystore,一直没弄清楚怎么回事,即便我按照keystore搜索也没有,后来我才意识到是权限的问题啊兄弟们!你们看其他文件都是lin:lin,只有这个elasticsearch.keystore归属于root,因为它是在我启动后才生成的,自然在我设置归属的时候没有

    2024年02月12日
    浏览(40)
  • Java IO流 flush()的作用和缓冲流

    哪些流是缓冲流 根据Java官方文档关于Buffered Streams的介绍,缓冲流有四种: BufferedInputStream:包装字节输入流 BufferedOutputStream:包装字节输出流 BufferedReader:包装字符输入流 BufferedWriter:包装字符输出流 这些流又被称为包装流/处理流,用于包装非缓冲的流 There are four buffere

    2024年02月04日
    浏览(32)
  • cache操作:clean、invalidate与flush的含义

    本文试图搞清楚cache几个操作:clean、invalidate与flush的含义。由于只用过ARM和RISC-V,所以是从ARM和RISC-V的角度来说明。   cache line是cache的基本访问单元。 cache line一般都会包含valid和dirty两个状态位,如下图的v和d。 valid位表示当前cache line的内容是否有效。dirty位表示当前cache

    2024年02月04日
    浏览(43)
  • ElasticSearch第二讲:ES详解 - ElasticSearch基础概念

    在学习ElasticSearch之前,先简单了解下ES流行度,使用背景,以及相关概念等。本文是ElasticSearch第二讲,ElasticSearch的基础概念。 根据DB Engine的排名显示,ElasticSearch是最受欢迎的企业级搜索引擎。 下图红色勾选的是我们前面的系列详解的,除此之外你可以看到搜索库ElasticSea

    2024年02月09日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包