我的个人博客:逐步前行STEP

1、elasticsearch 如何使文档可以被搜索

为了支持全文检索而采用倒排索引,倒排索引包含一个有序列表,列表包含所有文档出现过的词项 ,对于每一个词项,包含了它所有曾出现过文档的列表。
早期的倒排索引,会在文档变化时,重建新的索引,直到完成后替换掉旧的索引,这样新的变化就可以被搜索到。
倒排索引具有不变性,这使得索引一旦被读入文件系统缓存,便会留在那里,只要有足够的空间,就可以使大部分请求直接命中缓存,很大地提升了性能,缺点是,如果有新的文档需要被搜索,只能重建整个索引。

2、如何使用更好的方式实现倒排索引的更新

上面说了,由于索引的不变性,更新索引的方式是重建整个索引,这种方式对于数据量和更新频率的情况是有很大限制的,所以elasticsearch通过增加新的补充索引来反映新近的修改,而不是直接重写整个倒排索引。最终通过轮询每一个倒排索引并对结果进行合并才创建新的索引。

  • 按段搜索
    elasticsearch 基于lucene 引入了 按段搜索的概念,每一个段,都是一个倒排索引,而一个Lucene索引,除了包含多个段之外,还包含commit point、.liv文件。
    其中,commit point记录了每一次的创建新段,当一个段存在文档被删除,会维护该信息在 .liv 文件里面。

逐段搜索会以如下流程进行工作:

  1. 新增的文档写入内存缓存
  2. 每隔一段时间,创建一个新段,将文档从内存缓存中被提交到新段
  3. 新段写入到磁盘(文件系统缓存)
  4. 新的commit point 也 写入到磁盘(文件系统缓存)
  5. 磁盘 fsync ,从文件系统缓存中价格写入操作同步到物理磁盘
  6. 这个新的段被开启, 使得段内文档对搜索可见
  7. 清空内存缓存,继续接受新的文档

3、如何实现近实时搜索

上面的写入到可检索过程,主要瓶颈在磁盘fync,大量文档需要写入磁盘可能造成很明显的延迟,而且每次的索引一个文档都要做磁盘fsync会造成性能问题。所以elasticsearch更轻量的方式来使一个文档可被搜索——将fsync从【写入到可检索】的步骤中移除——在新段写入文件系统缓存之后就可检索。
在第1部分中描述了倒排索引在文件系统缓存中被请求,所以在新段写入文件系统缓存之后就可以被打开和读取了。写入文件系统缓存和打开新段被称为refresh,默认情况下每秒进行一次refresh,也可以更改该项设置,或者手动执行。
有了refresh之后,索引文档的步骤更改为:

  1. 新增的文档写入内存缓存
  2. 每隔一段时间,创建一个新段,refresh,此时新段可被检索
  3. 通过fsync刷新磁盘(flush) ,从文件系统缓存中将所有写入操作同步到物理磁盘
  4. 清空内存缓存,继续接受新的文档

4、数据持久化

上面说到新段先写入文件系统缓存,再fsync到磁盘,在这个过程中,如果断电,则无法将未来得及同步的数据持久化到磁盘,所以elasticsearch 增加了一个 translog,也叫事务日志,记录了每一次的操作。

  1. 在文档写入内存缓存的同时,写入到translog中
  2. 执行refresh时,会清空内存缓存,且没有fsync到磁盘时,translog仍然保留
  3. 每隔一段时间或者translog文件太大,索引被刷新,所有在内存缓冲区的文档都被写入一个新的段,清空内存缓存,一个提交点被写入硬盘,新的traslog文件被创建,旧的被删除

而在执行refresh后,fsync之前,如果重启elasticsearch,它会从磁盘中使用最后一个提交点去恢复已知的段,并且会重放 translog 中所有在最后一次提交后发生的变更操作。

5、段合并

由于在自动刷新流程每秒会创建一个新的段,段时间内就会积累大量的段,每一个段都会消耗文件句柄、内存和cpu运行周期,而且在检索时需要遍历所有段来查找文档,这样无疑是一个巨大的性能瓶颈。elasticsearch通过在后台进行段合并来解决这个问题,小的段被合并到大的段,然后这些大的段再被合并到更大的段,段合并的时候会将那些旧的已删除文档从文件系统中清除。
段合并不会中断检索和索引的过程,在索引的时候,创建新段,段合并就会自动执行,合并的段将继续执行之后的步骤。
手动进行强制段合并可使用optimize api,它会将一个分片强制合并到 max_num_segments 个段,但该操作可能会无限制的使用资源,造成集群内短时间内无法响应。

