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

深度剖析Elasticsearch数据写入与读取:从分片同步到核心组件协同

Elasticsearch(ES)作为分布式搜索引擎,其高吞吐、近实时的特性,源于数据写入与读取流程的精妙设计——从客户端请求发起,到Master节点的管控、主从分片的协同,再到translog与OS Cache的底层支撑,每个环节都决定着性能与可靠性。本文将全程拆解数据写入/读取的核心流程,厘清各组件的角色分工,帮你彻底掌握ES数据流转的底层逻辑。

一、数据写入流程:从请求到持久化的完整链路

ES的数据写入是“先保障可靠性,再追求性能”的过程,核心遵循“路由→校验→写入主分片→同步副本→持久化”的步骤。Master节点仅负责管控,不参与具体数据处理,主分片(Primary Shard)是写入的核心载体,副本分片(Replica Shard)则保障高可用。

 第一步:请求路由——确定数据归属的主分片

客户端发送写入请求(如PUT /index/_doc/1)后,首先需要明确“数据该写入哪个Primary Shard”,这一过程由“路由算法”完成,无需Master节点参与(减少中心节点压力):

  • 路由算法:ES通过hash(路由字段) % 主分片数计算分片编号,默认路由字段是文档ID(_id),也可通过routing参数指定(如按用户ID路由,确保同一用户数据落在同一分片)。

  • 分片定位:客户端从本地缓存的“集群状态”中,查询目标主分片的分配节点(如Primary Shard 0分配在Node1),直接将请求发送到该节点,避免Master转发的性能损耗。

 第二步:Master节点校验——保障集群规则合规

主分片所在节点(Node1)收到请求后,不会立即写入,而是先向Master节点发起“前置校验”,确保写入操作符合集群规则:

  • 索引状态校验:索引是否处于“打开”状态(关闭状态无法写入);

  • 分片状态校验:当前Primary Shard是否处于started状态(如分片正在恢复则拒绝写入);

  • 权限校验:客户端是否有该索引的写入权限(如通过ES的RBAC权限控制)。校验通过后,Master节点返回“允许写入”的响应,Node1开始执行具体写入操作;若校验失败(如索引关闭),则直接返回错误。

第三步:写入Primary Shard——translog与OS Cache的协同

这是数据写入的核心步骤,ES通过“先写日志,再写缓存”的方式,在保障数据不丢失的同时提升性能,核心依赖translog(事务日志)和OS Cache(操作系统页缓存)两个组件:

  • 写入translog(保障可靠性):数据首先被写入translog(物理文件,默认存储在path.data目录),且采用“追加写”方式(性能高)。translog是ES数据持久化的核心——即使节点宕机,重启后可通过translog恢复未持久化的数据,避免丢失。

  • 写入OS Cache(提升性能):数据写入translog后,会被加载到内存中的OS Cache,此时数据处于“内存缓存”状态,未真正写入磁盘的索引文件(Lucene Segment)。这一步是ES“近实时”特性的关键——内存写入比磁盘写入快100-1000倍,大幅提升写入吞吐量。

此时,数据已完成“可靠性保障”(translog持久化)和“性能优化”(OS Cache缓存),但尚未进入可搜索状态。

第四步:Refresh——数据从缓存到可搜索

ES默认每1秒执行一次Refresh操作(可通过index.refresh_interval配置,如设为-1禁用自动刷新),将OS Cache中的数据刷入Lucene的“内存段(In-Memory Segment)”,并生成倒排索引:

  • 核心作用:使数据从“不可搜索”变为“可搜索”——这就是ES“近实时”的原因(写入后约1秒可查询到)。

  • 性能特点:Refresh仅操作内存,不涉及磁盘I/O(内存段后续会异步刷盘),因此性能开销小,可高频执行。

第五步:同步Replica Shard——保障高可用

Primary Shard完成写入和Refresh后,会异步将数据同步到该分片的所有Replica Shard(分配在其他节点,如Node2),同步流程与Primary写入完全一致(先写translog,再写OS Cache,最后Refresh):

  • 同步触发:Primary Shard主动向所有Replica Shard发送数据同步请求,携带文档数据和translog记录。

  • 一致性控制:客户端可通过wait_for_active_shards参数控制“同步等待策略”,如设为2表示需等待Primary和至少1个Replica同步完成后再返回成功(默认1,仅等待Primary写入完成),平衡可靠性与写入速度。

  • 异常处理:若Replica Shard不可用(如节点宕机),Primary会记录同步日志,待Replica恢复后自动补发数据;Master节点会监测到Replica异常,触发分片重新分配(如将Replica迁移到Node3)。

