前面在Elasticsearch原理(一):实时架构中已经介绍了关于Elasticsearch的实时部分架构,这片文章主要作为对前面Elasticsearch原理系列文章的补充,从Elasticsearch整体架构设计来深入了解Elasticsearch。
性能
首先是关于性能问题,前文也提到了Elasticsearch是可以做到近乎实时,这里就不过多介绍了,有兴趣的可以去上一篇实时架构了解。
#索引文件的更新
数据写入Elasticsearch,形成索引文件(segments),索引文件用看来支持用户查询。Elasticsearch默认每一秒会形成一个segment,就是说一个小时会有3600个segments。这些segments组成完整的数据分片。
merge
对于新的数据,增加segment可以实现数据的写入。而对于修改和删除,同样是依赖新生成的segment来进行修改/删除。因为Lucene的segment一旦形成,是不允许再进行修改的,所以Elasticsearch中所谓的删除是通过在新的segment中打标记实现的,修改则是通过新segment中通过对已有doc的_version来控制的。只有在触发segments merge,对多个segments进行合并成一个大的segment时,才会真正意义上删除掉数据。
segments merge
Elasticsearch自己有一个算法会自动触发segments merge,因为每一秒生成一个文件意味着会有很多很多文件,这是受文件句柄数限制的,所以必定要进行merge。
归并流程:
- 通过算法触发segments merge,将多个小的segments合并成一个大的segment。这个过程由独立线程完成,对Elasticsearch的功能没有影响。
- 合并过程中删除掉执行delete/update操作的原始doc。
- 刷新新的segment到磁盘。
- 检索请求从小的segment转移到大的segment中。
- 等待所有请求都转移成功后,删除小的segments。