Elasticsearch 读写流程深度解析

news2025/7/22 16:39:19

在数据驱动的数字化浪潮中,Elasticsearch 凭借其毫秒级搜索响应与水平扩展能力,已成为现代数据架构的核心引擎。本文将深入剖析其读写流程的设计思想、实现细节与工程权衡,揭示这一分布式系统的精妙架构。


一、 架构基石:分布式设计的精妙平衡

1.1 分片(Shard)机制:数据水平扩展的核心
  • 分片本质:每个索引被拆分为多个独立的分片(默认 5 个),每个分片是一个完整的 Lucene 索引实例
  • 路由算法:文档通过 shard = hash(_routing) % number_of_primary_shards 定位目标分片
  • 动态扩容:通过 Split API 可对分片二次拆分,实现存储容量倍增
1.2 副本(Replica)设计:高可用的双重保障
  • 数据冗余:每个主分片可配置多个副本(默认 1 个),物理存储在不同节点
  • 读写分离:副本分片可处理读请求,提升系统吞吐量(通过 preference 参数控制)
  • 故障转移:主分片异常时,Master 节点自动触发副本晋升(Raft 协议选举)
1.3 节点角色:去中心化的协作网络
节点类型核心职责资源隔离建议
Master Node集群状态管理/分片分配低CPU/中内存
Data Node存储数据/执行读写操作高CPU/高内存/高IO
Coordinating Node请求路由/结果聚合中CPU/高网络带宽
Ingest Node数据预处理(Pipeline 执行)中CPU/中内存

设计权衡:通过角色分离避免单点瓶颈,但增加运维复杂度(需专用 Master 节点防脑裂)


二、 写入流程:可靠性与实时性的精密协作

2.1 数据写入流程图

在这里插入图片描述

