爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      Elasticsearch 写流程

      首页 知识中心 其他 文章详情页

      Elasticsearch 写流程

      2023-05-16 09:42:34 阅读次数:498

      elasticsearch,index,流程

      本文分析ES写入单个和批量文档写请求的处理流程,仅限于ES内部实现,并不涉及Lucene内部处理。在ES中,写入单个文档的请求称为Index请求,批量写入的请求称为Bulk请求。写单个和多个文档使用相同的处理逻辑,请求被统一封装为BulkRequest。

      1、文档操作的定义

      在ES中,对文档的操作有下面几种类型:

      enum OpType {
      	INDEX(0),
      	CREATE(1),
      	UPDATE(2),
      	DELETE(3);
      }
      
      • INDEX:向索引中“put”一个文档的操作称为“索引”一个文档。此处“索引”为动词。
      • CREATE:put 请求可以通过 op_type 参数设置操作类型为 create,在这种操作下,如果文档已存在,则请求将失败。
      • UPDATE:默认情况下,“put”一个文档时,如果文档已存在,则更新它。
      • DELETE:删除文档。

      在put API中,通过op_type参数来指定操作类型。

      2、可选参数

      Index API和Bulk API有一些可选参数,这些参数在请求的URI中指定,例如:

      PUT my-index/my-type/my-id?pipeline=my_pipeline_id
      {
      	"foo": "bar"
      }
      

      下面简单介绍各个参数的作用,这些参数在接下来的流程分析中都会遇到,如下表所示:
      Elasticsearch 写流程

      3、Index/Bulk基本流程

      新建、索引(这里的索引是动词,指写入操作,将文档添加到Lucene的过程称为索引一个文档)和删除请求都是写操作。写操作必须先在主分片执行成功后才能复制到相关的副分片。写单个文档的流程(图片来自官网)如下图所示:
      Elasticsearch 写流程

      以下是写单个文档所需的步骤:

      1. 客户端向NODE1发送写请求。
      2. NODE1使用文档ID来确定文档属于分片0,通过集群状态中的内容路由表信息获知分片0的主分片位于NODE3,因此请求被转发到NODE3上。
      3. NODE3上的主分片执行写操作。如果写入成功,则它将请求并行转发到 NODE1和NODE2的副分片上,等待返回结果。当所有的副分片都报告成功,NODE3将向协调节点报告成功,协调节点再向客户端报告成功。

      在客户端收到成功响应时,意味着写操作已经在主分片和所有副分片都执行完成。

      写一致性的默认策略是quorum,即多数的分片(其中分片副本可以是主分片或副分片)在写入操作时处于可用状态。

      quorum = int( (primary + number_of_replicas) / 2 ) + 1
      

      4、Index/Bulk详细流程

      以不同角色节点执行的任务整理流程如下图所示:
      Elasticsearch 写流程
      下面分别讨论各个节点上执行的流程。

      4.1 协调节点流程

      协调节点负责创建索引、转发请求到主分片节点、等待响应、回复客户端。
      1、 参数检查
      如同我们平常设计的任何一个对外服务的接口处理一样,收到用户请求后首先检测请求的合法性,把检查操作放在处理流程的第一步,有问题就直接拒绝,对异常请求的处理代价是最小的。

      检查操作进行以下参数检查,如下表所示:
      Elasticsearch 写流程
      每项检查遇到异常都会拒绝当前请求。

      2、 处理pipeline请求
      数据预处理(ingest)工作通过定义pipeline和processors实现。pipeline是一系列processors的定义,processors按照声明的顺序执行。

      如果Index或Bulk请求中指定了pipeline参数,则先使用相应的pipeline进行处理。如果本节点不具备预处理资格,则将请求随机转发到其他具备预处理资格的节点。

      3、 自动创建索引
      如果配置为允许自动创建索引(默认允许),则计算请求中涉及的索引,可能有多个,其中有哪些索引是不存在的,然后创建它。如果部分索引创建失败,则涉及创建失败索引的请求被标记为失败。其他索引正常执行写流程。

      创建索引请求被发送到Master节点,待收到全部创建请求的Response(无论成功还是失败的)之后,才进入下一个流程。Master节点什么时候返回Response?在Master节点执行完创建索引流程,将新的clusterState发布完毕才会返回。那什么才算发布完毕呢?默认情况下,Master发布clusterState的Request收到半数以上的节点Response,认为发
      布成功。负责写数据的节点会先执行一遍内容路由的过程以处理没有收到最新clusterState的情况。

      4、 对请求的预先处理
      这里不同于对数据的预处理,对请求的预先处理只是检查参数、自动生成id、处理routing等。

      由于上一步可能有创建索引操作,所以在此先获取最新集群状态信息。然后遍历所有请求,从集群状态中获取对应索引的元信息,检查mapping、routing、id等信息。如果id不存在,则生成一个UUID作为文档id。

      5、检测集群状态
      协调节点在开始处理时会先检测集群状态,若集群异常则取消写入。例如,Master节点不存在,会阻塞等待Master节点直至超时。

      因此索引为Red时,如果Master节点存在,则数据可以写到正常shard,Master节点不存在,协调节点会阻塞等待或取消写入。

      6、 内容路由,构建基于shard的请求
      将用户的 bulkRequest 重新组织为基于 shard 的请求列表。例如,原始用户请求可能有10个写操作,如果这些文档的主分片都属于同一个,则写请求被合并为1个。所以这里本质上是合并请求的过程。此处尚未确定主分片节点。
      基于shard的请求结构如下:

      Map<ShardId, List<BulkItemRequest>> requestsByShard = new HashMap<>();
      

      根据路由算法计算某文档属于哪个分片。遍历所有的用户请求,重新封装后添加到上述map结构。

      ShardId类的主要结构如下,shard编号是从0开始递增的序号:
      Elasticsearch 写流程

      7、 路由算法
      路由算法就是根据routing和文档id计算目标shardid的过程。
      一般情况下,路由计算方式为下面的公式:

      shard_num = hash(_routing) % num_primary_shards
      

      默认情况下,_routing值就是文档id。

      ES使用随机id和Hash算法来确保文档均匀地分配给分片。当使用自定义id或routing时, id 或 routing 值可能不够随机,造成数据倾斜,部分分片过大。在这种情况下,可以使用index.routing_partition_size 配置来减少倾斜的风险。routing_partition_size 越大,数据的分布越均匀。

      在设置了index.routing_partition_size的情况下,计算公式为:

      shard_num=(hash(_routing)+hash(_id)%routing_partition_size)%num_primary_shards
      

      也就是说,_routing字段用于计算索引中的一组分片,然后使用_id来选择该组内的分片。

      index.routing_partition_size取值应具有大于1且小于index.number_of_shards的值。

      8、 转发请求并等待响应
      遍历所有需要写的 shard,将位于某个 shard 的请求封装为BulkShardRequest 类,调用TransportShardBulkAction#execute执行发送,在listener中等待响应,每个响应也是以shard为单位的。如果某个shard的响应中部分doc写失败了,则将异常信息填充到Response中,整体请求做成功处理。

      待收到所有响应后(无论成功还是失败的),回复给客户端。

      转发前先获取最新集群状态,根据集群状态中的内容路由表找到目的shard所在的主分片,如果主分片不在本机,则转发到相应的节点,否则在本地执行。

      4.2 主分片节点流程

      执行本流程的线程池:bulk。
      主分片所在节点负责在本地写主分片,写成功后,转发写副本片请求,等待响应,回复协调节点。
      1、 检查请求
      主分片所在节点收到协调节点发来的请求后也是先做了校验工作,主要检测要写的是否是主分片,AllocationId(后续章节会介绍)是否符合预期,索引是否处于关闭状态等。
      2、 是否延迟执行
      判断请求是否需要延迟执行,如果需要延迟则放入队列,否则继续下面的流程。
      3、 判断主分片是否已经发生迁移
      如果已经发生迁移,则转发请求到迁移的节点。
      4、 检测写一致性
      在开始写之前,检测本次写操作涉及的shard,活跃shard数量是否足够,不足则不执行写入。默认为1,只要主分片可用就执行写入。
      5、 写Lucene和事务日志
      遍历请求,处理动态更新字段映射,然后调用InternalEngine#index逐条对doc进行索引。
      Engine封装了Lucene和translog的调用,对外提供读写接口。

      在写入Lucene之前,先生成Sequence Number和Version。这些都是在InternalEngine类中实现的。Sequence Number每次递增1,Version根据当前doc的最大版本加1。

      索引过程为先写Lucene,后写translog。

      因为Lucene写入时对数据有检查,写操作可能会失败。如果先写translog,写入Lucene 时失败,则还需要对translog进行回滚处理。

      6、flush translog
      根据配置的translog flush策略进行刷盘控制,定时或立即刷盘。

      7. 写副分片
      现在已经为要写的副本shard准备了一个列表,循环处理每个shard,跳过unassigned状态的shard,向目标节点发送请求,等待响应。这个过程是异步并行的。

      转发请求时会将SequenceID、PrimaryTerm、GlobalCheckPoint、version等传递给副分片。

      在等待Response的过程中,本节点发出了多少个Request,就要等待多少个Response。无论这些Response是成功的还是失败的,直到超时。

      收集到全部的Response后,执行finish()。给协调节点返回消息,告知其哪些成功、哪些失败了。

      8、处理副分片写失败情况
      主分片所在节点将发送一个shardFailed请求给Master。
      向Master发送shardFailed请求:

      sendShardAction(SHARD_FAILED_ACTION_NAME, currentState,shardEntry, listener);
      

      然后Master会更新集群状态,在新的集群状态中,这个shard将:

      • 从in_sync_allocations列表中删除;
      • 在routing_table的shard列表中将state由STARTED更改为UNASSIGNED;
      • 添加到routingNodes的unassignedShards列表。

      4.3 副分片节点流程

      执行本流程的线程池:bulk。
      执行与主分片基本相同的写doc过程,写完毕后回复主分片节点。

      在副分片的写入过程中,参数检查的实现与主分片略有不同,最终都调用 IndexShardOperationPermits#acquire判断是否需要delay,继续后面的写流程。

      5、I/O异常处理

      在一个shard上执行的一些操作可能会产生I/O异常之类的情况。一个shard上的CRUD等操作在ES里由一个Engine对象封装,在Engine处理过程中,部分操作产生的部分异常ES会认为有必要关闭此Engine,上报Master。例如,系统I/O层面的写入失败,这可能意味着磁盘损坏。

      对Engine异常的捕获目前主要通过IOException实现。例如,索引文档过程中的异常处理:
      Elasticsearch 写流程
      Engine类中的maybeFailEngine()负责检查是否应当关闭引擎failEngine()。

      可能会触发maybeFailEngine()的操作如下表所示:
      Elasticsearch 写流程

      5.1 Engine关闭过程

      将Lucene标记为异常,关闭shard,然后汇报给Master。

      5.2 Master的对应处理

      收到节点的SHARD_FAILED_ACTION_NAME消息后,Master通过reroute将失败的shard通过reroute迁移到新的节点,并更新集群状态。

      5.3 异常流程总结

      1. 如果请求在协调节点的路由阶段失败,则会等待集群状态更新,拿到更新后,进行重试,如果再次失败,则仍旧等集群状态更新,直到超时1分钟为止。超时后仍失败则进行整体请求失败处理。
      2. 在主分片写入过程中,写入是阻塞的。只有写入成功,才会发起写副本请求。如果主shard写失败,则整个请求被认为处理失败。如果有部分副本写失败,则整个请求被认为处理成功。
      3. 无论主分片还是副分片,当写一个doc失败时,集群不会重试,而是关闭本地shard,然后向Master汇报,删除是以shard为单位的。

      6、系统特性

      ES本身也是一个分布式存储系统,如同其他分布式系统一样,我们经常关注的一些特性如下。

      • 数据可靠性:通过分片副本和事务日志机制保障数据安全。
      • 服务可用性:在可用性和一致性的取舍方面,默认情况下 ES 更倾向于可用性,只要主分片可用即可执行写入操作。
      • 一致性:笔者认为是弱一致性。只要主分片写成功,数据就可能被读取。因此读取操作在主分片和副分片上可能会得到不同结果。
      • 原子性:索引的读写、别名更新是原子操作,不会出现中间状态。但bulk不是原子操作,不能用来实现事务。
      • 扩展性:主副分片都可以承担读请求,分担系统负载。

      7、思考

      分析完写入流程后,也许读者已经意识到了这个过程的一些缺点:

      • 副分片写入过程需要重新生成索引,不能单纯复制数据,浪费计算能力,影响入库速度。
      • 磁盘管理能力较差,对坏盘检查和容忍性比HDFS差不少。例如,在配置多磁盘路径的情况下,有一块坏盘就无法启动节点。
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://jiankunking.blog.csdn.net/article/details/89172081,作者:衣舞晨风,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:【docker专栏4】使用docker安装nginx提供web服务

      下一篇:Elasticsearch GET 流程

      相关文章

      2025-05-14 10:33:25

      webpack5基础--09_处理其他资源

      webpack5基础--09_处理其他资源

      2025-05-14 10:33:25
      html , index , 图标 , 处理 , 资源 , 音视频
      2025-05-14 10:03:13

      【MySQL】-数据库优化(索引)

      索引(index)是帮助数据库高效获取数据的数据结构

      2025-05-14 10:03:13
      index , Tree , 二叉 , 搜索 , 数据 , 索引 , 节点
      2025-05-09 08:20:32

      Maven之介绍

      Maven 是一个 Java 项目管理和构建工具。它可以定义项目结构、项目依赖,并使用统一的方式进行自动化构建,是Java项目不可缺少的工具。

      2025-05-09 08:20:32
      jar , Maven , 一个 , 文件夹 , 标准化 , 流程 , 项目
      2025-05-08 09:03:07

      【题目/训练】约瑟夫环的一系列方法

      【题目/训练】约瑟夫环的一系列方法

      2025-05-08 09:03:07
      index , 下标 , 个数
      2025-04-15 09:19:26

      awk实践_逻辑控制_流程控制

      awk实践_逻辑控制_流程控制

      2025-04-15 09:19:26
      基础知识 , 实践 , 控制 , 流程
      2025-03-28 07:42:34

      Taro+VantUI请求拦截处理

      Taro+VantUI请求拦截处理

      2025-03-28 07:42:34
      config , index , 代码 , 备注 , 拦截
      2025-03-26 09:09:00

      webpack5基础--05_处理图片类型的资源

      webpack5基础--05_处理图片类型的资源

      2025-03-26 09:09:00
      images , index , loader , 图片 , 资源
      2025-03-24 08:53:22

      C++归并排序算法的应用:315计算右侧小于当前元素的个数

      C++归并排序算法的应用:315计算右侧小于当前元素的个数

      2025-03-24 08:53:22
      index , int , left , nums , right , vector
      2025-03-24 08:53:15

      【漏洞复现】CVE-2015-5531 Arbitrary File Reading

      【漏洞复现】CVE-2015-5531 Arbitrary File Reading

      2025-03-24 08:53:15
      CVE , elasticsearch , https
      2025-03-21 09:33:42

      【Python】超简单的华容道小游戏制作+保姆级讲解(附源码)

      【Python】超简单的华容道小游戏制作+保姆级讲解(附源码)

      2025-03-21 09:33:42
      array , index , 函数 , 游戏
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5239010

      查看更多

      最新文章

      Maven之介绍

      2025-05-09 08:20:32

      【题目/训练】约瑟夫环的一系列方法

      2025-05-08 09:03:07

      webpack5基础--05_处理图片类型的资源

      2025-03-26 09:09:00

      【漏洞复现】CVE-2015-5531 Arbitrary File Reading

      2025-03-24 08:53:15

      不懂Express?你的Node.js之旅少了点啥

      2025-02-21 08:55:32

      优化企业员工管理的利器——ADManager Plus

      2024-12-23 09:17:24

      查看更多

      热门文章

      Salesforce 批准过程

      2023-04-18 14:14:13

      elasticsearch报错:exceeds the [index.highlight.max_analyzed_offset] limit [1000000]

      2023-04-11 10:15:33

      Elasticsearch GET 流程

      2023-05-16 09:42:51

      postgres elasticsearch fdw 学习

      2024-09-25 10:14:34

      Elasticsearch聚合的嵌套桶如何排序

      2023-05-15 10:02:23

      cube.js 支持 elasticsearch

      2023-04-07 06:40:34

      查看更多

      热门标签

      linux java python javascript 数组 前端 docker Linux vue 函数 shell git 节点 容器 示例
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      通过Openresty拦截Cerebro界面的危险操作

      elasticsearch中创建索引模板_index_template

      Yarn命令使用及wordcount解析

      elasticsearch集群分片副本不上线

      Elasticsearch简介

      Elasticsearch多文档操作

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号