文章目录

  • 概述
  • 1.es中的基础概念
  • 2.es中的索引过程
    • 2.1 一次index请求的大体流程
    • 2.2 为什么是near real time
    • 2.3 为什么要有translog
      • 2.3.1 translog的作用
      • 2.3.2 translog的持久化机制
      • 2.3.2 commit产生的时机

概述

  这里主要讲讲es index的过程,努力揭示es在index过程中具体做了哪些工作。
从而增加我们对es的了解,以便于更好的使用和优化es。

1.es中的基础概念

  1. es的基础支撑是使用lucene,每个es的索引(index)有多个shard,每个shard都是一个独立的lucene实例
  2. 每个lucene实例通过多个segment来管理自己存储的数据,每个segment可一个认为是独立的存储单元,从存储功能上来说类似于mysql中分表中的一张表
  3. 每个lucene实例同时引入了一个commit的概念来管理segment,因为segment是要写入磁盘的,如果每产生一个segment都要写入磁盘的话,那么效率会受到影响,所以一般都是多个segment进行一次写磁盘操作,叫做commit,每次commit记录了本次提交的节点的一个快照信息。也就是一个commit check point。这里的每个commit 产生的check point 对应的文件是lucene data存储目录下的segment_N文件,看lucene网上说每个lucene实例中可能有多个segment_N文件(主要是因为有些segment_N文件暂时不能删除,或者使用了自定义的删除策略)
    参考这里
  4. 只有数据进入一个segment当中才能够被搜索到。

2.es中的索引过程

  基于上面的基础知识,我们来梳理一下对于客户端通过http请求过来的一个index操作,对应的在elasticsearch的后端会对应的经历哪些操作

2.1 一次index请求的大体流程

  1. 请求的路由:请求可能被发往es集群当中的任意一个节点(此时假设为A)。所有在Elasticsearch集群中的节点都包含:有关哪个分片存在于哪个节点上的元数据。根据一定的规则计算该文档需要被发往哪个shard(主要是根绝文档的id来计算),接收请求的节点将请求路由到对应的主分片所在节点(假设为B)。

  2. 请求的处理:当节点B接收到来自节点A的请求时,请求被写入到translog(下面会讲到),并将该文档添加到内存缓冲区。如果请求在主分片上成功,则请求将并行发送到副本分片。只有在所有主分片和副本分片上的translog被持久化(fsync’ed)后,客户端才会收到该请求成功的确认。

2.2 为什么是near real time

在经过上面两步介绍,基本上了解了es处理请求的一个大致的套路
  那为什么说es是一个近实时(near real time)的搜索引擎呢,因为通过上面的请求写进es的文档并不能立即被搜索到。正常情况下可能会有一秒钟的延迟,也就是在add之后,最长可能需要经过1s以后才能搜索的到。是什么原因导致的呢,我们就来更进一步的深入其中。

  1. 上面第2步当中的内存缓冲区中的内容是不能直接被搜索的,因为在lucene,只有一个打开的segment才能被搜索,此时缓冲区的内容还不是在一个段当中,但是缓冲区的内容会以固定的间隔刷新(默认为1秒)刷新的过程是:

    1. 内存缓冲区的内容写入文件系统缓存中的新段。此新段的内容更尚未被写入文件系统,但是分段是打开的,内容可被搜索。
    2. 清空内存缓冲区。这里解释了搜索问什么是近实时的,也就是默认的情况下会有1s的延迟。
  2. 当然,这里的内存缓冲区刷新到文件系统缓存的节奏是可以控制的,我们可以通过设置"refresh_interval": "1s"来设置刷新的时间间隔;或者进行强制刷新POST /${index}/_refresh(但是这个在生产中不太建议频繁使用)

  3. 文件系统缓存中的数据会在满足一定的条件下进行持久化操作,写入磁盘,产生一个commit check point。

