Elasticsearch线上搜索引擎读写内核原理深度认知-搜索系统线上实战

本套技术专栏是作者(秦凯新)平时工作的总结和升华,并深度整理大量网上资源和专业书籍。通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。QQ邮箱地址:1120746959@qq.com,如有任何学术交流,可随时联系。

1 ES 分布式架构设计

elasticsearch设计的理念就是分布式搜索引擎,底层其实还是基于lucene的。

es中存储数据的基本单位是索引,比如说你现在要在es中存储一些订单数据,你就应该在es中创建一个索引,order_idx,所有的订单数据就都写到这个索引里面去,一个索引差不多就是相当于是mysql里的一张表。

-> index(mysql里的一张表)
-> type(一个index里可以有多个type,每个type的字段都是差不多的,但是有一些略微的差别。
         比如在订单index里,建两个type,一个是实物商品订单type,一个是虚拟商品订单type,
         这两个type大部分字段是一样的,少部分字段是不一样的) 
-> mapping (mapping就是这个type的表结构定义)
-> document (一条document就代表了mysql中某个表里的一行,每个document有多个field,每个field就代表了这个document中的一个字段的值)
-> field(具体索引字段)
复制代码

  • 设计一个索引,这个索引可以拆分成多个shard,每个shard存储部分数据。
  • 每一个shard的数据实际是有多个备份,每个shard都有一个primaryshard,负责写入数据,但是还有几个replica shard。primary shard写入数据之后,会将数据同步到其他几个replica shard上去。
  • es集群多个节点,会自动选举一个节点为master节点,这个master节点其实就是干一些管理的工作的,比如维护索引元数据拉,负责切换primary shard和replica shard身份等。
  • 如果master节点宕机了,那么会重新选举一个节点为master节点。
  • 如果是非master节点宕机了,那么会由master节点让那个宕机节点上的primary shard的身份转移到其他机器上的replica shard。

2 ES 写数据过程深入剖析

2.1 ES 写数据总体流程

  • 客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点)
  • coordinating node,对document进行路由,将请求转发给对应的node(拥有primary shard 的节点)
  • 拥有primary shard 的node处理写入请求,然后将数据同步到replica node
  • coordinating node,如果发现primary node和所有replica node都搞定之后,就返回响应结果给客户端。

