ES如何实现文章发布的准实时检索?

南风 2020年10月20日 159次浏览

一、ES写入原理

首先先看一张ES写入的流程处理图:
ES写入原理图

本图来源于:点击

  • 1、document写入缓存将数据写入内存缓存(In-memorybuffer),并添加事务日志(translog),ES每5秒调用fsync将刷入磁盘。
  • 2、每一秒钟将In-memorybuffer的操作刷新到Linux Cahce,并清空 memory buffer,进入Cache后就可以查询到了,所以每当写入新的document,就会在一分钟之内搜索到,这就是ES近实时搜索的定义。
  • 3、默认设置下,ES每30分钟调用 fsync 将 File system cache 中的数据 flush 到硬盘,并记录commit point。
这么设计的好处:
  • 1、memory buffer为了解决写入磁盘效率低问题,每次一条数据写入内存后立即写到硬盘文件上,由于写入的数据肯定是离散的,因此写入硬盘的操作也就是随机写入了。硬盘随机写入的效率相当低,会严重降低es的性能。
  • 2、memory buffer和硬盘间加入了 Linux 的页面高速缓存(File system cache)来提高 es 的写效率。
  • 3、translog来保证即使因为断电 File system cache 数据丢失,es 重启后也能通过日志回放找回丢失的数据。

二、如果是Lucene什么保证近实时检索?

 我们知道Lucene是支持实时的新增、更新索引的,但正常高并发搜索系统,每个时刻都有用户在访问这个索引,如果同时更新和查询,必将引发访问错误,导致系统崩溃。一般来说,我们会对倒排表加上“读写锁”,然后再更新。但是,加上“锁”之后会带来频繁的读写锁切换,整个系统的检索效率会比无锁状态有所下降。
 因而,为了提高系统性能,我们使用工业界Dubbo Buffer(双缓冲机制)在无锁的环境下对索引进行更新操作。我们在内存保存两份索引A、B,当A提供用户检索访问时,B用于提供索引更新;当更新完成后我们将用户访问索引的指针从A切换到B上,这个过程是原子操作,不能被中断,但是,也不能过于频繁切换,会造成系统开销,因而可以借鉴ES实现1S钟切换一次实现近实时搜索逻辑。
Dobbu Buffer.png

推荐阅读:点击