2.3 为什么要有translog

  在前面讲es应对一次写入请求的过程中提到,在主片写入请求之前会先生成一个tranlog并进行持久化。那么为什么要有这个呢。

2.3.1 translog的作用

  其实es的translog很好理解,基本上和其他系统中的各种用于记录的log类似,比如mysql中的binlog,redis中的aof日志,都是为了快速记录操作记录,防止因服务宕机等产生数据的丢失,当然binlog和aof log可能更加强大,因为他们保存的时间更久一些,可以直接用来做数据的回溯等操作。
  在上面的介绍中我们也可以看到,es除了translog的记录使用的是同步持久化的方式,其他的操作都是对内存的操作,包括内存缓冲区文件系统缓存都是对内存的操作。假如在这中间产生了一些意外,比如你不小心踢掉了插头(这个理由确实有点烂。。。),那么内存缓冲区文件系统缓存中的内容都丢了,即使你插上了插头,重新启动了服务,也是无济于事啊。这个时候tranlog就要闪亮登场力挽狂澜了。因为tranlog在请求能够给客户端正确返回的时候一般都是保证了已经进行了持久化的(默认是都会持久化,你也可以配置成非同步持久化模式,下面会介绍),所以这个时候就可以将translog中的数据拿出来进行回放就行了(并不是全部回放,只是和已经持久化的最后一次commit check point 对比,将之后的tanslog进行重放就行了)。

2.3.2 translog的持久化机制

同时translog的持久化机制也是可以设置的,主要分为同步和异步两种,设置分别如下

index.translog.durability:request|async
  • request模式:这个是默认的模式,在每次写请求完成之后执行(index, delete, update, bulk)。这个过程在主分片和复制分片都会发生。最终, 基本上,这意味着在整个请求被 fsync 到主分片和复制分片的translog之前,你的客户端不会得到一个 200 OK 响应
  • async模式:会在后台异步的按照一个配置参数"index.translog.sync_interval": "5s"进行translog的异步持久化,但是突然宕机的话有可能会导致数据丢失。所以没有特殊情况,还是使用request 模式

2.3.2 commit产生的时机

es会在满足一定的条件下进行一次commit操作(也叫flush操作或者lucene commit),对应的条件是:

1.index.translog.flush_threshold_size : 这个是没有持久化的操作的最大数据存储量,默认是512mb
2.index.translog.retention.age: 这个设置了不再用于帮助lucene commit 持久化的translog能够保存的最长时间,默认是12h
3.index.translog.retention.size: 这个设置了不再用于帮助lucene commit 持久化的的translog的文件存储量,可以比flush_threshold_size更大

对于上面三个参数的翻译稍微有些模糊,从git的源码中找到的注释是这样说的
大概的意思是现在的flush操作只会提交lucene commit 并不会直接delete translog ,也就是把flush和delete translog分开为分别控制的了,也就是只有参数index.translog.flush_threshold_size会影响flush操作。这一段的解释主要是因为之前的老文档中有这样的解释中的第四点。

在进行flush操作时:

  1. 所有在内存缓冲区的文档都被写入一个新的段。
  2. 缓冲区被清空。
  3. 一个提交点被写入硬盘。
  4. 文件系统缓存通过 fsync 被刷新(flush)。
    5. 老的 translog 被删除。 这个目前应该不会立即删除了

refer
https://www.elastic.co/guide/cn/elasticsearch/guide/current/translog.html
https://blog.csdn.net/zg_hover/article/details/77171014

这个里面有说明flush并不是delete old translog
https://github.com/elastic/elasticsearch/blob/master/docs/reference/index-modules/translog.asciidoc

