elasticsearch中 refresh 和flush區別


refresh操作
當我們向ES發送請求的時候,我們發現es貌似可以在我們發請求的同時進行搜索。而這個實時建索引並可以被搜索的過程實際上是一次es 索引提交(commit)的過程,如果這個提交的過程直接將數據寫入磁盤(fsync)必然會影響性能,所以es中設計了一種機制,即:先將index-buffer中文檔(document)解析完成的segment寫到filesystem cache之中,這樣避免了比較損耗性能io操作,又可以使document可以被搜索。以上從index-buffer中取數據到filesystem cache中的過程叫做refresh。
 
refresh操作可以通過API設置:
POST /index/_settings
{“refresh_interval”: “10s”}
當我們進行大規模的創建索引操作的時候,最好將將refresh關閉。
POST /index/_settings
{“refresh_interval”: “-1″}
 
es默認的refresh間隔時間是1s,這也是為什么ES可以進行近乎實時的搜索。
 
flush操作與translog
我們可能已經意識到如果數據在filesystem cache之中是很有可能在意外的故障中丟失。這個時候就需要一種機制,可以將對es的操作記錄下來,來確保當出現故障的時候,保留在filesystem的數據不會丟失,並在重啟的時候可以從這個記錄中將數據恢復過來。elasticsearch提供了translog來記錄這些操作。
當向elasticsearch發送創建document索引請求的時候,document數據會先進入到index buffer之后,與此同時會將操作記錄在translog之中,當發生refresh時(數據從index buffer中進入filesystem cache的過程)translog中的操作記錄並不會被清除,而是當數據從filesystem cache中被寫入磁盤之后才會將translog中清空。而從filesystem cache寫入磁盤的過程就是flush。可能有點暈,我畫了一個圖幫大家理解這個過程:
總結一下translog的功能:
1.保證在filesystem cache中的數據不會因為elasticsearch重啟或是發生意外故障的時候丟失。
2.當系統重啟時會從translog中恢復之前記錄的操作。
3.當對elasticsearch進行CRUD操作的時候,會先到translog之中進行查找,因為tranlog之中保存的是最新的數據。
4.translog的清除時間時進行flush操作之后(將數據從filesystem cache刷入disk之中)。
 
 
再總結一下flush操作的時間點:
1.es的各個shard會每個30分鍾進行一次flush操作。
2.當translog的數據達到某個上限的時候會進行一次flush操作。
 
 
有關於translog和flush的一些配置項:
index.translog.flush_threshold_ops:當發生多少次操作時進行一次flush。默認是 unlimited。
index.translog.flush_threshold_size:當translog的大小達到此值時會進行一次flush操作。默認是512mb。
index.translog.flush_threshold_period:在指定的時間間隔內如果沒有進行flush操作,會進行一次強制flush操作。默認是30m。
index.translog.interval:多少時間間隔內會檢查一次translog,來進行一次flush操作。es會隨機的在這個值到這個值的2倍大小之間進行一次操作,默認是5s。
------------------------------------------------------------------------------------------------

在ES中, 要保證被索引的文檔能夠立即被搜索到, 有兩種方法:_refresh 或者_flush。

那么二者的區別是什么呢?要搞懂這個問題, 就需要對ES中文檔的索引過程有個了解。

我們知道ES的索引數據是寫入到磁盤上的。但這個過程是分階段實現的,因為IO的操作是比較費時的。

當一個文檔進入ES的初期, 文檔是被存儲到內存里的,默認經過1s之后, 會被寫入文件系統緩存,這樣該文檔就可以被搜索到了,注意,此時該索引數據被沒有最終寫入到磁盤上。如果你對這1s的時間間隔還不滿意, 調用_refresh就可以立即實現內存->文件系統緩存, 從而使文檔可以立即被搜索到。

所以refresh實現的是文檔數據從內存到文件系統緩存的過程。

再來看flush,flush是用於translog的。

ES為了數據的安全, 在接受寫入的文檔的時候, 在寫入內存buffer的同時, 會寫一份translog日志,從而在出現程序故障/磁盤異常時, 保證數據的完整和安全。flush會觸發lucene commit,並清空translog日志文件。 translog的flush是ES在后台自動執行的,默認情況下ES每隔5s會去檢測要不要flush translog,默認條件是:每 30 分鍾主動進行一次 flush,或者當 translog 文件大小大於 512MB主動進行一次 flush。對應的配置是index.translog.flush_threshold_period 和 index.translog.flush_threshold_size

需要指出的是, 從ES2.0開始,每次 index、bulk、delete、update 完成的時候,一定觸發flush translog 到磁盤上,才給請求返回 200 OK。這個改變提高了數據安全性,但是會對寫入的性能造成不小的影響。在寫入效率優先的情況下,可以在 index template 里設置如下參數:"index.translog.durability":"async" 和 "index.translog.sync_interval":30s (默認是5s)。

參考:

1. http://stackoverflow.com/questions/19963406/refresh-vs-flush

2.https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-translog.html

3. http://kibana.logstash.es/content/elasticsearch/principle/realtime.html

https://www.elastic.co/guide/cn/elasticsearch/guide/current/translog.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM