Elasticsearch的Refresh與Flush操作

初次接觸到這兩個概念,估計都會覺得他們沒什么差別,都是為了在操作索引之后讓索引可以被實(shí)時性的搜索,不過它們還是有點(diǎn)不同的。

Elasticsearch底層依賴Lucene,這里我們介紹下Lucene的segment, Reopen,commit。

Segment

在ES中,基本的存儲單元是shard(分片),但是在更底層的Lucene上稍微有點(diǎn)不同,ES的每一個shard是Lucene的一個index(索引),Lucene的索引由多個segment組成,每個segment就是ES文檔的倒序索引,里面包含了一些term(詞)的mapping(映射)。

image-20190308171920616

當(dāng)每個ES的文檔創(chuàng)建的時候,都會寫入一個新的segment中,因此每次寫入的都是新的segment,所以不需要修改之前的segment。在刪除文檔的時候,只是在它屬于的segment哪里標(biāo)記為已刪除就可,沒有真正的從磁盤中抹除。更新也是同樣的,只是在對應(yīng)之前segment哪里標(biāo)記為邏輯刪除,然后新建一個新的segment。

Lucene Reopen

Reopen是為了讓數(shù)據(jù)可以可以被搜索到,盡管這個時候數(shù)據(jù)可以被搜索到,但是不一定保證數(shù)據(jù)已經(jīng)被持久化到磁盤中。

Lucene Commit

Commit就是為了讓數(shù)據(jù)持久化,每一次的Commit,不同segment的數(shù)據(jù)都會被持久化到磁盤中,雖然這樣可以讓數(shù)據(jù)更安全,但是每一次操作都會消耗系統(tǒng)資源,會有大量的IO操作。

Translog

ES在持久化的時候引入了一種新的方式,translog(transaction log),一個文檔被索引之后,就會被添加到內(nèi)存緩沖區(qū),并且 追加到了translog.

image-20190308172916212

ES的Refresh

默認(rèn)情況下,ES會每秒refresh一次,每次操作都會把內(nèi)存緩沖區(qū)的內(nèi)容拷貝到新創(chuàng)建的segment中去,這一步是在內(nèi)存中操作的,這個時候新的文檔就會被搜索了。也就是說ES是近實(shí)時性的搜索,差不多1s鐘,才能讓數(shù)據(jù)可以被搜索到。

image-20190308173147930

ES的Flush

Flush操作意味著,所有在內(nèi)存緩沖區(qū)的文檔被寫到新的Lucene Segment中,也就是所有在內(nèi)存中的segment被提交到了磁盤,同時清除translog。

image-20190308173450420

一般Flush的時間間隔會比較久,默認(rèn)30分鐘,或者當(dāng)translog達(dá)到了一定的大小,也會觸發(fā)flush操作。

最后

簡單來說,ES的refresh操作是為了讓最新的數(shù)據(jù)可以立即被搜索到。而flush操作則是為了讓數(shù)據(jù)持久化到磁盤中,另外ES的搜索是在內(nèi)存中處理的,因此Flush操作不影響數(shù)據(jù)能否被搜索到。

translog一般在進(jìn)行flush的時候被清空,一般在fsync和commit的時候被持久化到磁盤,默認(rèn)的translog是在6.x版本以后,每次請求都會fsync到磁盤。不過有些index.translog的配置可以設(shè)置

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容