2.2 ES 写数据内核原理剖析

  • 步骤一(buffer缓冲和写入translog日志阶段):ES 写数据先写入buffer,在buffer里的时候数据是搜索不到的,并同时将数据写入translog日志文件。

  • 步骤二(refresh刷写os cache阶段):当写入数据buffer快满了,或者到一定时间,就会将buffer数据refresh到一个新的segment file中,但是此时数据不是直接进入segment file的磁盘文件的,而是先进入os cache的,这个过程就是refresh。segment file位于os cache中。

      (1) 每隔1秒钟,es将buffer中的数据写入一个新的segment file,
          每秒钟会产生一个新的磁盘文件,segment file,这个segment file
          中就存储最近1秒内buffer中写入的数据。
      (2) 如果buffer里面此时没有数据,那当然不会执行refresh操作,每秒创建换一个空的
          segment file,如果buffer里面有数据,默认1秒钟执行一次refresh操作,刷入一个
          新的segment file中
      (3) 只要buffer中的数据被refresh操作,刷入os cache中,就代表这个数据就可以被搜索到了
      
      (4) 为什么叫es是准实时的?NRT,near real-time,准实时。
          默认是每隔1秒refresh一次的,所以es是准实时的,因为写入的数据1秒之后才能被看到。
      (5) 可以通过es的restful api或者java api,
          手动执行一次refresh操作,就是手动将buffer中的数据刷入os cache中,让数据立马就可以被搜索到。
    复制代码
  • 步骤三(清空buffer阶段):只要数据被输入os cache中,buffer就会被清空了,因为不需要保留buffer了,数据在translog里面已经持久化到磁盘去一份了。

  • 步骤四(commit阶段flush操作):重复1~3步骤,新的数据不断进入buffer和translog,不断将buffer数据写入一个又一个新的segment file中去,每次refresh完buffer清空,translog保留。随着这个过程推进,translog会变得越来越大。当translog达到一定长度的时候,就会触发commit操作。

      (1)commit操作发生第一步,就是将buffer中现有数据refresh到os cache中去,清空buffer
      
      (2)将一个commit point写入磁盘文件,里面标识着这个commit point对应的所有segment file
      
      (3)强行将os cache中目前所有的数据(所有的segment file文件)都fsync到磁盘文件中去。
      
      (4)将现有的translog清空,然后再次重启启用一个translog,此时commit操作完成。
         默认每隔30分钟会自动执行一次commit,但是如果translog过大,也会触发
         commit。整个commit的过程,叫做flush操作。我们可以手动执行flush操作,
         就是将所有os cache数据刷到磁盘文件中去。
         
      (5)es中的flush操作,就对应着commit的全过程。我们也可以通过es api,
         手动执行flush操作,手动将os cache中的数据fsync强刷到磁盘上去,
         记录一个commit point,清空translog日志文件。
         
      (6)translog其实也是先写入os cache的,默认每隔5秒刷一次到磁盘中去,所以默认情况下,
         可能有5秒的数据会仅仅停留在buffer或者translog文件的
         os cache中,如果此时机器挂了,会丢失5秒钟的数据。但是这样性能比较好,最多
         丢5秒的数据。也可以将translog设置成每次写操作必须是直接fsync到磁盘,但是性能会差很多。
      (7) es是准实时的,数据写入1秒后可以搜索到;但是却可能会丢失数据,因为
         有5秒的数据停留在buffer、translog os cache、segment file os cache中,
         有5秒的数据不在磁盘上,此时如果宕机,会导致5秒的数据丢失。
      
      (8) 如果你希望一定不能丢失数据的话,你可以设置个参数,官方文档,百度一下。
          每次写入一条数据,都是写入buffer,同时写入磁盘上的translog,但是
          这会导致写性能、写入吞吐量会下降一个数量级。本来一秒钟可以写2000条,
          现在你一秒钟只能写200条,都有可能。   
    复制代码
  • 步骤五(删除操作):commit的时候会生成一个.del文件,里面将某个doc标识为deleted状态,那么搜索的时候根据.del文件就知道这个doc被删除了

  • 步骤六(更新操作):就是将原来的doc标识为deleted状态,然后新写入一条数据

  • 步骤七 (merge阶段操作):buffer每次refresh一次,就会产生一个segment file,所以默认情况下是1秒钟一个segment file,segment file会越来越多,此时会定期执行merge。 每次merge的时候,会将多个segment file合并成一个,同时这里会将标识为deleted的doc给物理删除掉,然后将新的segment file写入磁盘,这里会写一个commit point,标识所有新的segment file,然后打开segment file供搜索使用,同时删除旧的segment file。

3 ES 读数据过程深入剖析

  • 步骤一:客户端发送请求到一个coordinate node(随机选择)
  • 步骤二:协调节点将搜索请求转发到所有的shard对应的primary shard或replica shard(不同的副本都可以用来搜索)。
  • 步骤三:query阶段,每个shard将自己的搜索结果(其实就是一些doc id),返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果
  • 步骤四:fetch阶段,接着由协调节点,根据doc id去各个节点上拉取实际的document数据,最终返回给客户端

4 总结

在此感谢石杉的讲义,结合大数据在我们工业大数据平台的实践,总结成一篇实践指南,方便以后查阅反思,后续我会根据本篇博客进行代码技术实践实现。

