即使是不成熟的尝试,也胜于胎死腹中的策略。

ES索引的segments数量如何限制?

匿名 | 发布于2017年12月14日 | 阅读数:9843


网上看到有一种控制ES索引segment数量的方法:
curl -XPOST 'http://localhost:9200/indexname/_optimize?max_num_segments=5'
 
似乎只对索引大小不变的情况有效,但是现在遇到的情况是ES索引每天都有增量数据,索引的大小一直在变化,执行以上操作并不能有效的控制索引segments数量,而且此操作手工执行,请问大家有没有更好的方法?
比如在创建索引的时候,在_settings配置里面增加什么配置项,让ES索引的segments数量可以一直保持特定的值?
 
已邀请:

BrickXu - BlackOps@Qunar

赞同来自: elisha cccthought

答案是并没有什么配置可以控制,其实稍微阅读下elasticsearch的文档即可发现,elasticsearch本身有一个refresh_interval的设置,也就是说,数据从写入到可以被检索,是存在一个时间间隔的,在这个间隔内,你可以认为是在build segment数据结构,结合你的情况,就是segment在索引内源源不断的被创建。
 
那么问题来了,如果光创建不管理,那么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

ES新人强答一波:这个api适用的场景是那些只读索引,不应该被用在一个动态索引。我的理解:现在每天有增量数据,是不能控制一个索引的segments数量,但是可以设置刷新频率和合并策略来减少segment的数量

ELKer

赞同来自: elisha

很好的文章关于segment merge的:https://www.outcoldman.com/en/ ... ings/

要回复问题请先登录注册