「干货」图解 Elasticsearch 写入流程【图文】_zhenghhgz_51CTO博客

请访问原文

整体上看,Client 向 ES 发送写请求,es 接收数据,写入磁盘文件,返回响应给 Client 写入成功,这样就完成了。

然后拉近看一下,看看内部都做了什么工作。

2. ES 整体结构

ES 集群里面有多个 Server 节点,一个 ES Index 有多个 shard 分片,每个 shard 有多个副本。

其中有一个 primary 主副本,负责写入,其他副本为 replica,不能写,只能同步 primary 的数据,但可以处理读请求。

ES 收到写请求后,会将请求路由到目标 shard 的 primary 副本。

每一个 shard 就是一个 Lucene Index,包含多个 segment 文件,和一个 commit point 文件。

segment 文件存储的就是一个个的 Document,commit point 记录着都有哪些 segment 文件。

了解了 ES 的整体结构,可知 primary shard 收到写请求,就是把 Document 数据写入 segment。

3. 直接写 Segment 效率低怎么办?
如果每次写操作都是直接落盘的话,I/O 效率会比较低。

所以,ES 使用了一个内存缓冲区 Buffer,先把要写入的数据放进 buffer。

内存性能好,但不安全,会丢数据,所以 es 使用了一个日志文件 Translog。就像 MySQL 的 Binlog,记录着每一条操作日志,如果 ES 出现故障,重启之后可以从 Translog 中恢复数据。

因为日志文件只是单纯的做内容追加,没有其他逻辑操作,所以写入速度很快。

并不是每条操作直接写入磁盘,也是有一个内存缓冲,每隔5秒写入磁盘。所以,极端情况下会有5秒数据的丢失,如果要严格保证数据安全,可以调整这个时间。

这样,数据来到 primary shard 之后,先是进入 buffer,并把操作记录写入 Translog。

4. Buffer 中数据怎么写入 Segment 文件?

ES 每隔一秒执行一次 refresh 操作,会创建一个 Segment 文件,将 buffer 中的数据写入这个 segment,并清空 buffer。

进入 segment 的数据就进入了 Lucene,建立好了倒排索引,可以被搜索到。

5. 如何进一步提升写 Segment 效率?

需要注意,ES 虽然把数据写入了 segment 文件,但实际上还没有真正落盘,因为操作系统的文件系统也是有缓存的,这是操作系统层面的性能优化,由操作系统决定物理落盘时间,除非程序写文件时使用同步写 fsync。

ES 为了性能自然没有使用 fsync,因为有 Translog 记录了所有操作步骤。

虽然可能还没实际写入 segment 物理文件,但只要进入了操作系统的文件系统,就可以被搜索了,这一点不用担心。

6. Translog 日志文件越来越大怎么办?

随着写入数据的增加,Translog 也越来越大,需要清理。

触发清理动作需要2个条件:

大小触发设定的阈值

30分钟

任意条件满足即触发一次 commit 提交操作。

操作流程:

执行 refresh 操作。

把这次提交动作之前所有没有落盘的 segment 强制刷盘,确保写入物理文件。

创建一个提交点,记录这次提交对应的所有 segment,写入 commit point 文件。

清空 Translog,因为 Segment 都已经踏实落地了,之前的 Translog 就不需要了。

这个提交流程,称为 flush。

7. Segment 太多怎么办?
通过上面的流程,可以发现,segment 文件太多了,一秒就产生一个,这会严重影响搜索性能。

es 有一个后台程序,用于 merge 合并这些 segment 文件,把小 segment 整合到一个大的 segment 中,并修改 commit point 的 segment 记录。

merge 过程还会清理被删除的数据。

es 接收到删数据请求时,不会真的到 segment 中把数据删了,而是把要删除的数据写到 '.del' 文件中,在读操作时,会根据这个文件进行过滤。

merge 合并时才真正删除,合并后的 segment 中就没有已经删除的数据了。

8. 小结
写操作时,ES 把写请求路由到目标 Shard 所在的 Server 节点,Doc 先被放入 Buffer,并记录此请求的操作日志,写入 Translog。

每隔一秒,执行 Refresh 操作,将 Buffer 中数据写入 Segment 文件,并清空 Buffer。

Refresh 实际写入的 Segment 文件缓存,会在 Flush 操作中刷盘到物理文件。

当 Translog 过大,或者每隔 30 分钟,执行一次 Flush 操作。

先执行一次 Refresh,然后将所有 Segment 文件缓存刷盘到物理文件,并创建提交点,记录此次操作设计的 Segment,写入 Commit Point 文件,最后清空 Translog。

ES 的 Merge 程序负责合并小 Segment,并清除被删除的 Document。
-----------------------------------
「干货」图解 Elasticsearch 写入流程
https://blog.51cto.com/u_7117633/2866130

文章2

Elasticsearch源码:写入流程原理分析(一)-Solr|Nutch|Lucene|ES-About云开发

ES的写入采用一主多副的模式,写操作一般会经过三种节点:协调节点、主分片所在节点、副本分片所在节点。
客户端发送请求到Node1(相当于协调节点),协调节点收到请求之后,确认写入的文档属于分片P0,于是将请求转发给P0所在的节点Node3,Node3写完成之后将请求转发到P0所属的副本R0所在的节点Node1和Node2。

思考:

整体上看

