当前位置: 首页 > news >正文

ES 处理索引数据变动的原理剖析

1 概述

es是如何处理索引数据的变动的?

或者说索引数据变动时,es会执行哪些操作?

refresh、fsync、merge 和 flush 操作有何作用?

es是如何确保即使es发生宕机数据也不丢失的?

在回答上述问题前,可以先了解一下es处理索引数据变动的主要流程,其示意图如下所示。

2 处理索引数据变动的过程

由示意图可知,es处理索引数据变动的主要过程如下所述:

(1)将数据写入内存缓冲区;

(2)生成新的segment,使数据可见-即可被搜索到;

(3)将数据存储到磁盘。

2.1 将数据写入内存缓冲区

当索引数据变动(插入、更新或删除索引数据)时,首先会将变动的索引数据写入到内存中的“索引缓冲区”,然后将索引数据变动命令写入到内存中的“translog缓冲区”。

  • translog的作用是当es服务宕机后需要进行数据恢复时,通过translog可以恢复尚未存储到磁盘中的es索引数据。
  • 通过每次索引变动请求完成时(默认)执行fsync操作,或者定时执行(设为异步执行时,默认为5s)fsync操作,将“translog缓冲区”中的数据添加到磁盘中的translog文件中。

New documents are added to the in-memory buffer and appended to the transaction log

2.2 使数据可见

通过定时执行refresh操作,将“索引缓冲区”的文档生成一个新的segment(段),此时新增和修改的数据能被搜索到。

  • 默认每秒执行一次refresh操作。
  • 每次refresh操作都会生成一个新的segment,随着时间的增长segment会越来越多。因为每次search操作都会扫描所有的segment,因此segment过多将导致查询效率变慢。为了避免该问题的发生,es会定期将segment进行merge合并操作。
  • 执行refresh操作时,磁盘中的translog文件不会被清除。

After a refresh, the buffer is cleared but the transaction log is not

2.3 将数据存储到磁盘

(3)通过执行flush操作(刷盘),将内存中的segment存储到磁盘,同时删除磁盘中的translog文件(已持久化到磁盘的数据对应的translog数据会被删除,尚未写入到segment 中的变更对应的translog数据不会被删除)。

  • 默认每隔30min执行一次,或者在磁盘中的translog文件过大时(index.translog.flush_threshold_size,默认512mb)执行一次。

After a flush, the segments are fully commited and the transaction log is cleared

3 refresh、merge 和 flush

3.1 refresh

3.1.1 定义

将“索引缓冲区”的文档生成一个新segment(段)并清空该“索引缓冲区”,使新增或修改后的数据能被ES的api接口查询到。

refresh_interval 控制索引refresh频率 ,默认为1s。

3.1.2 修改执行频率

可以通过修改 refresh_interval 来修改执行频率

PUT /test_index/_settings { "settings": { "refresh_interval": "2s" } }

3.1.3 api

refresh全部索引

POST /_refresh

refresh指定索引

POST /test_index/_refresh

3.2 merge

将多个小segment合并成一个大segment,并删除旧的segment。

3.3 flush

3.3.1 定义

通过执行flush操作(刷盘),将内存中的segment存储到磁盘,同时删除磁盘中的translog文件。

3.3.2 api

刷盘指定索引

POST /test_index/_flush

刷盘所有索引,且等刷盘结束才返回结果

POST /_flush?wait_for_ongoing

4 参考文献

(1)理解ES的refresh、flush、merge

(2)Making Changes Persistent | Elasticsearch: The Definitive Guide [2.x] | Elastic

(3)Translog | Elasticsearch Guide [7.10] | Elastic

http://www.jsqmd.com/news/472643/

相关文章:

  • 【OS】进程等待-就绪态分析及原语-事务对比
  • 减速电机 手指气缸 直线导轨规格尺寸图
  • 基于QT对UR3进行开发
  • 河北省雄安新区(马蹄湾村)航空高光谱遥感应用数据集下载
  • 【人工智能】少样本学习/提示(Few-shot Learning/Prompting),这种能力模仿了人类的学习方式,即我们通常不需要大量的例子来学习新事物或识别新的物体
  • 大卫三角形法(canvas)和立体图示法(echarts)实现
  • Kafka 高吞吐量的原因是什么?
  • CCV 开源项目使用教程
  • Kafka 如何调优?
  • go协程奇偶打印和交替打印ABC
  • 探索ccv:一个轻量级且功能强大的计算机视觉库
  • KCD Beijing + vLLM 2026 全议程公布:30+ 技术分享,AI × 云原生 × vLLM 一次看够
  • Kafka 如何解决消息堆积问题?
  • 腾讯AI布局:QClaw登场,元宝何去何从?
  • Android开发者必备:TooLargeTool日志分析实战教程
  • 【亲测免费】 mergerfs 项目使用教程
  • 汇智信科-飞行讲评系统
  • AI应用新趋势:中国崛起与全球市场割裂
  • 项目推荐:Stable Diffusion WebUI Colab
  • Kafka 消息堆积的原因有哪些?
  • 微软Copilot惨败,Anthropic能救场吗?
  • Logstash:强大的数据处理管道,助力日志管理与分析
  • 2024年必收藏的开发者资源:dev-resources精选工具TOP50
  • 2026年广东AI智能测试标杆厂家最新推荐:AI智能信创测试公司、AI智能测试管理公司、AI智能自动化测试公司、AI智能性能测试公司、AI智能接口测试公司广州掌动智能 - 海棠依旧大
  • AI短剧来袭:真人剧会被全面替代吗?
  • 别再乱用ScrollViewer了!WPF滚动容器与布局控件的正确搭配指南
  • 深入理解粤语编程编译器:从Python转换到LLVM执行
  • Symfony Translation终极指南:构建React+Capacitor跨平台多语言应用
  • Makefile实战:如何用5分钟搞定动态库(.so)的自动化编译与调用
  • 手把手教你用Wireshark调试Robosense激光雷达网络配置(附静态IP设置技巧)