elasticsearch

文档搜索的实时性

倒排索引不可变更的好处:

1,不用考虑并发写文件的问题,杜绝了锁机制带来的性能问题。

2,由于文件不再更改,可以充分利用文件缓存系统,只需要载入一次,只要内存足够,对该文件的读取都可以从内存中读取,性能高。

3,有利于生成缓数据。

4,有利于对文件进行压缩处理,节省磁盘和内存存储空间

坏处:需要写入新文档时,必须重新构建倒排索引文件,然后替换老文件,新文档才能被搜索,导致文档实时性差。

解决方法是,写入新文档时,产生新的倒排索引文件,查询的时候,查询所有的倒排索引文件,然后做结果的汇总。

文档搜索的实时性:

lucence 采用的就是这种方案,它构建的单个倒排索引成为segment,合在一起成为index,与elasticsearch中的index不同,ES总得一个shard对应lucence中的一个index。

lucence中有一个专门的文件来记录所有的segment的信息,成为commit point。

segment 写入磁盘的过程很耗时,可以借助文件系统缓存的特性,先将segment放在缓存中创建并开放查询来进一步提升实时性。这个过程在ES中成为refresh。

在refresh之前,新文档会存在一个buffer中,refresh前会将buffer清空并生成segment。ES默认每一秒执行一次refresh,因此文档的实时性被提高到1秒,这也是ES被成为近实时的原因。

如果内存中的segment还没有写入磁盘时发生了故障,这里面的文档该怎么恢复呢?

ES中引入了translog机制,写入文档到buffer时,同时将该操作写入translog,translog文件会即时写入磁盘,默认每个请求都会落盘,可以修改为每5秒写入一次,这样的风险就是丢失5秒内的数据,ES启动时会检查translog文件,并从中恢复数据。

Flush:

flush主要负责将内存中的segment写入到磁盘中,主要的工作如下。

1,将translog写入磁盘。

2,将index buffer 清空,其中的文档生成一个新的segment,相当于一个refresh操作。

3,更新commit point并写入磁盘。

4,执行fsync操作,将内存中的segment写入磁盘。

5,删除旧的translog文件。

refresh发生的时机主要有以下几种情况:

1,间隔时间达到,通过indec.settings.refresh_interval来设定,默认是1秒。

2,index.buffer占满时,其大小是通过indices.memory.index_buffer_size设置,默认为jvm heap的10%,所有shard共享。

3,flush时也会发生refresh。

flush发生的时机主要有以下几种情况:

1,间隔时间达到时,默认是30分钟,5.X之前可以修改,之后的版本无法修改。

2,translog占满时,其大小可以通过index.translog.flush_threshold_size来控制,默认是512mb,每个index哟自己的translog.

segment一旦生成不能更改,删除文档时,lucence中会专门维护一个.del文件,记录所有已经删除的文档(lucence内部的id),在查询结果返回前会过滤掉.del中的所有文档。

更新时,先删除文档,再创建新文档。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值