Elasticsearch 寫入原理深入詳解
1、題記
Elasticsearch寫入流程,網上有視訊、筆記等各種版本,本文結合最新官方文件進行重新梳理,節省大家的時間。
思考如下幾個問題?
1、為什麼Elasticsarch是近實時,而不是準實時?
2、為什麼文件的CRUD操作是實時的?
3、為什麼Elasticsearch能做到保證資料不丟失?
4、Refresh、flush的作用是什麼? 什麼時候使用?
5、Elasticsearch儲存怎麼讓資料儲存在磁碟上,而不是在記憶體上?
本文會給出以上問題的答案。
2、Elasticsearch寫入核心概念
2.1 索引 index
Elasticsearch中的“索引”有點像關係資料庫中的 資料庫
。 它是儲存/索引資料的地方。
2.2 分片 shard
“分片”是Lucene的一個 索引
。 它本身就是一個功能齊全的搜尋引擎。
“索引”可以由單個分片組成,但通常由多個分片組成,一部分主分片、一部分副本分片。
ES預設5個主分片,1個副本分片;
副本分片的用途:(1)主節點故障時的故障轉移;(2)增加的讀取吞吐量。
2.3 分段 segment
每個分片包含多個“分段”,其中分段是倒排索引。
分段內的doc數量上限是2的31次方。
預設每秒都會生成一個segment檔案.
在分片中搜索將依次搜尋每個片段,然後將其結果合併到該分片的最終結果中。
檢視索引中分段資訊的方法:
1GET /test/_segments
2.4 倒排索引
“倒排索引”是Lucene用於使資料可搜尋的資料結構。
一圖勝千言!如下:索引、分片、分段的 關係
一目瞭然。

2.5 translog日誌檔案:
為了防止elasticsearch宕機造成資料丟失保證可靠儲存,es會將每次寫入資料同時寫到translog日誌中。
translog還用於提供 實時CRUD
。 當您嘗試按ID檢索,更新或刪除文件時,它會首先檢查translog中是否有任何最近的更改,然後再嘗試從相關段中檢索文件。 這意味著它始終可以實時訪問最新的已知文件版本。
2.6、倒排索引是不可變的
寫入磁碟的倒排索引永遠不會改變。
好處:無需鎖定,不用擔心多程序操作更改 資料導致資料不一致
問題。
壞處:經常被問到的問題,更新了詞典詞庫後,老的索引不能生效。如果要使其可搜尋,則必須重建整個索引。建議:reindex操作。
2.7 分段不可變
分段是不可變的。更新文件時,它實際上只是將舊文件標記為已刪除,併為新文件編制索引。合併過程還會清除這些舊的已刪除文件。
3、Elasticsearch寫入步驟拆解
步驟1:新document首先寫入記憶體Buffer快取中。
步驟2:每隔一段時間,執行“commitpoint”操作,buffer寫入新Segment中。
步驟3:新segment寫入檔案系統快取 filesystem cache。
步驟4:檔案系統快取中的index segment被fsync強制刷到磁碟上,確保物理寫入。 此時,新segment被開啟供search操作。
步驟5:清空記憶體buffer,可以接收新的文件寫入。
4、Elasticsearch refresh和flush
4.1、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.2、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
5、圖解Elasticsearch寫入持久化模型

圖的示意圖要從上往下看。
1、當新的文件寫入後,寫入 index buffer的同時會寫入translog。
2、refresh操作使得寫入文件搜尋可見;
3、flush操作使得filesystem cache寫入磁碟,以達到持久化的目的。
6、小結
相信經過梳理,開篇幾個問題的答案便非常清晰了。
知識的累積,需要過程,《高手》中尤其強調
第一手文件
的重要性。
第一手的
官方文件+原始碼
是根基,是最快、最準的方式。
推薦閱讀 :
1、 ofollow,noindex">Elasticsearch常見的5個錯誤及解決策略
加入知識星球,更短時間更快習得更多幹貨!