码迷,mamicode.com
首页 > 其他好文 > 详细

Elasticsearch-分片原理1

时间:2017-11-28 01:28:00      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:str   合并   style   tin   refresh   block   int   日志   elastic   


Elasticsearch版本:6.0


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

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

    技术分享图片

关于索引和分片

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

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

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

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

    技术分享图片

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

    技术分享图片

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

    技术分享图片

    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

    技术分享图片

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

     技术分享图片

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

    技术分享图片

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

    技术分享图片

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


段合并

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

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

    技术分享图片

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

    技术分享图片

Elasticsearch-分片原理1

标签:str   合并   style   tin   refresh   block   int   日志   elastic   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!