初次接觸到這兩個概念,估計都會以爲他們沒什麼差異,都是爲了在操做索引以後讓索引能夠被實時性的搜索,不過它們仍是有點不一樣的。
Elasticsearch底層依賴Lucene,這裏咱們介紹下Lucene的segment, Reopen,commit。
Segment
在ES中,基本的存儲單元是shard(分片),可是在更底層的Lucene上稍微有點不一樣,ES的每個shard是Lucene的一個index(索引),Lucene的索引由多個segment組成,每一個segment就是ES文檔的倒序索引,裏面包含了一些term(詞)的mapping(映射)。安全
當每一個ES的文檔建立的時候,都會寫入一個新的segment中,所以每次寫入的都是新的segment,因此不須要修改以前的segment。在刪除文檔的時候,只是在它屬於的segment哪裏標記爲已刪除就可,沒有真正的從磁盤中抹除。更新也是一樣的,只是在對應以前segment哪裏標記爲邏輯刪除,而後新建一個新的segment。
Lucene Reopen
Reopen是爲了讓數據能夠能夠被搜索到,儘管這個時候數據能夠被搜索到,可是不必定保證數據已經被持久化到磁盤中。
Lucene Commit
Commit就是爲了讓數據持久化,每一次的Commit,不一樣segment的數據都會被持久化到磁盤中,雖然這樣可讓數據更安全,可是每一次操做都會消耗系統資源,會有大量的IO操做。
Translog
ES在持久化的時候引入了一種新的方式,translog(transaction log),一個文檔被索引以後,就會被添加到內存緩衝區,而且 追加到了translog.app
ES的Refreshide
默認狀況下,ES會每秒refresh一次,每次操做都會把內存緩衝區的內容拷貝到新建立的segment中去,這一步是在內存中操做的,這個時候新的文檔就會被搜索了。也就是說ES是近實時性的搜索,差很少1s鍾,才能讓數據能夠被搜索到。
索引
ES的Flush內存
Flush操做意味着,全部在內存緩衝區的文檔被寫到新的Lucene Segment中,也就是全部在內存中的segment被提交到了磁盤,同時清除translog。資源
通常Flush的時間間隔會比較久,默認30分鐘,或者當translog達到了必定的大小,也會觸發flush操做。文檔
最後it
簡單來講,ES的refresh操做是爲了讓最新的數據能夠當即被搜索到。而flush操做則是爲了讓數據持久化到磁盤中,另外ES的搜索是在內存中處理的,所以Flush操做不影響數據可否被搜索到。
translog通常在進行flush的時候被清空,通常在fsync和commit的時候被持久化到磁盤,默認的translog是在6.x版本之後,每次請求都會fsync到磁盤。不過有些index.translog的配置能夠設置io