理解ES的refresh、flush、merge

news2024/10/7 4:23:54

一、refresh


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

1.1 什么是refresh


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

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

文档写入内存缓存区中,默认每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会对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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1066059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何优雅构建自定义 Spring Boot 验证器,让你的代码更加丝滑!

作为一名开发人员,你应该知道确保应用程序中流动的数据的准确性和完整性是多么重要。Spring Boot提供了强大的验证功能,但有时我们需要额外的验证,创建适合特定需求的自定义验证器。 接下来,我们来介绍下如何完整的创建一个自定义…

九、分枝切割算法

文章目录 1、Gomory切割的算法原理2、分枝切割算法THE END 1、Gomory切割的算法原理 \qquad 考虑有一个等式的形式如下所示&#xff1a; I L F f ILFf ILFf \qquad 其中各项满足以下性质&#xff1a; I L IL IL是一个整数值的表达式 F F F是一个严格正分数的和 f < 1 f&…

SpringBoot项目默认使用HikariDataSource数据库连接池修改使用Druid连接池

1.启动项目&#xff0c;查看正在使用的链接池。 2.在pom.xml文件中引入驱动 <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.8</version></dependency> 3.在ap…

【广州华锐互动】VR虚拟现实编辑软件的独特优势

随着科技的不断发展&#xff0c;虚拟现实(Virtual Reality&#xff0c;简称VR)技术已经成为了一种新兴的交互方式。由广州华锐互动研发的VR虚拟现实编辑软件&#xff0c;是一种用于创建虚拟现实内容的工具&#xff0c;它可以让用户在虚拟环境中自由地创作和体验各种内容。 VR虚…

JDBC-day01(JDBC概述,获取数据库连接)

一&#xff1a;JDBC概述 1.数据持久化 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#xff0c;数据持久化意味着将内存中的数据保存到硬盘上加以”固化”&#xff0c;而持久化的实现过程大多通过各种关系数据库来完成。简单来…

现货白银图表分析的依据

现货白银的行情图表分析其实与股票的差不多&#xff0c;投资者可以结合均线、k线的变化&#xff0c;来分析实时的行情走势。当走势图的均线呈多头排列&#xff0c;即短期、中期、长期均线依次从上到下排列并向右上方运行&#xff0c;且白银价格沿各均线向右上方拉升&#xff0c…

小匠物联获评2023年度浙江省省工业设计企业

小匠物联省工业设计企业 2023年9月25日&#xff0c;浙江省经济和信息化厅公布了2023年度省级工业设计中心拟认定名单。 喜报传来&#xff0c;小匠物联成功通过认定&#xff0c;荣获2023年度浙江省省工业设计企业称号。 小匠物联获权威肯定 浙江省人民政府此次开展省级工业设计中…

【赠书活动】Excel透视表的简单应用

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

2023年中国铁路安全行车系统市场规模现状及行业细分市场分析[图]

铁路行车安全系统是铁路运输组织信息系统的组成部分&#xff0c;涉及铁路通信系统、铁路信号系统、行车监测系统、信号联锁系统、车号识别及其他等。 在我国铁路营业里程不断增长、行车速度逐步提高、列车运行密度不断加大的背景下&#xff0c;运输安全控制需求日益提升。我国铁…

【Sentinel】Sentinel原码分析

本文内容来自【黑马】Sentinel从使用到源码解读笔记&#xff0c;做了部分修改和补充 目录 Sentinel 基本概念 基本流程 Node Entry 定义资源的两种方式 使用try-catch定义资源 使用注解标记资源 基于注解标记资源的实现原理 Context 什么是Context Context的初始化 …

andriod studio运行失败设置

(1) 重新设置maven maven("https://maven.aliyun.com/nexus/content/groups/public/")(2) 删除dependencies中的maven依赖 (3)

和力链携手纷享销客推动CRM业财一体化,引领大健康产业数智化发展

两化深度融合正在加速产业转型升级、重塑产业结构&#xff0c;为传统行业注入发展新活力&#xff0c;江西和力物联实业有限公司&#xff08;以下简称“和力链”&#xff09;正是这样一家推动医药大健康产业数智化发展的高新技术企业。 和力链是国内首家大健康供应链产能数字化…

【MySQL实战45讲-基础篇】

基础篇 基础架构 MySQL的基本架构示意图&#xff1a;MySQL可以分为Server层和存储引擎层两部分。 Server层包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖MySQL的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函…

Leetcode hot 100之双指针(快慢指针、滑动窗口)

目录 数组 有序的平方仍有序 删除/覆盖元素 移动零&#xff1a;交换slow和fast 滑动窗口&#xff1a;最短的连续子串&#xff08;r可行解->l--最短解&#xff09; 最小长度的子数组 求和&#xff1a;sort、l i 1, r len - 1 三数之和abctarget 四数之和abcdtarg…

table表格初始化根据字段数字排序,table表格进入后返回上一级设置,第一级隐藏

根据字段数字排序 // 初始化表格数据 const getTableData async () > {try {loading.value trueconst res await getFileList() //排序const sortedData computed(() > {return res.slice().sort((a: any, b: any) > a.documentType - b.documentType);});tableD…

【Spring Boot | 第一篇】Spring Boot 原理

前言&#xff1a; 当今互联网时代&#xff0c;随着软件开发的快速发展&#xff0c;开发者们迫切需要一个简单、高效、可扩展的框架来提升开发效率和质量。Spring Boot作为一款备受欢迎的Java框架&#xff0c;应运而生。 Spring Boot以其优雅的设计和丰富的功能&#xff0c;成…

2023年中国铁路行车监测系统竞争格局、市场规模及行业发展趋势分析[图]

铁路行车监测系统是对铁路列车及车载设备运行状态全面监测的车载行车安全系统&#xff0c;是智能化、自动化等技术在铁路行业的具体应用。行车监测系统主要包括机车车载安全防护系统&#xff08;简称6A系统&#xff09;、机车远程监测与诊断系统&#xff08;简称CMD系统&#x…

编译工具链 之二 详解 ELF 格式及标准、UNIX 发展、ABI

在计算机及嵌入式系统中&#xff0c;二进制文件也有一定的标准格式&#xff0c;通常会包含在各平台的应用程序二进制接口 &#xff08;Application Binary Interface&#xff0c;ABI&#xff09;规范中。它是编译工具链必须要遵守的规范&#xff08;编译工具链产生符合 ABI 的二…

【数字图像处理第四版课后习题答案】第2章 数字图像基础(含英文原版)

2.1暂无 2.2 翻译答案 如图 P2.3 所示&#xff0c;视网膜图像中与点相对应的直径 x 是由类似的三角形得到的。即 得出 x 0.085d。根据第 2.1 节中的讨论&#xff0c;并结合一些自由解释&#xff0c;我们可以将眼窝视为一个方形传感器阵列&#xff0c;拥有大约 337,000 个元素…

6-3 递增的整数序列链表的插入 分数 5

List Insert(List L, ElementType X) {//创建结点List node (List)malloc(sizeof(List));node->Data X;node->Next NULL;List head L->Next; //定位real头指针//空链表 直接插入if (head NULL) {L->Next node;node->Next head;return L;}//插入数据比第…