Elasticsearch索引机制与Lucene段合并策略深度解析

news2025/6/1 7:41:22

引言

在现代分布式搜索引擎Elasticsearch中,文档的索引、更新和删除操作不仅是用户交互的核心入口,更是底层存储架构设计的关键挑战。本文围绕以下核心链路展开:

  1. 文档生命周期管理:从客户端请求路由到分片定位,从内存缓冲区(Buffer)到事务日志(Translog)的双重写入机制,揭示数据持久化的完整路径;
  2. 实时性与可靠性平衡:通过剖析Translog同步/异步刷盘策略、内存缓冲区刷新(Refresh)与持久化刷盘(Flush)的触发逻辑,解读搜索可见性与故障恢复的底层保障;
  3. Lucene段合并优化:深入对比分层合并(TieredMergePolicy)、字节大小合并(LogByteSizeMergePolicy)和文档数量合并(LogDocMergePolicy)等策略,探讨如何通过段合并提升查询效率、释放磁盘空间并优化I/O负载。

通过系统性梳理,本文将为开发者提供从API操作到底层存储的全视角技术图谱,助力高性能搜索服务的设计与调优。

索引文档的过程

索引文档:将新的文档添加到索引中或者覆盖已经存在的文档。

并非只有协调节点可能进行数据转发,可以将请求发送到任何一个数据节点,该节点都可以处理请求或将请求转发给适当的节点以完成请求处理。

  1. 客户端向 Node 1 (任意一个节点)发送新建、覆盖请求。
  2. 节点使用文档ID(文档ID可以人工指定,不指定将自动创建唯一值) 确定文档属于分片 0(hash(_id)%number_of_primary_shards) 。请求会被转发到 Node 3,因为分片 0 的主分片目前被分配在 Node 3 上。
  3. Node 3 写入操作不仅保存在内存缓冲区中,同时也被记录到事务日志(Translog)中。Translog是一个位于磁盘上的追加日志,它记录了所有对索引的更改,以确保在发生故障时能够恢复数据。
  4. 当内存缓冲区达到一定大小,或者Translog达到一定大小时。Flush操作会将内存缓冲区中的数据以及Translog中的更改持久化到磁盘上的Lucene索引文件的Segment中,并且会清空旧的Translog。

number_of_primary_shards:索引的主分片数量。

更新和删除文档的过程

  1. 客户端向任意节点发送更新、删除请求,协调节点并根据文档ID确定要更新的分片(Shard),将请求转发到分片的主节点上。
  2. 主分片会创建一个新的文档,保留相同的文档ID和一个更高的版本号。同时在段对应的.del文件中记录旧版本的文档。(更新文档)
  3. 在段对应的.del文件中记录旧版本的文档。(删除文档)
  4. 修改操作不仅保存在内存缓冲区中,同时也被记录到事务日志(Translog)中。Translog是一个位于磁盘上的追加日志,它记录了所有对索引的更改,以确保在发生故障时能够恢复数据。
  5. 当内存缓冲区达到一定大小,或者Translog达到一定大小时。Flush操作会将内存缓冲区中的数据以及Translog中的更改持久化到磁盘上的Lucene索引文件的Segment中,并且会清空旧的Translog。
  6. 废弃的文档由后台线程在段合并阶段进行删除,释放磁盘空间。

Translog刷盘(Flush)时机

Translog的刷盘:是指将Translog内存中的数据写入到Translog日志中(磁盘)。

Translog的刷盘方式有两种:同步(request)和异步(async),index.translog.durability为request表示同步(默认同步),为async表示异步。

同步方式:意味着每次写操作之后会立即将 Translog 刷新到磁盘。

异步方式:可以通过index.translog.sync_interval(默认5s),当达到配置值时触发刷盘。

Lucene中的段(Segment)

Segment是物理日志,而TransLog是逻辑日志,在Lucene中,每当有新的文档被添加时,数据首先写入内存缓冲区(buffer)。当缓冲区达到一定大小或满足特定条件时,数据会被刷新到磁盘,形成一个新的段。这个初始段的大小依赖于缓冲区的大小和写入的文档数量。多个索引的修改都会被分开写入多个段中。

Lucene中的段生成

只有生成Luence段之后,才能被搜索到。

refresh操作:index.refresh_interval(默认1s),可以适当调大例如30s。定时将内存缓冲区数据写入到新的Lucene段文件中,不会清空translog。

flush操作:当translog大小达到index.translog.flush_threshold_size(默认512m),会将translog中的数据写入到磁盘上的 Lucene 段文件中,并创建一个新的 translog 文件,并清空旧的translog。

Lucene中的段合并