2.2 底层存储引擎运作
  1. Translog 的可靠性设计

    • 追加写入:所有写操作立即追加到 translog(文件系统缓存)
    • 刷盘策略:每 5 秒执行 fsync(可配置 index.translog.durabilityrequest 强同步)
    • 分段滚动:translog 超过 512MB 时生成新文件(index.translog.generation
  2. Refresh:可搜索性的关键

    • 内存刷新:默认每 1 秒将 In-memory Buffer 转为 Lucene Segment
    • 实时性代价:高频 Refresh 增加 I/O 压力(可通过 index.refresh_interval 调整)
    • Segment 特性:不可修改(删除标记 .del 文件),只追加合并
  3. Flush:持久化与清理

    • 触发条件:Translog 大小超限(默认 512MB)或 30 分钟超时
    • 原子操作
      1. 调用 fsync 确保所有 Segment 落盘
      2. 清空 Translog(生成新空文件)
      3. 清空 Memory Buffer
  4. 段合并(Segment Merge)优化

    • 策略选择:TieredMergePolicy 分层合并(小段→中段→大段)
    • I/O 控制MergeScheduler 动态调节并发度(避免磁盘过载)
    • 优化效果:减少文件句柄数,提升查询性能

三、 读取流程:分布式查询的协同艺术

3.1 查询请求全链路解析

在这里插入图片描述

3.2 关键阶段技术细节
  1. Query 阶段(Scatter)

    • 分片选择:协调节点基于路由信息定位主/副本分片(负载均衡)
    • 本地搜索:各分片在 Lucene 倒排索引中检索(使用 SkipList 跳表加速)
    • 结果压缩:仅返回 DocID、Score、Sort Values(减少网络传输)
  2. Fetch 阶段(Gather)

    • 文档拉取:协调节点按排序结果向对应分片获取完整文档
    • 高亮处理:在数据节点重新运行查询生成高亮片段
    • 分页优化:通过 search_after 避免深度翻页性能劣化
3.3 性能加速机制
  1. 缓存体系

    缓存类型存储内容失效条件
    Query CacheFilter 上下文结果Segment 变更
    Request Cache聚合结果(hits=0 时)索引数据更新
    Fielddata Cache文本字段分词结果内存压力/LRU 淘汰
  2. 预加载优化

    • 文件系统缓存:Lucene 依赖 OS Page Cache 加速磁盘读取
    • 预热脚本:通过 index.store.preload 预载热点索引文件

四、 容错与一致性:分布式场景下的工程智慧

4.1 写入一致性模型
  • 配置策略:通过 wait_for_active_shards 控制最小成功副本数
    • all:所有副本确认(强一致,延迟高)
    • quorum:多数副本确认(推荐平衡点)
    • 1:仅主分片确认(弱一致,延迟低)
4.2 故障恢复流程
  1. 分片重分配:Master 检测到节点离线,启动副本提升
  2. 数据同步:新主分片从 Translog 恢复未刷盘数据
  3. 分段修复:通过 Checksum 校验 Segment 完整性

工程挑战:脑裂场景下的数据冲突通过版本号(_version)解决(乐观锁)


五、 深度优化:生产环境的最佳实践

5.1 写入性能调优
  • Bulk 批处理:单批次 5-15MB 数据(避免堆内存压力)
  • 线程池配置:调整 write 队列大小(thread_pool.write.queue_size
  • 磁盘隔离:SSD 部署热数据,SATA 存冷数据(Tiered Storage)
5.2 查询效率提升
  • 索引设计
    {
      "settings": {
        "number_of_routing_shards": 32,  // 为未来扩容预留
        "refresh_interval": "30s"       // 降低实时性要求场景
      },
      "mappings": {
        "properties": {
          "timestamp": { "type": "date", "doc_values": true } // 启用列存加速聚合
        }
      }
    }
    
  • 查询重构
    • 用 Filter 替代 Bool Query 的 Must 子句(利用缓存)
    • 避免通配符查询(wildcard),改用 N-gram 分词

结语:分布式系统的设计哲学

Elasticsearch 的卓越性能源于对三大矛盾的巧妙平衡:

  1. 实时 vs 吞吐:Translog 持久化与 Refresh 机制的协作
  2. 扩展性 vs 一致性:分片化存储与可调一致性模型
  3. 灵活性 vs 效率:DSL 的丰富表达能力与倒排索引/列存优化

其核心启示在于:所有分布式系统都是妥协的艺术。Elasticsearch 通过分层设计(Translog/Lucene Segment)、异步协作(副本复制)、智能调度(合并策略/缓存)等机制,在工程复杂度与性能之间找到了黄金平衡点。理解这些设计思想,不仅有助于优化 Elasticsearch 使用,更为构建任何大规模分布式系统提供了宝贵范式。

参考文档:https://cloud.tencent.com/developer/article/2398626

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

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

相关文章

AIoT赋能场馆数字化转型:智能管理新生态

在数字化浪潮席卷全球的当下,传统场馆管理模式已难以满足日益增长的高效运营与精细化服务需求。智慧场馆建设成为行业发展的必然趋势,而AIoT(人工智能物联网)技术的深度应用,为多系统集成提供了全新的解决方案&#xf…

1、Pytorch介绍与安装

1、Pytorch介绍 PyTorch 是由 Facebook AI Research (FAIR) 团队开发并维护的一款开源深度学习框架,于 2016 年首次发布。它因其直观的设计、卓越的灵活性以及强大的动态计算图功能,迅速在学术界和工业界获得了广泛认可,成为当前深度学习研究…

【从零开始学习QT】Qt 概述

目录 一、什么是 Qt 1.1 简介 1.2 Qt 的发展史 1.3 Qt 支持的平台 1.5 Qt 的优点 1.6 Qt 的应用场景 二、搭建 Qt 开发环境 2.1 Qt SDK 的下载 2.2 Qt SDK 的安装 2.3 验证 Qt SDK 安装是否成功 2.4 Qt 环境变量配置 三、认识 Qt Creator 3.1 Qt Creator 概览 3.…

家庭路由器改装,搭建openwrt旁路由以及手机存储服务器,实现外网节点转发、内网穿透、远程存储、接入满血DeepSeek方案

大家好,也是好久没有发文了,最近在捣鼓一些比较有趣的东西,打算跟大家分享一下! 先聊一下我的大致方案嘛,最近感觉家里路由器平时一直就只有无线广播供网的功能,感觉这么好的一下嵌入式设备产品不应该就干这…

基于本地模型+多级校验设计的高效缓存,有效节省token数量(有点鸡肋doge)。

前言 我是基于token有限而考虑的一个省钱方案,还能够快速返回结果,但是劣势也很明显,设计不好容易出问题,就如下面所介绍的语义飘逸和缓存污染,我认为在自己学习大模型的过程用来省钱非常可以,再加上学习过…

逐步检索增强推理的跨知识库路由学习

摘要 多模态检索增强生成(MRAG)在多模态大语言模型(MLLM)中通过在生成过程中结合外部知识来减轻幻觉的发生,已经显示出了良好的前景。现有的MRAG方法通常采用静态检索流水线,该流水线从多个知识库&#xff…

【数据库】关系数据库标准语言-SQL(金仓)下

4、数据查询 语法&#xff1a; SELECT [ALL | DISTINCT] <目标列表达式> [,<目标列表达式>] … FROM <表名或视图名>[, <表名或视图名> ] … [ WHERE <条件表达式> ] [ GROUP BY <列名1> [ HAVING <条件表达式> ] ] [ ORDER BY <…

Vue3+SpringBoot全栈开发:从零实现增删改查与分页功能

前言 在现代化Web应用开发中&#xff0c;前后端分离架构已成为主流。本文将详细介绍如何使用Vue3作为前端框架&#xff0c;SpringBoot作为后端框架&#xff0c;实现一套完整的增删改查(CRUD)功能&#xff0c;包含分页查询、条件筛选等企业级特性。 技术栈介绍 前端&#xff1…

小黑大语言模型应用探索:langchain智能体构造源码demo搭建1(初步流程)

导入工具包 rom langchain_core.tools import BaseTool from typing import Sequence, Optional, List from langchain_core.prompts import BasePromptTemplate import re from langchain_core.tools import tool from langchain_core.prompts.chat import (ChatPromptTempla…

极客时间:用 FAISS、LangChain 和 Google Colab 模拟 LLM 的短期与长期记忆

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

leetcode hot100刷题日记——35.子集

解答&#xff1a; 方法一&#xff1a;选or不选的dfs&#xff08;输入视角&#xff09; 思路&#xff1a;[1,2,3]的全部子集可以看成是对数组的每一位数字做选择。 eg.空集就是一个数字都不选&#xff0c;[1,2]就是1&#xff0c;2选&#xff0c;3不选。 class Solution { pub…

MybatisPlus(含自定义SQL、@RequiredArgsConstructor、静态工具类Db)

大家在日常开发中应该能发现&#xff0c;单表的CRUD功能代码重复度很高&#xff0c;也没有什么难度。而这部分代码量往往比较大&#xff0c;开发起来比较费时。 因此&#xff0c;目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…

手眼标定:九点标定、十二点标定、OpenCV 手眼标定

因为一直使用6轴协作机器人&#xff0c;且主要应用是三维视觉&#xff0c;平常的手眼标定基本都是基于OpenCV来计算的&#xff0c;听说有九点标定和十二点标定&#xff0c;顺便了解下。 目录 1.九点标定1.1 基本原理1.2 关于最小二乘法1.3 具体示例 2.十二点标定3.OpenCV 手眼标…

[总结]前端性能指标分析、性能监控与分析、Lighthouse性能评分分析

前端性能分析大全 前端性能优化 LightHouse性能评分 性能指标监控分析 浏览器加载资源的全过程性能指标分析 性能指标 在实现性能监控前&#xff0c;先了解Web Vitals涉及的常见的性能指标 Web Vitals 是由 Google 推出的网页用户体验衡量指标体系&#xff0c;旨在帮助开发者量…

React-native的新架构

本文总结: 文章主要介绍了 React Native 的新架构&#xff0c;包括以下几个方面的内容&#xff1a;&#x1f4f1;✨ 如何抹平 iOS 和 Android 样式差异&#xff0c;提升跨平台一致性&#xff1b; 分析了旧架构中存在的问题&#xff0c;如通信瓶颈、启动慢、维护复杂等&#x…

Git 全平台安装指南:从 Linux 到 Windows 的详细教程

目录 一、Git 简介 二、Linux 系统安装指南 1、CentOS/RHEL 系统安装 2、Ubuntu/Debian 系统安装 3、Windows 系统安装 四、安装后配置&#xff08;后面会详细讲解&#xff0c;现在了解即可&#xff09; 五、视频教程参考 一、Git 简介 Git 是一个开源的分布式版本控制系…

Tree 树形组件封装

整体思路 数据结构设计 使用递归的数据结构&#xff08;TreeNode&#xff09;表示树形数据每个节点包含id、name、可选的children数组和selected状态 状态管理 使用useState在组件内部维护树状态的副本通过deepCopyTreeData函数进行深拷贝&#xff0c;避免直接修改原始数据 核…

AI书签管理工具开发全记录(五):后端服务搭建与API实现

文章目录 AI书签管理工具开发全记录&#xff08;四&#xff09;&#xff1a;后端服务搭建与API实现前言 &#x1f4dd;1. 后端框架选型 &#x1f6e0;️2. 项目结构优化 &#x1f4c1;3. API路由设计 &#x1f9ed;分类管理书签管理 4. 数据模型定义 &#x1f4be;分类模型&…

netTAP 100:在机器人技术中将 POWERLINK 转换为 EtherNet/IP

工业机器人服务专家 年轻的 More Robots 公司成立仅一年多&#xff0c;但其在许多应用领域的专业技术已受到广泛欢迎。这是因为More Robots提供 360 度全方位服务&#xff0c;包括从高品质工业机器人和协作机器人到咨询和培训。这包括推荐适合特定任务或应用的机器人&#xff0…

多模态大语言模型arxiv论文略读(九十八)

Accelerating Pre-training of Multimodal LLMs via Chain-of-Sight ➡️ 论文标题&#xff1a;Accelerating Pre-training of Multimodal LLMs via Chain-of-Sight ➡️ 论文作者&#xff1a;Ziyuan Huang, Kaixiang Ji, Biao Gong, Zhiwu Qing, Qinglong Zhang, Kecheng Zhe…