Elasticsearch寫入原理深刻詳解

一、題記
Elasticsearch寫入流程,網上有視頻、筆記等各類版本,本文結合最新官方文檔進行從新梳理,節省你們的時間。數據庫

思考以下幾個問題?緩存

一、爲何Elasticsarch是近實時,而不是準實時?
二、爲何文檔的CRUD操做是實時的?
三、爲何Elasticsearch能作到保證數據不丟失?
四、Refresh、flush的做用是什麼? 何時使用?
五、Elasticsearch存儲怎麼讓數據保存在磁盤上,而不是在內存上?數據結構

本文會給出以上問題的答案。elasticsearch

二、Elasticsearch寫入核心概念
2.1 索引 index
Elasticsearch中的「索引」有點像關係數據庫中的數據庫。 它是存儲/索引數據的地方。ide

2.2 分片 shard
「分片」是Lucene的一個索引。 它自己就是一個功能齊全的搜索引擎。性能

「索引」能夠由單個分片組成,但一般由多個分片組成,一部分主分片、一部分副本分片。優化

ES默認5個主分片,1個副本分片;
副本分片的用途:(1)主節點故障時的故障轉移;(2)增長的讀取吞吐量。搜索引擎

2.3 分段 segment
每一個分片包含多個「分段」,其中分段是倒排索引。
分段內的doc數量上限是2的31次方。
默認每秒都會生成一個segment文件.日誌

在分片中搜索將依次搜索每一個片斷,而後將其結果合併到該分片的最終結果中。視頻

查看索引中分段信息的方法:

1GET /test/_segments

2.4 倒排索引
「倒排索引」是Lucene用於使數據可搜索的數據結構。

一圖勝千言!以下:索引、分片、分段的關係一目瞭然。

Elasticsearch寫入原理深刻詳解
2.5 translog日誌文件:
爲了防止elasticsearch宕機形成數據丟失保證可靠存儲,es會將每次寫入數據同時寫到translog日誌中。

translog還用於提供實時CRUD。 當您嘗試按ID檢索,更新或刪除文檔時,它會首先檢查translog中是否有任何最近的更改,而後再嘗試從相關段中檢索文檔。 這意味着它始終能夠實時訪問最新的已知文檔版本。

2.六、倒排索引是不可變的
寫入磁盤的倒排索引永遠不會改變。

好處:無需鎖定,不用擔憂多進程操做更改數據致使數據不一致問題。

壞處:常常被問到的問題,更新了詞典詞庫後,老的索引不能生效。若是要使其可搜索,則必須重建整個索引。建議:reindex操做。

2.7 分段不可變
分段是不可變的。更新文檔時,它實際上只是將舊文檔標記爲已刪除,併爲新文檔編制索引。合併過程還會清除這些舊的已刪除文檔。

三、Elasticsearch寫入步驟拆解
步驟1:新document首先寫入內存Buffer緩存中。
步驟2:每隔一段時間,執行「commitpoint」操做,buffer寫入新Segment中。
步驟3:新segment寫入文件系統緩存 filesystem cache。
步驟4:文件系統緩存中的index segment被fsync強制刷到磁盤上,確保物理寫入。 此時,新segment被打開供search操做。
步驟5:清空內存buffer,能夠接收新的文檔寫入。

官方解讀地址:http://t.cn/EyhPQt5
這是傳統意義的寫入步驟,實際ES爲保證明時性,會作refresh操做。

四、Elasticsearch refresh和flush
4.一、refresh操做
相比於Lucene的提交操做,ES的refresh是相對輕量級的操做。

先將index-buffer中文檔(document)生成的segment寫到文件系統之中,這樣避免了比較損耗性能io操做,又可使搜索可見。

默認1s鍾刷新一次,因此說ES是近實時的搜索引擎,不是準實時。

注意:實際須要結合本身的業務場景設置refresh頻率值。調大了會優化索引速度。注意單位:s表明秒級。

1PUT /my_logs
2{
3 "settings": {
4 "refresh_interval": "30s"
5 }
6}

4.二、flush操做
新建立的document數據會先進入到index buffer以後,與此同時會將操做記錄在translog之中,當發生refresh時ranslog中的操做記錄並不會被清除,而是當數據從filesystem cache中被寫入磁盤以後纔會將translog中清空。

從filesystem cache寫入磁盤的過程就是flush。

步驟1:當translog變得太大時 ,能夠執行commit ponit操做。
步驟2:使用fsync刷新文件系統緩存,寫入磁盤。
步驟3:舊緩衝區被清除。

flush操做以下:

1POST /_flush?wait_for_ongoing

五、圖解Elasticsearch寫入持久化模型
Elasticsearch寫入原理深刻詳解

圖的示意圖要從上往下看。
一、當新的文檔寫入後,寫入 index buffer的同時會寫入translog。
二、refresh操做使得寫入文檔搜索可見;
三、flush操做使得filesystem cache寫入磁盤,以達到持久化的目的。

六、小結相信通過梳理,開篇幾個問題的答案便很是清晰了。知識的累積,須要過程,《高手》中尤爲強調第一手文檔的重要性。第一手的官方文檔+源碼是根基,是最快、最準的方式。

相關文章
相關標籤/搜索