1. forcemerge接口
? ? 強制段合并,設置為1時,是期望最終只有1個索引段。但實際情況是,合并的結果是段的總數會減少,但仍大于1,可以多次執行強制合并的命令。
? ? 設置的的目標值越小。合并消耗的時間會越久。
curl -XPOST http://127.0.0.1:9200/logstash-2015-06.10/_forcemerge?max_num_segments=1
? ? 段合并會消耗較多的磁盤IO資源,不要在大量建立索引時,查詢較多時,執行該操作。
2.段合并參數設置
- index.merge.policy.floor_segment 默認 2MB,小于這個大小的 segment,優先被歸并。
- index.merge.policy.max_merge_at_once 默認一次最多歸并 10 個 segment
- index.merge.policy.max_merge_at_once_explicit 默認 forcemerge 時一次最多歸并 30 個 segment。
- index.merge.policy.max_merged_segment 默認 5 GB,大于這個大小的 segment,不用參與歸并。forcemerge 除外。
? ? ? 根據這段策略,其實我們也可以從另一個角度考慮如何減少 segment 歸并的消耗以及提高響應的辦法:加大 flush 間隔,盡量讓每次新生成的 segment 本身大小就比較大。
? ? ? fresh和flush的概念。fresh默認為1s,意味著近乎實時查詢,索引建立好后1s后就可以進行查詢。這時是將索引放到了文件系統的緩存中,雖然可以查詢,但是并沒有真正寫入到磁盤中,存在數據丟失的風險。所以es引入了translog,內存中的數據在寫入文件系統的緩存中時,同時在translog中記錄一份,一旦es重啟,未寫入磁盤中的數據還可以從translog中進行恢復。
? ? ? flush會觸發lucene commit,并清空translog文件,這個過程稱為flush。
? ? ??默認情況下ES每隔5s會去檢測要不要flush translog,默認條件是:每 30 分鐘主動進行一次 flush,或者當 translog 文件大小大于 200MB主動進行一次 flush。
? ? ??
? ? ?