在Elasticsearch中,`_refresh`和`_flush`操作雖然看似都與“刷新”有關,但它們的功能和作用范圍有顯著區別:
?
`_refresh`操作
- 目的:使索引操作(如新增、更新、刪除文檔)后的更改能夠立即被搜索到。
- 工作原理:將內存緩沖區(in-memory buffer)中的數據寫入到一個新的Lucene segment中,并將其加載到文件系統緩存(OS cache)中,此時文檔可以被搜索到,但數據尚未寫入磁盤。
- 觸發方式:
? - 默認情況下,Elasticsearch每秒自動執行一次`_refresh`操作,但僅在最近30秒內有搜索請求的索引上執行。
? - 可以通過設置`index.refresh_interval`來調整刷新間隔,或者在索引操作時通過`?refresh=true`參數強制觸發。
? - 當內存緩沖區達到一定大小(默認為節點堆內存的10%)時,也會觸發`_refresh`。
- 特點:`_refresh`操作是同步的,會在操作完成前阻塞請求。
?
`_flush`操作
- 目的:將內存中的數據和事務日志(translog)中的操作永久寫入磁盤,確保數據的持久性。
- 工作原理:
? - `_flush`操作會先執行`_refresh`,將內存緩沖區中的數據寫入新的Lucene segment并加載到文件系統緩存中。
? - 然后,將這些segment從文件系統緩存強制刷入磁盤(通過`fsync`操作),并清空事務日志。
- 觸發方式:
? - 默認情況下,Elasticsearch會在以下情況下自動觸發`_flush`操作:
? ? - 每30分鐘定時觸發。
? ? - 當事務日志大小超過512MB時。
? ? - 在每次索引、批量、刪除或更新操作完成后。
? - 也可以通過API手動觸發`_flush`操作。
- 特點:`_flush`操作是異步的,不會阻塞請求。
?
主要區別
- 數據可見性:`_refresh`使數據在搜索中可見,而`_flush`主要用于數據的持久化,不影響數據的搜索可見性。
- 操作范圍:`_refresh`操作主要涉及內存緩沖區和文件系統緩存,而`_flush`操作會將數據寫入磁盤并清空事務日志。
- 性能影響:`_refresh`操作的開銷相對較小,但頻繁的`_refresh`可能會影響寫入性能;`_flush`操作的開銷較大,但可以通過調整參數優化性能。
?
總結來說,`_refresh`用于使新文檔能夠被搜索到,而`_flush`用于確保數據持久化到磁盤,兩者在Elasticsearch的索引管理中各自扮演著重要的角色。