天天看點

refresh java,Elasticsearch的Refresh與Flush操作

初次接觸到這兩個概念,估計都會覺得他們沒什麼差别,都是為了在操作索引之後讓索引可以被實時性的搜尋,不過它們還是有點不同的。

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

Segment

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

refresh java,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.

refresh java,Elasticsearch的Refresh與Flush操作

ES的Refresh

預設情況下,ES會每秒refresh一次,每次操作都會把記憶體緩沖區的内容拷貝到新建立的segment中去,這一步是在記憶體中操作的,這個時候新的文檔就會被搜尋了。也就是說ES是近實時性的搜尋,差不多1s鐘,才能讓資料可以被搜尋到。

refresh java,Elasticsearch的Refresh與Flush操作

ES的Flush

Flush操作意味着,所有在記憶體緩沖區的文檔被寫到新的Lucene Segment中,也就是所有在記憶體中的segment被送出到了磁盤,同時清除translog。

refresh java,Elasticsearch的Refresh與Flush操作

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

最後

簡單來說,ES的refresh操作是為了讓最新的資料可以立即被搜尋到。而flush操作則是為了讓資料持久化到磁盤中,另外ES的搜尋是在記憶體中處理的,是以Flush操作不影響資料能否被搜尋到。

translog一般在進行flush的時候被清空,一般在fsync和commit的時候被持久化到磁盤,預設的translog是在6.x版本以後,每次請求都會fsync到磁盤。不過有些index.translog的配置可以設定