一個ES index 包含有多個sharding, sharding 主要用於分布式。 一個sharding里面也可以包含多個segment. es 在indexing 的時候會產生很多的segments。 segments 太多會導致文件句柄浪費嚴重, 並且搜索性能底下。 ES 自己也會去做merge, 算法和cassandra 的sizeTiered 算法類似(但稍遜一些)。合並后,search 性能有所提升,文件句柄所有下降。
如果你想強制進行一次激烈的compact將每個sharding 里面的indexes 數目都變成1.
POST {index-list}/_optimize?max_num_segments=1
然后可以通過
GET {index-list}/_segments 來確認segment count 的數目。
但如果在merge 的時候還有寫入,你也有可能發現還有很多segments, 但那些segment 里面的document 會比較少。
在我自己的一次測試中,compact 之前有150 多個segments, compact 后只有5個, 因為有5個sharding. 文件句柄數從2000+ 降到了114 個。
如果要調整es 的默認compact 參數,可以參考 http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index-modules-merge.html
目前我自己遇到的情況是:
我們的某些log 每天產生一個index, 大小在30G左右。有些1個月產生一個log, 大小40~50G. 我們會有一個后台程序,每次產生新的log 后就會對老的index 進行全面的compact.