段合并的好处

  1. 提高查询效率:多个小段可能导致查询时需要访问多个索引文件,使查询效率降低。合并段可以减少段的数量,从而减少查询过程中需要读取的文件,提高查询速度。
  2. 释放磁盘空间:删除文档不会立即从段中移除,而是标记为已删除。通过段合并,可以彻底清除这些标记为删除的文档,释放磁盘空间。

段合并策略

TieredMergePolicy(分层合并策略)

默认段合并策略,根据段的大小和数量将段分为不同的层级(Tiers),并在合适的时机触发段合并。

通过设置segments_per_tier参数控制每层的最大段数,每层段数超过时触发合并。通过设置max_merge_at_once参数控制一次合并的最大段数。

通过段的大小对段进行分层。具体来说,它会将段按照大小分为不同的层,每一层中的段大小范围不同。层的划分并不是固定的,而是动态调整的。

LogByteSizeMergePolicy(基于字节大小的合并策略)

基于段的字节大小来决定合并。它会尝试将小段合并成较大的段,以控制合并后的段大小。

通过设置min_merge_size参数控制段合并操作的最小段大小(小于min_merge_size优先合并)。max_merge_size参数控制段合并操作的最大段大小,当段的大小超过这个阈值时,不再参与合并。

LogDocMergePolicy(基于文档数量的合并策略)

基于段中的文档数量来决定合并。它会尝试将包含少量文档的段合并成包含更多文档的段。

通过设置min_merge_docs参数控制段合并操作的最小段的文档数量(小于min_merge_docs优先合并)。和max_merge_docs参数控制段合并操作的最大段的文档数量,当段的文档数量超过这个阈值时,不再参与合并。


感谢您的阅读!如果文章中有任何问题或不足之处,欢迎及时指出,您的反馈将帮助我不断改进与完善。期待与您共同探讨技术,共同进步!

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

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

相关文章

整合Jdk17+Spring Boot3.2+Elasticsearch9.0+mybatis3.5.12的简单用法

Elasticsearch是一个基于Lucene的分布式搜索和分析引擎,广泛应用于全文搜索、日志分析等场景。结合Spring Boot可以快速构建强大的搜索应用。本文将介绍如何在Spring Boot项目中集成和使用Elasticsearch。 ES9.0.1目前支持的包只有 elasticsearch-rest-client/ …

Ubuntu从0到1搭建监控平台:本地部署到公网访问实战教程Cpolar穿透与Docker部署全过程

文章目录 前言1.关于Ward2.Docker部署3.简单使用ward4.安装cpolar内网穿透5. 配置ward公网地址6. 配置固定公网地址总结 前言 IT运维人员是否常为服务器管理系统的复杂操作所困扰?当海量性能指标图表与密集预警信号同时涌现时,这种信息过载往往让专业团…

vscode java debug terminal 中文乱码

现象 解决 快捷键 ctrl , 进入setting 配文件添加 "terminal.integrated.automationProfile.windows": {"path": "cmd","args": ["/k","chcp","65001"]}terminal 启动时,活动也改为 utf-…

3D PDF如何制作?SOLIDWORKS MBD模板定制技巧

SOLIDWORKS制作3D PDF模版 SOLIDWORKS MBD能够帮助工程师以清晰直观的方式描述产品尺寸信息。在3D PDF文件中,用户可以自由旋转和移动视图,方便查看模型的各个尺寸细节。 本文将带您一步步学习如何使用SOLIDWORKS MBD制作专业的3D PDF模板,…

Qt DateTimeEdit(时间⽇期的微调框)

使⽤ QDateEdit 作为⽇期的微调框. 使⽤ QTimeEdit 作为时间的微调框 使⽤ QDateTimeEdit 作为时间⽇期的微调框. 这⼏个控件⽤法⾮常相似, 我们以 QDateTimeEdit 为例进⾏介绍. QDateTimeEdit 核⼼属性 属性说明dateTime时间⽇期的值. 形如 2000/1/1 0:00:00date单纯⽇期…

C# 类和继承(屏蔽基类的成员)

屏蔽基类的成员 虽然派生类不能删除它继承的任何成员,但可以用与基类成员名称相同的成员来屏蔽(mask) 基类成员。这是继承的主要功能之一,非常实用。 例如,我们要继承包含某个特殊方法的基类。该方法虽然适合声明它的…

