ElasticSearch常见经典面试题

1、什么是ES,为什么要用ES?

Elasticsearch是一个基于Lucene的搜索引擎。它提供了具有HTTP Web界面和无架构JSON文档的分布式,多租户能力的全文搜索引擎。Elasticsearch是用Java开发的,根据Apache许可条款作为开源发布。

用ES做一个全文索引

2、ElasticSearch中的分片是什么?

保障可靠性

3、Elasticsearch中的倒排索引是什么? 这个问题很重要

倒排索引是搜索引擎的核心。

在Es中,一个分片是一个Lucene索引

Lucene的倒排索引由一个term词典表+倒排列表组成

term词典表:用来维护文档集合中出现过的所有单词的相关信息,同时用来记载某个单词对应的倒排列表在倒排文件中的位置信息。

倒排列表:用来记录有哪些文档包含了某个单词。一般在文档集合里会有很多文档包含某个单词,每个文档会记录文档编号(DocID)

其他问题见:https://www.jianshu.com/p/642d5115724f

4、ES  写流程的关键步骤

refresh:

引入此操作的目的:避免频繁的fsync刷盘操作

原理:

在ES中,当写入一个新文档时,首先被写入到内存缓存中,默认每1秒将in-memory index buffer中的文档生成一个新的段并清空原有in-memory index buffer,新写入的段变为可读状态,但是还没有被完全提交。该新的段首先被写入文件系统缓存,保证段文件可以正常被打开和读取,后续再进行刷盘操作。由此可以看到,ES并不是写入文档后马上就可以搜索到,而是一个近实时的搜索(默认1s后)。

注意:不完整提交(因为没有刷盘)

写translog:

目的:保障可靠性。异常情况恢复数据

translog就是ES的一个事务日志,当发生一个文档变更操作时,文档不仅会写入到内存缓存区也会同样记录到事务日志中,事务日志保证还没有被刷到磁盘的操作的进行持久化。translog持久化后保证即使意外断电或者ES程序重启,ES首先通过磁盘中最后一次提交点恢复已经落盘的段,然后将该提交点之后的变更操作通过translog进行重放,重构内存中的segment。

基本流程:

  • 一个文档被索引之后,就会被添加到内存缓冲区,并且追加到了translog
  • 默认每秒refresh一次,refresh会清空内存缓存,但是不会清空translog
  • refresh操作不断发生,更多的文档被添加到内存缓冲区和追加到translog
  • translog周期性通过fsync进行刷盘,默认5s,可通过参数index.translog.sync_interval(一般刷盘间隔为120s)、index.translog.durability(一般为async)控制,保证应用重启后先确认最后记录的commit point,commit point之后的变更操作通过落盘的translog进行重构恢复段
  • 默认当translog太大(512MB)时,进行flush操作 

flush:

translog中所有的段进行全量提交并对translog进行截断的操作叫做flush,flush操作期间会做的事项主要有:

  • 强制refresh,将内存缓冲区所有文档写入一个新的段,写入到文件系统缓存并将旧的内存缓冲区被清空(refresh)
  • 将最新的commit point写入磁盘
  • 将文件系统缓存中的段通过fsync进行刷盘
  • 删除老的translog,启动新translog

 

posted @ 2020-02-22 21:10  再见傅里叶  阅读(2867)  评论(0编辑  收藏  举报