Elasticsearch-分片原理1


Elasticsearch版本:6.0


    Elasticsearch基于Lucene,采用倒排索引写入磁盘,Lucene引入了按段搜索的概念,来动态更新索引。

    一个Lucene索引包含一个提交点和三个短,如图:

    image

关于索引和分片

    一个Lucene索引在Elasticsearch成为分片,一个Elasticsearch索引是分片的集合。

    Elasticsearch在索引中搜索时,它发送查询到每一个属于索引的分片,然后合并每个分片的结果到一个全局的结果集。

按段写入磁盘的流程如下:

    1、新文档的Lucene索引到达内存缓存

    image

     2、提交后新的段添加到提交点,并清空内存缓存

    image

    3、在从内存缓存提交到磁盘的过程中,文档会先被写入到文件系统缓存,这一步的代价比刷新到磁盘的代价低,而在文件缓存就可以像其他文件一样被打开读取。而Lucene在此时就可以对这个未完成提交的文档进行搜索。

    image

    Elasticsearch中,写入和打开一个新段的过程叫refresh,默认情况每个分片每秒自动刷新一次,所以称Elasticsearch是近实时搜索的。文档的变化并不是立即对搜索可见,但会在一秒之内变为可见。

刷新时间可以手动指定

POST /_refresh 刷新(Refresh)所有的索引。

POST /blogs/_refresh 只刷新(Refresh) blogs 索引。

关闭或者设置刷新时间

PUT /my_logs/_settings
{ "refresh_interval": -1 } 
PUT /my_logs/_settings
{ "refresh_interval": "1s" } 

    为了保证Elasticsearch的可靠性,增加了translog事务日志,每次Elasticsearch的操作均进行了日志记录。

    1.一个文档被索引之后,就会被添加到内存缓冲区,并且 追加到了 translog

    image

    2. 刷新(refresh)完成后, 缓存被清空但是事务日志不会

     image

    3.这个进程继续工作,更多的文档被添加到内存缓冲区和追加到事务日志

    image

    4. 每隔一段时间--例如 translog 变得越来越大--索引被刷新(flush);一个新的 translog 被创建,并且一个全量提交被执行,并且事务日志被清空

    image

    这个执行一个提交并且截断 translog 的行为在 Elasticsearch 被称作一次 flush 。 分片每30分钟被自动刷新(flush),或者在 translog 太大的时候也会刷新。


段合并

    Elasticsearch通过后台进行段合并,合并时会将旧的已删除的文档从文件系统清除。

    1、两个提交了的段和一个未提交的段正在被合并到一个更大的段

    image

    2、一旦合并结束,老的段被删除

    image

原文地址:https://www.cnblogs.com/bigshark/p/7906530.html