ES索引的segments数量如何限制?
匿名 | 发布于2017年12月14日 | 阅读数:11012网上看到有一种控制ES索引segment数量的方法:
curl -XPOST 'http://localhost:9200/indexname/_optimize?max_num_segments=5'
似乎只对索引大小不变的情况有效,但是现在遇到的情况是ES索引每天都有增量数据,索引的大小一直在变化,执行以上操作并不能有效的控制索引segments数量,而且此操作手工执行,请问大家有没有更好的方法?
比如在创建索引的时候,在_settings配置里面增加什么配置项,让ES索引的segments数量可以一直保持特定的值?
3 个回复
BrickXu - BlackOps@Qunar
赞同来自: elisha 、cccthought
那么问题来了,如果光创建不管理,那么segment文件越来越多,最终你的程序将会耗尽FD,出现too many open files的问题,所以elasticsearch会有一系列的daemon任务,去扫描以及合并小的segment,但是,并不会保证把segment合并到一个固定的数量(合并的细节可以参考[url=https://www.youtube.com/watch?v=YW0bOvLp72E]https://www.youtube.com/watch?v=YW0bOvLp72E[/url]),原因也很简单,merge毕竟是一个资源消耗巨大的事情,elasticsearch/lucene倾向于“刚刚好”,而不会追求极致(即你说的固定数量)。
所以回归到你的问题,elasticsearch提供了force merge的API,强制归档所有数据,主要是针对不再写入的索引来说的,合并可以降低内存/磁盘的消耗,提高检索效率,是一个偏向运维的API,更需要人工介入。
PS:索引还有数据写入,执行force merge,会降低写入的效率,这是个危险的操作。
ELKer
赞同来自: elisha
ELKer
赞同来自: elisha