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