第六步:Flush——数据最终持久化到磁盘

Refresh仅将数据刷入内存段,未写入磁盘,长期依赖OS Cache存在掉电丢失风险。ES通过Flush操作将数据最终持久化到磁盘,核心流程如下:

  • 内存段刷盘:将OS Cache中的内存段强制刷入磁盘,生成Lucene的持久化Segment文件。

  • translog清理:刷盘完成后,将已持久化的数据对应的translog记录删除(避免日志文件过大),仅保留未刷盘的增量数据。

Flush默认由ES自动触发(如translog大小达到512MB,或30分钟未触发),也可通过API手动触发(POST /index/_flush),但手动触发会阻塞写入,需谨慎使用。

二、数据读取流程:从查询到返回的分片协同

ES的数据读取是“分布式协同”的过程,核心遵循“查询(Query)→获取(Fetch)”两阶段流程,Primary和Replica Shard共同参与,Master节点仅负责提供分片位置信息,不参与数据查询。

第一步:查询阶段——收集候选结果的分片广播

客户端发送查询请求(如GET /index/_search?q=title:elasticsearch)后,首先进入查询阶段,目标是“从所有分片获取符合条件的文档ID和排序信息”:

  • 协调节点确定:接收请求的节点成为“协调节点”(Coordinating Node),可是任意节点(包括Master),其核心作用是分发请求和聚合结果。

  • 分片请求分发:协调节点从Master节点获取“索引的分片分配信息”,向每个Primary Shard及其Replica Shard发送查询请求(采用轮询策略选择Primary/Replica,实现负载均衡)。

  • 分片本地查询:每个分片在本地执行查询,通过Lucene的倒排索引快速匹配符合条件的文档,仅返回“文档ID、排序字段(如_score)”等轻量信息(减少数据传输量),并按排序字段排序后返回给协调节点。

第二步:获取阶段——拉取完整数据并返回

查询阶段仅获取了候选文档的“标识信息”,获取阶段则需拉取完整文档数据并返回给客户端:

  • 结果聚合与去重:协调节点收集所有分片的候选结果,按排序字段重新排序,截取符合from/size条件的文档(如分页查询的第1-10条),并去重(避免同一文档在Primary和Replica中重复返回)。

  • 完整数据拉取:协调节点向“存储目标文档的分片”(Primary或Replica)发送“获取请求”,拉取文档的完整字段数据(如title、content)。

  • 结果封装返回:协调节点将完整数据封装为JSON格式,返回给客户端。

 读取的一致性控制

ES支持通过参数控制读取的一致性和实时性,核心参数如下:

  • preference:控制查询的分片选择,如设为primary表示仅查询Primary Shard(保证数据最新),设为local表示优先查询本地节点的分片(减少网络延迟)。

  • realtime:默认true,表示查询时会检查OS Cache中未Refresh的数据(确保最新写入的数据可查询),设为false则仅查询已Refresh的Segment(提升查询性能,牺牲实时性)。

三、核心组件解析:translog与OS Cache的关键作用

数据写入/读取的性能与可靠性,完全依赖translog和OS Cache的协同工作——translog保障“数据不丢”,OS Cache保障“读写快速”,二者是ES底层架构的核心。

1. translog:ES的“事务日志”

translog是ES数据持久化的“最后一道防线”,本质是一个顺序写入的日志文件,核心作用和特性如下:

  • 故障恢复:节点宕机后,重启时会先回放translog中的记录,将未刷盘的数据恢复到OS Cache,确保数据不丢失。

  • 刷盘策略:translog默认每5秒刷盘一次(可通过index.translog.sync_interval配置),也可通过index.translog.durability控制刷盘时机: request(默认):每次写入请求完成后强制刷盘,最可靠但性能最低;

  • async:按sync_interval异步刷盘,性能更高但存在秒级数据丢失风险(适合非核心业务)。

滚动策略:当translog大小达到index.translog.flush_threshold_size(默认512MB)或超过保留时间(默认12小时),会触发Flush并生成新的translog文件,旧文件在确认数据刷盘后删除。

2. OS Cache:ES的“性能加速器”

