根據官方文檔+看源碼+實驗總結出來的ES各種送出的作用與原理(對應版本7.2.0).
我本地是用xmind做的, 附上xmind的截圖.

ES送出.png
文字版如下:
ES送出
觸發方式
給索引設定
-
PUT /my-index-000001/_settings
{
"index" : {
"refresh_interval" : "1s"
}
}
給文檔增删改請求設定
-
PUT /test/_doc/1?refresh
{"test": "test"}
手動觸發
- POST /my-index-000001/_refresh
效果
refresh
- tlog不截斷
- 文檔可見
- 不會觸發段合并
- 不調用fsync, 不保證持久化
- 注意: 預設1s觸發一次, 但有個特殊設定, 隻有30s内接收到至少一個搜尋請求的時候, 索引的refresh才會按照設定時間頻率觸發, 也就是說沒有搜尋請求的索引的refresh不會自動觸發.
flush
- tlog截斷
- 文檔不可見
- 可能觸發段合并
- 調用fsync, 保證持久化
- 沒有類似于Solr的openSearcher=true選項, 不能讓文檔可見.
原理
refresh
- 觸發lucene的reopen, 把in-memory buffer轉化為in-memory segment.
flush
- 觸發lucene的commit, 将in-memory buffer送出到新的段, 與已有的in-memory segments一起送出到硬碟.
lucene
- flush
- 1. 把記憶體段寫到硬碟
- 2. 不調用fsync
- 3. 不更新segment_N檔案
複制
- commit
- 1. 把記憶體段寫到硬碟
- 2. 調用fsync
- 3. 更新segment_N檔案
複制
建議
硬送出頻率
- 參考tlog的硬碟大小, 使tlog的大小合理, 否則可能會使重新開機時間過長
軟送出頻率
- 在滿足業務需求的情況下盡可能長一些
不要使用kill -9
- 正确的步驟
- 停止索引程式
- 手動硬送出或等待自動送出觸發
- 停止ES服務
複制
T-log
作用
- 異常恢複
- RealTime Get By ID