基于vue框架的动物园饲养管理系统a7s60(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:饲养员,健康登记,工作进度,动物信息,进食信息,动物健康,动物医治,饲料信息,工作留言 开题报告内容 基于Vue框架的动物园饲养管理系统开题报告 一、研究背景与意义 (一)研究背景 随着城市化进程加快和公众对生…

WPS自动换行

换行前 换行后 快捷键 第一步:启用「自动换行」功能 选中目标单元格/区域:点击需要设置的单元格(或拖动选中多个单元格)。开启自动换行(3种方式任选): 快捷按钮:在顶部菜单栏点击「…

maven中的grpc编译插件protobuf-maven-plugin详解

protobuf-maven-plugin 是 Maven 中用于编译 Protocol Buffers(protobuf)文件并生成对应语言代码(如 Java、C、Python 等)的插件。在 gRPC 项目中,它常被用来生成服务端和客户端所需的代码。以下是该插件的详细解析&am…

服务发现Nacos

目录 Nacos server 安装 注册服务到Nacos server 接口访问Nacos server中的已注册服务 Nacos控制台介绍 Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 在分布式服务应用中,各类服务需要统一的注册、统一的管理,这个组件工具…

社群分享:义乌|杭州电商|店群卖家,私域鱼塘运营的排单系统开源|私域鱼塘运营|返款软件开源

熟悉东哥的朋友都知道,我自己也运营一个电商社群,主要是针对玩私域|鱼塘的电商玩家。 在当前电商环境下,社群分享型电商、店群卖家及私域鱼塘运营者,面临着日益复杂的订单管理和客服调度问题。传统的人工处理不仅效率低…

C#回调函数深度解析

文章目录 前言什么是回调函数C#中实现回调的方式委托(Delegate)事件(Event)Action和FuncPredicateAsyncCallback匿名方法和Lambda表达式 回调函数实际应用场景异步编程事件处理策略模式LINQ查询 回调函数的优缺点优点缺点 最佳实践与注意事项总结相关资源 前言 在现代软件开发…

通义智文开源QwenLong-L1: 迈向长上下文大推理模型的强化学习

🎉 动态 2025年5月26日: 🔥 我们正式发布🤗QwenLong-L1-32B——首个采用强化学习训练、专攻长文本推理的LRM模型。在七项长文本文档问答基准测试中,QwenLong-L1-32B性能超越OpenAI-o3-mini和Qwen3-235B-A22B等旗舰LRM&#xff0c…

低代码——表单生成器以form-generator为例

主要执行流程说明: 初始化阶段 : 接收表单配置对象formConf深拷贝配置,初始化表单数据和验证规则处理每个表单组件的默认值和特殊配置(如文件上传) 渲染阶段 : 通过render函数创建el-form根组件递归渲染表…

linux centos 服务器性能排查 vmstat、top等常用指令

背景:项目上经常出现系统运行缓慢,由于数据库服务器是linux服务器,记录下linux服务器性能排查常用指令 vmstat vmstat介绍 vmstat 命令报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。由 vmstat 命令生成的报告可以用于平衡系统负载活动。系统范围内的这…

LiveGBS国标视频平台收流模式:UDP、TCP被动与TCP主动传输模式之差异剖析

LiveGBS国标视频平台收流模式:UDP、TCP被动与TCP主动传输模式之差异剖析 1、背景2、信令传输3、视频流传输3.1、UDP传输模式3.2、TCP被动传输模式3.3、TCP主动传输模式 4、WEB配置流传输模式4.1、编辑模式4.2、下拉切换模式 5、搭建GB28181视频直播平台 1、背景 在…

Tomcat 使用与配置全解

一、 Tomcat简介 Tomcat服务器是Apache的一个开源免费的Web容器。它实现了JavaEE平台下部分技术规范,属于轻量级应用服务器。 1. Tomcat版本 Tomcat版本 JDK版本 Servlet版本 JSP版本 10.0.X 8 and later 5.0 3.0 9.0.x 8 and later 4.0 2.3 8.0.x 7…

aws instance store 的恢复

1: aws instance store 要在launch instance 才可以创建,而且,通过snapshot 恢复后,instance store 里面的数据会丢失。 下面是创建instance store 的过程,和通过两种方式恢复,发现/etc/fstab 不同的写法,有的不能启动: [root@ip-xx ~]# lsblk NAME MAJ:MIN RM …

EasyRTC音视频实时通话助力微信小程序:打造低延迟、高可靠的VoIP端到端呼叫解决方案

一、方案概述​ 在数字化通信浪潮下,端到端实时音视频能力成为刚需。依托庞大用户生态的微信小程序,是实现此类功能的优质载体。基于WebRTC的EasyRTC音视频SDK,为小程序VoIP呼叫提供轻量化解决方案,通过技术优化实现低延迟通信&a…

STM32 SPI通信(软件)

一、SPI简介 SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slav…