elasticsearch的内部分片原理

43 篇文章 0 订阅
5 篇文章 0 订阅

                                  elasticsearch的内部分片原理

我们知道elasticsearch的搜索是基于倒排索引,倒排索引被写入磁盘后是 不可改变 的:它永远不会修改。 不变性有重要的价值:

  • 不需要锁。如果你从来不更新索引,你就不需要担心多进程同时修改数据的问题。
  • 一旦索引被读入内核的文件系统缓存,便会留在哪里,由于其不变性。只要文件系统缓存中还有足够的空间,那么大部分读请求会直接请求内存,而不会命中磁盘。这提供了很大的性能提升。
  • 其它缓存(像filter缓存),在索引的生命周期内始终有效。它们不需要在每次数据改变时被重建,因为数据不会变化。
  • 写入单个大的倒排索引允许数据被压缩,减少磁盘 I/O 和 需要被缓存到内存的索引的使用量。

当然,一个不变的索引也有不好的地方。主要事实是它是不可变的! 你不能修改它。如果你需要让一个新的文档 可被搜索,你需要重建整个索引。这要么对一个索引所能包含的数据量造成了很大的限制,要么对索引可被更新的频率造成了很大的限制。

如上图所以,这是es写文档的原理,这里面有两个重要概念refresh与flush

es引入了段(segment)的概念,每一个段就是一个倒排索引。

refresh:在 Elasticsearch 中,写入和打开一个新段的轻量的过程叫做 refresh 

translog:es的事务日志

flush:执行一个提交并且截断 translog 的行为在 Elasticsearch 被称作一次 flush 

提交点:一个列出了所有已知段的文件

es采用了double-write的策略

1、新的索引首先被写到内存索引缓存中(in memory buffer),然后写入到一个基于磁盘的段(segment),段会被写入到文件系统缓存,然后再刷新到系统磁盘。默认情况下,每个分片每秒会refresh一次,这就是为什么我们说 Elasticsearch 是  实时搜索: 文档的变化并不是立即对搜索可见,但会在一秒之内变为可见。

2、新的索引被写入内存索引缓存的同时,会被追加到事务日志(translog)中。

每隔一段时间--例如 translog 变得越来越大--索引被刷新(flush);一个新的 translog 被创建,并且一个全量提交被执行,过程如下

  • 所有在内存缓冲区的文档都被写入一个新的段。
  • 缓冲区被清空。
  • 一个提交点被写入硬盘。
  • 文件系统缓存通过 fsync 被刷新(flush)。
  • 老的 translog 被删除。

这个执行一个提交并且截断 translog 的行为在 Elasticsearch 被称作一次 flush 。 分片每30分钟被自动刷新(flush),或者在 translog 太大的时候也会刷新。

参考:https://www.elastic.co/guide/cn/elasticsearch/guide/current/inside-a-shard.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值