目录
1:什么是segment
2:segment的数据结构
3:segmen merge的意义
4:segment merge 参数
1:什么是segment
es底层是由lucene实现,每个索引都是一个lucene文件,每个索引包含多个shard和多个replica。每个lucene文件又多个segment组成。具体es写入和读取的流程参见官网。
2:segment的数据结构
lucene有2种文件格式,具体是根据 X GET _cat/segments/${index_name}?v
返回的CompoundFile 判断的 数据结构参见
3:segmen merge的意义
如果数据segment过多,索引每次查询时会加载全部segment信息到内存,要查询全部的segment导致查询效率降低。同时如果有大量删除的文档存在,磁盘空间不能释放,实际索引文件会很大。分片分配、分片均衡的时候会浪费大量资源(IO,带宽,CPU等)导致集群yellow。所以segment数量越少,索引效率越高。
4:segment merge 参数
segment merge的几个重要参数
这些参数支持动态针对索引设置
PUT INDEX/_settings
{
"merge.policy.max_merge_at_once_explicit": "30", // force merge时并行最大合并段个数 默认30
"merge.policy.max_merge_at_once": "10", // 普通merge时 一次最大合并的段个数 默认10
"merge.policy.max_merged_segment": "5gb", // merge之后产生的segment最大大小 默认5g
"merge.policy.expunge_deletes_allowed": "10.0", // 当执行force merge包含 only_expunge_deletes=true时,当segment中的删除文档数占比超过该阈值后合并 默认10%
"merge.policy.segments_per_tier": "10.0" //每个tier允许的最大segment个数默认10个}
merge分为自然merge和force merge 自然merge es只要有写入都会进行。
forcemerge手工触发api
${index_name}/_forcemerge?only_expunge_deletes=true&max_num_segments=
max_num_segments 期望合并的最大segment个数。
only_expunge_deletes是否释放、回收删除文档空间。
X GET _cat/segments/${index_name}?v 查看索引segment信息。
_tasks?detailed=true&actions=*forcemerge 查看force merge 任务情况。
PS:forcemerge一但触发,无法取消task。由于forcemerge期间会消耗大量的io和cpu 不建议在有数据写入的热索引上执行。以免引起查询变慢和集群异常导致的数据丢失,甚至不能恢复的索引问题。
可以通过调节force_merge线程数(es默认单线程force merge)和 max_merge_at_once_explicit参数适当减少资源消耗。