elasticsearch index doc过程概述相关推荐

  1. Elasticsearch学习-Doc与Segment原理

    Elasticsearch学习-Doc与Segment原理 0x00 系列文章目录 Elasticsearch学习-关于倒排索引.DocValues.FieldData和全局序号 Elasticsea ...

  2. golang源码分析-启动过程概述

    golang源码分析-启动过程概述 golang语言作为根据CSP模型实现的一种强类型的语言,本文主要就是通过简单的实例来分析一下golang语言的启动流程,为深入了解与学习做铺垫. golang代码 ...

  3. elasticsearch index 之 put mapping

    elasticsearch index 之 put mapping mapping机制使得elasticsearch索引数据变的更加灵活,近乎于no schema.mapping可以在建立索引时设置, ...

  4. elasticsearch index、create和update的源码分析

    https://segmentfault.com/a/1190000011272749 社区里面有人问了如下一个问题: 执行 bulk 索引文档的时候,用 index 或者 create 类型并且自定 ...

  5. ElasticSearch index 剖析

    ElasticSearch index 剖析 在看ElasticSearch权威指南基础入门中关于:分片内部原理这一小节内容后,大致对ElasticSearch的索引.搜索底层实现有了一个初步的认识. ...

  6. 操作系统学习:进程、线程与Linux0.12初始化过程概述

    本文参考书籍 1.操作系统真相还原 2.Linux内核完全剖析:基于0.12内核 3.x86汇编语言 从实模式到保护模式 ps:基于x86硬件的pc系统 进程 进程是一种控制流集合,集合中至少包含一条 ...

  7. Qt Linguist翻译过程概述

    Qt Linguist翻译过程概述 翻译过程概述 翻译过程概述 必须在应用程序中翻译的大多数文本由单个单词或简短短语组成.这些通常显示为窗口标题,菜单项,工具提示以及按钮,复选框和单选按钮的标签. 开 ...

  8. Linux内核启动过程概述

    Hi!大家好,我是CrazyCatJack.今天给大家带来的是Linux内核启动过程概述.希望能够帮助大家更好的理解Linux内核的启动,并且创造出自己的内核^_^ Linux的启动代码真的挺大,从汇 ...

  9. Apollo进阶课程㊴丨Apollo安装过程概述

    原文链接:进阶课程㊴丨Apollo安装过程概述 Apollo是一个自动驾驶的平台,推荐的参考运行环境为:ThinkPAD X240.CPU:i5 .四核 .内存 8G. 硬盘容量40G以上. 上周阿波 ...

最新文章

  1. 转:乐视秒杀:每秒十万笔交易的数据架构解读
  2. 手动脱UPX壳的几种方法
  3. scipy.optimize.fsolve:用Python求解方程的解
  4. 一个C++加密工具EncryptDecrypt.dll
  5. Sr Software Engineer - Big Data Team
  6. odoo里用sql语句说为日期date类型,没有转换为字符串。
  7. 413 Request Entity Too Large 异常记录
  8. mongoDB导出数据库所有集合内容到json文件
  9. freeimage 安装错误
  10. 中国 vs 卡塔尔 一场幸运的比赛
  11. 【风控模型】—WOE与IV指标的深入理解应用
  12. 购买阿里云服务器发布项目后外网无法访问的解决办法
  13. 在AD中设置漫游配置文件与文件夹重定向
  14. 计算机校本培训措施,2017度信息技术校本培训计划
  15. 等待输入超时:自动登出
  16. Spring|Spring事务管理
  17. 制造业ERP管理系统在企业管理中发挥什么作用?
  18. nodejs的http请求是报错 socket hang up
  19. css画钟表_css怎么样制作钟表
  20. Linux下的多线程編程

热门文章

  1. EV3 直接命令 - 第 5 课 从 EV3 的传感器读取数据
  2. go-zero:开箱即用的微服务框架
  3. 编程思考:对象生命周期的问题
  4. Go http client 连接池不复用的问题
  5. Redis简介及安装
  6. 力扣--- 滑动谜题
  7. LeetCode 股票买卖问题
  8. MPEG-LA发布VVC专利池
  9. 网易云信今年发布的WE-CAN有哪些亮点?
  10. LiveVideoStack线上交流分享 (十七) —— AV1编码器优化与实用落地演进之路