elasticsearch内部原理

elasticsearch内部原理

参考文章
https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

elasticsearch的近实时搜索

此项在索引文档中出现的统计表

TermDoc 1Doc 2Doc 3
brownXX
foxXXX
quickXX
theXX

es的index的索引是所有分片索引的集合。每一个分片都是一个lucen实例,lucene索引是分段索引的,段就是一个倒排索引。

es内部索引过程

  1. 新的文档被收集到内存索引缓存,内存中分段索引。
  2. 不时的,缓存被提交
    1. 一个新的段–>追加到倒排索引–>被写入磁盘
    2. 一个新的包含新段的名字的提交点被写入磁盘
    3. 磁盘进行同步,所有文件系统缓存中等待的写入都刷新到磁盘,以确保他们被写入物理文件。
  3. 新的段开启,让它包含的文档可被搜索
  4. 内存缓存被清空,等待接收新的文档

等待文档录入的状态,此时提交点的个数为3,一个提交点,内存缓存为空

此时新文档被索引到内存缓存中,等待被提交

此时提交点提交,内存缓存被清除

此时新加的段被开启,此时新索引的文档可以被搜索了

段是不可被修改的,是不能被删除或者被修改。取而代之的是,每个提交点会包含一个 .del 文件,文件中会列出这些被删除文档的段信息。

当一个文档被 “删除” 时,它实际上只是在 .del 文件中被 标记 删除。一个被标记删除的文档仍然可以被查询匹配到, 但它会在最终结果被返回前从结果集中移除。

文档更新也是类似的操作方式:当一个文档被更新时,旧版本文档被标记删除,文档的新版本被索引到一个新的段中。 可能两个版本的文档都会被一个查询匹配到,但被删除的那个旧版本文档在结果集返回前就已经被移除。

事务日志

1. 新的文档被添加到内存缓冲区并且被追加到了事务日志

2. 刷新(refresh)使分片处于 图 22 “刷新(refresh)完成后, 缓存被清空但是事务日志不会” 描述的状态,分片每秒被刷新(refresh)一次:
这些在内存缓冲区的文档被写入到一个新的段中,且没有进行 fsync 操作。
这个段被打开,使其可被搜索。

内存缓冲区被清空。

3. 这个进程继续工作,更多的文档被添加到内存缓冲区和追加到事务日志

4. 在刷新(flush)之后,段被全量提交,并且事务日志被清空

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

段合并

  1. 新的段被刷新(flush)到了磁盘。 写入一个包含新段且排除旧的和较小的段的新提交点。
  2. 新的段被打开用来搜索。
  3. 老的段被删除。

事务日志的安全性

Translog 有多安全?

translog 的目的是保证操作不会丢失。这引出了这个问题: Translog 有多安全 ?

在文件被 fsync 到磁盘前,被写入的文件在重启之后就会丢失。默认 translog 是每 5 秒被 fsync 刷新到硬盘, 或者在每次写请求完成之后执行(e.g. index, delete, update, bulk)。这个过程在主分片和复制分片都会发生。最终, 基本上,这意味着在整个请求被 fsync 到主分片和复制分片的translog之前,你的客户端不会得到一个 200 OK 响应。

在每次请求后都执行一个 fsync 会带来一些性能损失,尽管实践表明这种损失相对较小(特别是bulk导入,它在一次请求中平摊了大量文档的开销)。

但是对于一些大容量的偶尔丢失几秒数据问题也并不严重的集群,使用异步的 fsync 还是比较有益的。比如,写入的数据被缓存到内存中,再每5秒执行一次 fsync 。

这个行为可以通过设置 durability 参数为 async 来启用:

PUT /my_index/_settings
{
    "index.translog.durability": "async",
    "index.translog.sync_interval": "5s"
}

这个选项可以针对索引单独设置,并且可以动态进行修改。如果你决定使用异步 translog 的话,你需要 保证 在发生crash时,丢失掉 sync_interval 时间段的数据也无所谓。请在决定前知晓这个特性。

如果你不确定这个行为的后果,最好是使用默认的参数( “index.translog.durability”: “request” )来避免数据丢失。

强制合并(不建议)

POST /logstash-2014-10/_optimize?max_num_segments=1 

参考文章
https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值