Elasticsearch的Refresh與Flush操作

初次接觸到這兩個概念,估計都會覺得他們沒什麼差別,都是爲了在操作索引之後讓索引可以被實時性的搜索,不過它們還是有點不同的。
Elasticsearch底層依賴Lucene,這裏我們介紹下Lucene的segment, Reopen,commit。
Segment
在ES中,基本的存儲單元是shard(分片),但是在更底層的Lucene上稍微有點不同,ES的每一個shard是Lucene的一個index(索引),Lucene的索引由多個segment組成,每個segment就是ES文檔的倒序索引,裏面包含了一些term(詞)的mapping(映射)。

Elasticsearch的Refresh與Flush操作

當每個ES的文檔創建的時候,都會寫入一個新的segment中,因此每次寫入的都是新的segment,所以不需要修改之前的segment。在刪除文檔的時候,只是在它屬於的segment哪裏標記爲已刪除就可,沒有真正的從磁盤中抹除。更新也是同樣的,只是在對應之前segment哪裏標記爲邏輯刪除,然後新建一個新的segment。
Lucene Reopen
Reopen是爲了讓數據可以可以被搜索到,儘管這個時候數據可以被搜索到,但是不一定保證數據已經被持久化到磁盤中。
Lucene Commit
Commit就是爲了讓數據持久化,每一次的Commit,不同segment的數據都會被持久化到磁盤中,雖然這樣可以讓數據更安全,但是每一次操作都會消耗系統資源,會有大量的IO操作。
Translog
ES在持久化的時候引入了一種新的方式,translog(transaction log),一個文檔被索引之後,就會被添加到內存緩衝區,並且 追加到了translog.

Elasticsearch的Refresh與Flush操作

ES的Refresh

默認情況下,ES會每秒refresh一次,每次操作都會把內存緩衝區的內容拷貝到新創建的segment中去,這一步是在內存中操作的,這個時候新的文檔就會被搜索了。也就是說ES是近實時性的搜索,差不多1s鍾,才能讓數據可以被搜索到。
Elasticsearch的Refresh與Flush操作

ES的Flush

Flush操作意味着,所有在內存緩衝區的文檔被寫到新的Lucene Segment中,也就是所有在內存中的segment被提交到了磁盤,同時清除translog。

Elasticsearch的Refresh與Flush操作

一般Flush的時間間隔會比較久,默認30分鐘,或者當translog達到了一定的大小,也會觸發flush操作。

最後

簡單來說,ES的refresh操作是爲了讓最新的數據可以立即被搜索到。而flush操作則是爲了讓數據持久化到磁盤中,另外ES的搜索是在內存中處理的,因此Flush操作不影響數據能否被搜索到。
translog一般在進行flush的時候被清空,一般在fsync和commit的時候被持久化到磁盤,默認的translog是在6.x版本以後,每次請求都會fsync到磁盤。不過有些index.translog的配置可以設置

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章