Elasticsearch 数据写入原理相关推荐

  1. Elasticsearch 架构原理—— 新数据写入过程

    前言 在分布式日志服务架构中,我们只需要将logstash的output指向ES就可以了,但是,写入的数据是如何变成Elasticsearch里可以被检索和聚合的索引内容的呢?本文重点介绍数据在写入E ...

  2. Elasticsearch:从写入原理谈写入优化

    1.线上实战问题 问题 1:想要请问一下,我这边需求是每分钟利用 sparksteaming 插入按天的索引150万条数据.一般情况下还好,索引7个分片,1副本,但是偶尔会出现延迟很高的情况.比如:一 ...

  3. elasticsearch集群介绍及数据存储过程原理

    elasticsearch集群介绍原理 Elasticsearch集群架构介绍 集群架构介绍 节点介绍 Elasticsearch集群搭建 Elasticsearch分片介绍 主分片 复制分片 Ela ...

  4. hive数据写入elasticsearch

    2019独角兽企业重金招聘Python工程师标准>>> 在使用前同样需要加入 elasticsearch-hadoop-2.3.4.jar 依赖,具体请参见前文介绍.我们先在Hive ...

  5. elasticsearch备份与恢复4_使用ES-Hadoop将ES中的索引数据写入HDFS中

    背景知识见链接:elasticsearch备份与恢复3_使用ES-Hadoop将HDFS数据写入Elasticsearch中 项目参考<Elasticsearch集成Hadoop最佳实践> ...

  6. mysql数据写入磁盘的原理_WAL(Write Ahead Log)机制解析

    WAL即 Write Ahead Log,WAL的主要意思是说在将元数据的变更操作写入磁盘之前,先预先写入到一个log文件中.为什么要先写日志文件呢,我们一步一步的来探索. 基础数据了解 首先,我们需 ...

  7. 面试3连炮:聊聊ES写入数据的原理?查询数据的原理?倒排索引了解吗?

    面试题 es 写入数据的工作原理是什么啊? es 查询数据的工作原理是什么啊? 底层的 lucene 介绍一下呗? 倒排索引了解吗? 面试问这个,其实面试官就是要看看你了解不了解 es 的一些基本原理 ...

  8. logstash读取Elasticsearch数据保存为json,logstash接收log数据写入kafka生产者

    [提前声明] 文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章 写作不易,转载请注明,谢谢! 代码案例地址: ?https://github.com/Mydreamandrea ...

  9. Elasticsearch专栏-7.es底层写入原理

    es底层写入原理 概念说明 es数据落盘过程 mysql数据落盘过程 redis数据落盘过程 概念说明 在第一章节中,已经提到过几个名词:lucence.segment.translog.refres ...

最新文章

  1. 日本的GMO增加了比特币现金,和另外3种用于贷款项目的加密货币
  2. torch.gather(input, dim, index, *, sparse_grad=False, out=None) → Tensor
  3. 【Nutch2.2.1基础教程之2.1】集成Nutch/Hbase/Solr构建搜索引擎之一:安装及运行【单机环境】
  4. [2007最后一博]Url地址重写,利用HttpHander手工编译页面并按需生成静态HTML文件...
  5. css3 多列布局使用
  6. ASP.NET C# 数字格式化输出
  7. Linux一个命令创建多个目录:seq命令
  8. WCDMA的短消息业务协议分析
  9. 在应用中集成科大讯飞的语音识别技术
  10. android图片加水印,文字
  11. string.Format字符串格式化说明
  12. scipy中稀疏矩阵coo_matrix, csr_matrix 的使用
  13. Autojs实现图片转字符串(简易ocr预备步骤)
  14. 【UCHome二次开发】UCHome模板语法…
  15. Android中JNI开发之常见错误
  16. 《程序员面试》---你所不了解的offer话术
  17. 一文梳理 | 电力企业网络安全管理及等级保护工作重点
  18. 百度音乐api+c语言,百度音乐API全接口
  19. 机器学习-文本处理之电影评论多分类情感分析
  20. 没有电池没有芯片,这些塑料瓶子正在联网

热门文章

  1. 友源社区APP论坛源码+网站源码
  2. wordpress模板-单栏多色调全站pajx个人博客模板 idevs主题
  3. HTML五合一收款码网站源码(带35套模板)
  4. linux分区创建ext4失败,RedHat/CentOS ext4无法格式化大分区 补充ext4格式化方式
  5. c语言做一个小程序报告,《C语言程序设计实践》课程报告30个小程序组合成一个大程序.doc...
  6. celery监控服务器性能,Python:使用celery处理多个服务器上的参数列表
  7. 初识好朋友计算机课件,-精选版初识我们的好朋友——计算机.ppt
  8. 全新玖五社区系统整站源码
  9. PHP内核通用网站后台权限管理系统源码
  10. 无域名限制版小智收录网+简单的zblog导航网模板