在索引數據的時候,要保證被索引的文檔能夠立即被搜索到,就要涉及到_refresh 和_flush這兩個方法。
1、fresh
當索引一個文檔,文檔先是被存儲在內存里面,默認1秒后,會進入文件系統緩存,這樣該文檔就可以被搜索到,但是該文檔還沒有存儲到磁盤上,如果機器宕機了,數據就會丟失。
因此fresh實現的是從內存到文件系統緩存的過程。
2、flush
flush是用於translog的。
ES為了數據的安全,在接受寫入文檔的時候,在寫入內存buffer的同時,會寫一份translog日志,從而在出現程序故障或磁盤異常時,保證數據的安全。
flush會觸發lucene commit,並清空translog日志文件。
translog的flush是ES在后頭自動運行的。默認情況下ES每隔5s會去檢測要不要flush translog,默認條件是:每 30 分鍾主動進行一次 flush,或者當 translog 文件大小大於 512MB主動進行一次 flush。
每次 index、bulk、delete、update 完成的時候,一定觸發flush translog 到磁盤上,才給請求返回 200 OK。這個改變提高了數據安全性,但是會對寫入的性能造成不小的影響。
在寫入效率優先的情況下,可以在 index template 里設置如下參數:"index.translog.durability":"async" 和 "index.translog.sync_interval":30s (默認是5s)。