zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    博客背景美化——动态雪花飘落
    尼姆博弈+SG函数
    2016 CCPC-Final-Wash(优先队列+贪心)
    【php】---mysql语法增、删、改、查---【巷子】
    【php】---mysql---基本操作及使用---【巷子】
    【Object.prototype.toString.call()】---判断某个对象属于哪种内置类型------【巷子】
    【webpack】---模块打包机webpack基础使用---【巷子】
    设计模式---003代理模式---【巷子】
    设计模式---002适配模式---【巷子】
    设计模式---001单例模式---【巷子】
  • 原文地址:https://www.cnblogs.com/bigshark/p/7906530.html
Copyright © 2011-2022 走看看