OS Cache是操作系统提供的内存缓存,ES将Lucene的Segment文件加载到OS Cache中,实现“内存级读写”,核心作用如下:

  • 写入加速:数据先写入OS Cache,避免直接磁盘I/O(磁盘I/O速度约10ms/次,内存约100ns/次),提升写入吞吐量。

  • 读取加速:查询时优先从OS Cache读取Segment数据,若缓存命中则无需访问磁盘,查询延迟可降低至毫秒级。

  • 内存管理:OS Cache的大小由操作系统控制,ES可通过indices.fielddata.cache.size控制“字段数据缓存”的占比,避免OS Cache被其他进程抢占。

需要注意的是,OS Cache是“内存缓存”,节点宕机后数据会丢失,因此必须依赖translog实现数据持久化——二者是“性能与可靠性”的互补关系。

四、实战优化:基于写入/读取流程的调优建议

理解底层流程后,可针对性优化写入/读取性能,核心思路是“平衡可靠性与性能”,结合业务场景调整配置:

写入优化:提升吞吐量

  • 批量写入:使用_bulkAPI批量提交写入请求(如一次提交1000条),减少网络往返和请求开销,吞吐量可提升10-100倍。

  • 调整Refresh间隔:非实时查询场景(如日志存储),可将index.refresh_interval设为30s或-1(禁用自动刷新),减少Refresh频率,提升写入性能(需手动触发Refresh确保数据可查)。

  • 合理配置translog:非核心业务可将index.translog.durability设为async,异步刷盘提升写入速度。

读取优化:降低延迟、提升吞吐量

  • 增加Replica数量:读多写少场景(如电商商品搜索),可将number_of_replicas设为2-3,通过Replica分担读取压力,提升吞吐量。

  • 查询字段过滤:使用_source参数指定需要返回的字段(如_source=title,price),避免返回大字段(如content),减少数据传输量。

  • 禁用实时查询:非实时场景(如离线分析),查询时指定realtime=false,仅查询已Refresh的Segment,提升查询性能。

五、总结:ES数据流转的核心启示

ES数据写入与读取的流程,本质是“分布式协同”与“性能可靠性平衡”的体现

  • Master节点的定位:仅负责管控(校验、分片分配),不参与具体数据处理,确保集群扩展时无中心瓶颈。

  • 主从分片的协同:Primary负责写入,Replica负责备份与读负载,异步同步机制平衡了写入速度与高可用。

  • 核心组件的价值:translog保障“数据不丢”,OS Cache保障“读写快速”,二者的协同是ES近实时、高吞吐特性的核心支撑。

http://www.dtcms.com/a/618002.html

相关文章:

  • 网站图片添加alt标签做下载类网站赚钱吗
  • WebStrom 打开Uniapp API 的语法提示
  • 使用ADO将excel表内容加载到mssql表中的长度问题
  • 5G技术:引领智能时代的通信革命
  • 5G技术与人工智能:重塑工业互联网的未来
  • 设计模式实战篇(六):装饰器模式 —— 让系统具备“可生长能力”的架构思想
  • 专业信息门户网站定制注册网站是哪个部门
  • 企业没有网站怎么对外做公示个人网站建设月租抵30元
  • Android应用中使用Kotlin集成OkHttp库:从基础使用到深层原理解析
  • Kafka客户端参数(一)
  • 用 Rust 从零开发一个隐写工具
  • 建设营销型网站的优势顺的品牌网站建设
  • 团雾、结冰、大风——高速公路的“隐形杀手”:智慧气象预警如何为您的路网安全保驾护航
  • PC 端常用 UI 组件库
  • 工业制品网站建设建程网是干嘛的
  • CS144 知识笔记二
  • 化妆品网站源码asp个人网站做淘宝客商城
  • 实战:使用 Python(Requests/Scrapy)接入京东商品详情 API 并解析数据结构
  • python学生成绩登记系统软件测试报告
  • GitHub Actions 和 GitLab CI/CD
  • 【Linux日新月异(七)】CentOS 7磁盘资源管理深度指南:从分区到性能调优
  • 企业网站pv是什么佛山推广优化公司
  • 机器学习常见问题之numpy维度问题
  • Redis 原理与实验
  • 网站开发职责与要求软件开发专业好吗
  • 【Linux驱动开发】Linux 设备驱动中的总线机制
  • 电压基准芯片详解:从原理到选型,附 TLV431 应用解析
  • 住房和城乡建设部网站监理工程师网站发送邮件功能
  • 开发第一个python程序
  • obet(Oracle Block Editor Tool)第二版发布