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。