秦凯新 于郑州 201903032152

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
视频资源太大,这里提供百度云链接: 资源包括项目源码和所需的数据: 01-1 _课程导学~1.mp4 01-2 说明和建议~1.mp4 02-1 -术语介绍 .mp4 02-2 Document介绍.mp4 02-3 index介绍 .mp4 02-4 -restapi介绍 .mp4 02-5 -index_api .mp4 02-6 -document_api.mp4 03-01 -书的目录与索引.mp4 03-02 -正排与倒排索引简介.mp4 03-03 -倒排索引详解.mp4 03-04 -分词介绍.mp4 03-05 -analyze_api .mp4 03-06 -自带分词器.mp4 03-07 -中文分词.mp4 03-08 -自定义分词之CharacterFilter .mp4 03-09 自定义分词之Tokenizer .mp4 03-10 -自定义分词之 TokenFilter .mp4 03-11 -自定义分词.mp4 03-12 -分词使用说明 .mp4 03-13 -官方文档说明.mp4 04-01 -mapping简介.avi 04-02 -自定义 mapping .avi 04-03 -mapping演示.avi 04-04 -copy_to参数说明.avi 04-05 -index参数说明.avi 04-06 -index_options参数说明.avi 04-07 -mapping文档说明.avi 04-08 -数据类型.avi 04-09 -dynamic-mapping简介.avi 04-10 -dynamic日期与数字识别.avi 04-11 -dynamic-template简介.avi 04-12 -自定义mapping的建议.avi 04-13 -索引模板.mp4.avi 05-01 -SearchAPI概览.avi 05-02 -URISearch详解与演示.avi 05-03 -QueryDSL简介.avi 05-04 -字段类查询简介及match-query.avi 05-05 -相关性算分.mp4.avi 05-06 -match-phrase-query_音频.mp4.avi 05-07 -query-string-query.avi 05-08 -simple-query-string-query.avi 05-09 -term-terms-query.avi 05-10 -range-query.avi 05-11 -复合查询介绍及ConstantScore.avi 05-12 -bool-query.avi 05-13 -count-and-source-filtering.avi 06-01 -分布式介绍及cerebro.avi 06-02 -构建集群.avi 06-03 -副本与分片.avi 06-04 -两个问题.avi 06-05 -集群状态.avi 06-06 -故障转移.mp4.avi 06-07 -文档分布式存储.avi 06-08 -脑裂问题.avi 06-09 -shard详解.avi 07-1 -Query-Then-Fetch.avi 07-2 -相关性算分.avi 07-3 -sorting-doc-values-fielddata.avi 07-4 -分页与遍历-fromsize.avi 07-5 分页与遍历.avi 07-6 分页与遍历-search_after.avi 07-7 文档说明.mp4.avi 08-1 -聚合分析简介.avi 08-2 -metric聚合分析.avi 08-3 -bucket聚合分析.avi 08-4 -bucket和metric聚合分析.avi 08-5 -pipeline聚合分析.avi 08-6 -作用范围.avi 08-7 -排序.avi 08-8 -原理与精准度问题.avi 08-9 -文档说明.avi 09-1 -数据建模简介.avi 09-2 -ES数据建模配置相关介绍.avi 09-3 -ES数据建模实例.mp4.avi 09-4 -Nested_Object.avi 09-5 -Parent_Child.avi 09-6 -nested_vs_parent_child.avi 09-7 -reindex.avi 09-8 其他建议.avi 10-1 生产环境部署建议.avi 10-2 写性能优化.avi 10-3 读性能优化.avi 10-4 如何设定shard数.avi 10-5 xpack监控功能介绍.avi 11-1 入门及架构简介.avi 11-2 -Life_of_an_Event.avi 11-3 -queue简介.avi 11-4 -线程简介.avi 11-5 配置简介.avi 11-6 多实例运行.avi 11-7 pipeline配置简介.avi 12-01 input插件详解及glob讲解.avi 12-02 -codec插件详解.avi 12-03 filter插件简介及date插件讲解.avi 12-04 filter插件之grok简介(上).avi 12-05 filter插件之grok简介(下).avi 12-06 filter插件之dissect讲解.avi 12-07 filter插件之mutate 讲解.avi 12-08 filter插件之 json讲解.avi 12-09 filter 插件之geoip和ruby 讲解.avi 12-10 output插件简介.avi 12-11 文档说明.avi 123.bat 13-1 -Logstash实战建议.avi 13-2 -实战之apacheLogs(上).avi 13-3 实战之apacheLogs(下).avi 13-4 实战之csv.avi 13-5 监控运维建议.avi 14-1 beats简介.avi 14-2 Filebeat_Demo.avi 14-3 Filebeat 简介及流程介绍.avi 14-4 Filebeat常见架构及ingest_node介绍.avi 14-5 Filebeat_Module简介.avi 15-1 -简介.avi 15-2 -Module简介.avi 15-3 -实战.mp4.avi 16-1 1-简介(1).avi 16-1 1-简介(1).avi.baiduyun.downloading 16-1 1-简介.avi 16-2 2-实战.avi 17-1 1-Heartbeat.avi 17-2 2-Community_beats.avi 18-1 -配置与线上部署建议.avi 18-2 -Index_Pattern_Objects_Settings使用.avi 19-1 -导入数据.avi 19-2 -Discover实战.avi 20-1 -可视化简介.avi 20-2 -Basic_Charts_介绍.avi 20-3 -Basic_Charts_其他说明.avi 20-4 -Data图表介绍.avi 20-5 -Map图表介绍.avi 20-6 -Timelion介绍.avi 20-7 -VisualBuilder介绍.avi 20-8 -other图表介绍.avi 20-9 -Dashboard介绍.avi 21-1 -项目介绍.avi 21-2 项目实战.avi 22-1 介绍和数据导入.avi 22-2 -实战.avi 23-1 项目简介.avi 23-2 实战(上).avi 23-3 实战(下).avi 24-1 课程总结.avi codes.zip project.zip 文件树.txt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值