Client 发送请求到es-es接收到数据写入磁盘,返回响应给Client,写入成功

从节点,shard考虑

客户端请求到协调节点,协调节点hash(key)*shard,确定消息该发到哪个(主)分片,这个分片可能在其他节点,协调节点将请求转发到目标分片对应节点,主分片写完成后,请求转发到副本所在节点,数据同步;

总结:协调节点接收,主分片写入,副本同步

从内存磁盘考虑

看下面两个图

刚才说写到主分片,具体写到哪里,写到主分片下的segment,这是个啥:系统文件缓存,注意这是个缓存,还没有真正落盘,但是可以查询到。还有一个概念buffer,如图3,内存缓冲区Buffer,流程:

请求数据-写入缓存中Buffer-写入文件缓存sengment-定时刷盘到物理磁盘

图解 Elasticsearch 写入流程相关推荐

  1. 【ElasticSearch】 ElasticSearch 写入流程

    1.概述 转载:https://www.easyice.cn/archives/180

  2. 【Elasticsearch】Elasticsearch 优化写入流程实现NRT近实时(filesystem cache,refresh)

    现有流程的问题,每次都必须等待fsync将segment刷入磁盘,才能将segment打开供search使用,这样的话,从一个document写入,到它可以被搜索,可能会超过1分钟!!!这就不是近实时 ...

  3. 【Elasticsearch】Elasticsearch gateway 流程分析

    1.概述 转载:elasticsearch gateway 流程分析 es 存储的数据有以下几种形式: state index translog index 为 lucene 生成的索引文件 tran ...

  4. 【es】es 写入流程

    1.概述 转载并且补充:es 写入流程 读取这篇文章的时候先看看 [Elasticsearch]了解Elasticsearch写入磁盘的数据 然后再看看 [ES]ES 写入数据流程 写索引后端变化太大 ...

  5. Elasticsearch 写入优化记录,从3000到8000/s

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/wmj2004/article/ details/80804411 背景 基于elasticsearch-5.6.0 机器配置: ...

  6. flume源码学习8-hdfs sink的具体写入流程

    上一篇说了HDFSEventSink的实现,这里根据hdfs sink的配置和调用分析来看下sink中整个hdfs数据写入的过程: 线上hdfs sink的几个重要设置 1 2 3 4 5 6 7 8 ...

  7. 图解ElasticSearch 搜索原理

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:https://www.cnblogs.com/ri ...

  8. HBase - 数据写入流程解析

    本文由  网易云 发布. 作者:范欣欣 本篇文章仅限内部分享,如需转载,请联系网易获取授权. 众所周知,HBase默认适用于写多读少的应用,正是依赖于它相当出色的写入性能:一个100台RS的集群可以轻 ...

  9. 图解 Elasticsearch 原理

    摘要 先自上而下,后自底向上的介绍ElasticSearch的底层工作原理,试图回答以下问题: 为什么我的搜索 *foo-bar* 无法匹配 *foo-bar* ? 为什么增加更多的文件会压缩索引(I ...

  10. 图解 ElasticSearch 搜索原理

    摘要 先自上而下,后自底向上的介绍ElasticSearch的底层工作原理,试图回答以下问题: 为什么我的搜索 *foo-bar* 无法匹配 foo-bar ? 为什么增加更多的文件会压缩索引(Ind ...

最新文章

  1. 庆祝博客积分成功上四位数!
  2. 假设你有一个多层感知机网络(MLP),输入层有10个节点、一个单隐层共50个神经元,最后是一个3个神经元的输出层。请问网络的结构是什么样子的使用数学形式进行描述?
  3. grantrevoke
  4. c# 学习笔记 (3) 窗体单例模式
  5. 封神-运维大脑 | 日志检测工具
  6. react 组件添加样式_如何通过4个简单的步骤将CSS模块样式表添加到React组件
  7. 微信小程序之 3d轮播(swiper来实现)
  8. 三维旋转四元数系列(2.三维旋转之轴角与罗德里格斯公式推导)
  9. creator图片循环显示_Cocos creator 游戏背景循环滚动--Javascript编写
  10. docker 安装 mariadb
  11. html 游戏首页,30个让人玩上瘾的HTML5游戏
  12. 【Linux】shell调用Java程序main方法通过crontab定时执行
  13. mysql 5.6的安装
  14. OpenCV官方网站:这里可以白嫖教程、检索API、下载例程
  15. 虚幻c++入门到入土(一)VS插件Resharper使用
  16. MCU学习——无线遥控模块
  17. 从0开始ubuntu16.04(虚拟机)安装tensorflow,spinningup
  18. Arthas 3.1.2版本发布: 增加logger/heapdump/vmoption命令,支持tunnel server
  19. SpringBoot 启动类 @SpringBootApplication 注解 以及执行流程
  20. 公告:CSDN个人空间即将改版

热门文章

  1. Debian下安装搜狗拼音输入法
  2. python strip() 方法
  3. mvc4开篇之BundleConfig(1)
  4. Ekho TTS 5.1发布
  5. Linux串口分析open
  6. java材质_教程 - JAVA版材质包制作教程 | MineBBS 我的世界中文论坛
  7. 几篇关于UDEV的文章
  8. Linux上,最常用的一批命令解析
  9. PCIe device tree range属性详解
  10. 深入解读Docker底层技术cgroup系列(4)——cgroup子系统cpu