1、概念
(1)segment file:每次refresh以后,同一个shard的数据就会生成一个segment file。一个shard由多个segment file组成。
(2)merge:ES在内部会对属于同个shard的segment file进行merge,merge的结果时一个更大的segment file。
2、choice
- merge的动作越少,merge带来的压力也就越少,写入性能会更好;但是segment file的文件数就越多,消耗文件句柄、内存、cpu也就越多;并且查询需要check每个segment file,查询性能也更差。
- merge的动作越频繁,则segment file越少,毋庸置疑查询的性能越好,但是频繁的merge会损害写入性能。
3、other
- 被标记删除的数据是在merge的时候才会被真正的删除。
- merge的时候会去修改commit point文件。
- 当merge的速度远落后于写入的速度时,ES会自动把写入的请求并发数限制为1,以防segment数过多。
4、Merge API
POST /INDEXNAME/_optimize?max_num_segments=1
- optimize API不要用于dynamic index,主要适用于不会再改变的index,例如按天、按周等存储的分片。
- optimize API不会被node throttle,会消耗许多的I/O,会导致search资源不足甚至节点不响应。
5、参数
参数 | 含义 | 备注 |
---|---|---|
index.merge.scheduler.max_thread_count | 用于merge的线程数 | HDD:1;SSD:cpu核数/2 |
index.translog.flush_threshold_size | translog的size阈值 | 调大translog的size阈值,能减小flush的频率,进而减小refresh的频率,从而减少segment数量 |
index.refresh_interval | refresh的时间间隔 | 调大时间间隔,能减小refresh的频率,从而减少segment数量 |
网友评论