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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM