分享

Elasticsearch架构原理

本帖最后由 levycui 于 2020-5-20 19:46 编辑
架构原理

本书作为 Elastic Stack 指南,关注于 Elasticsearch 在日志和数据分析场景的应用,并不打算对底层的 Lucene 原理或者 Java 编程做详细的介绍,但是 Elasticsearch 层面上的一些架构设计,对我们做性能调优,故障处理,具有非常重要的影响。

所以,作为 ES 部分的起始章节,先从数据流向和分布的层面,介绍一下 ES 的工作原理,以及相关的可控项。各位读者可以跳过这节先行阅读后面的运维操作部分,但作为性能调优的基础知识,依然建议大家抽时间返回来了解。

带着问题学习

  •     写入的数据是如何变成elasticsearch里可以被检索和聚合的索引内容的?
  •     lucene如何实现准实时索引?
  •     什么是segment?
  •     什么是commit?
  •     segment的数据来自哪里?
  •     segment在写入磁盘前就可以被检索,是因为利用了什么?
  •     elasticsearch中的refresh操作是什么?配置项是哪个?设置的命令是什么?
  •     refresh只是写到了文件系统缓存,那么实际写入磁盘是由什么控制呢?,如果这期间发生错误和故障,数据会不会丢失?
  •     什么是translog日志?什么时候会被清空?什么是flush操作?配置项是什么?怎么配置?
  •     什么是段合并?为什么要段合并?段合并线程配置项?段合并策略?怎么forcemerge(optimize)?
  •     routing的规则是什么样的?replica读写过程?wait_for_active_shards参数timeout参数 ?
  •     reroute 接口?
  •     两种 自动发现方式?

segment、buffer和translog对实时性的影响

既然介绍数据流向,首先第一步就是:写入的数据是如何变成 Elasticsearch 里可以被检索和聚合的索引内容的?

以单文件的静态层面看,每个全文索引都是一个词元的倒排索引,具体涉及到全文索引的通用知识,这里不单独介绍,有兴趣的读者可以阅读《Lucene in Action》等书籍详细了解。
动态更新的 Lucene 索引

以在线动态服务的层面看,要做到实时更新条件下数据的可用和可靠,就需要在倒排索引的基础上,再做一系列更高级的处理。

其实总结一下 Lucene 的处理办法,很简单,就是一句话:新收到的数据写到新的索引文件里。

Lucene 把每次生成的倒排索引,叫做一个段(segment)。然后另外使用一个 commit 文件,记录索引内所有的 segment。而生成 segment 的数据来源,则是内存中的 buffer。也就是说,动态更新过程如下:
2020-05-20_193058.jpg

如何利用磁盘缓存实现的准实时检索?如何使用translog提供的磁盘同步控制?

可下载文档:
Elasticsearch架构原理 .pdf (986.56 KB, 下载次数: 31)

已有(2)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条