根据ES的写入原理分析,默认每秒从memory buffer里面搬运数据到filesystem cache,生产一个segments段,由后台程序定期分梯队进行合并(该部分原理还没深入研究),不过从查看到的segments数量,大小来看,默认的合并效果并不好,会出现很多小segments没有合并。根据操作系统的原理,一个索引打开太多的文件,势必会影响性能,ES也开放了相应的接口给用户对这些segments经行手动合并。
下面介绍一下forcemerge
相关命令
执行合并segment
计算规则(参考):按照每个segment 5GB 来评估 max_num_segments
,根据实际情况,比如 index最大的分片5gb,max_num_segments
就是1.
max_num_segments取值为:max_num_segments =(单个索引的大小G/分片数/5G)
建议每天业务低峰进行一次
POST indexname/_forcemerge?max_num_segments=1
参数说明:
参数 | 说明 |
---|---|
max_num_segments | 合并到的段数。要完全合并索引,请将其设置为1。默认值是简单地检查是否需要执行合并,如果需要,则执行合并。 |
only_expunge_deletes | 合并过程应该只删除其中有删除的段。在Lucene中,不会从段中删除文档,而只是将其标记为已删除。在段的合并过程中,将创建一个没有这些删除的新段。此标志仅允许合并具有删除的段。默认为false。请注意,这不会超过 index.merge.policy.expunge_deletes_allowed阈值。 |
flush | 强制合并后是否应该执行刷新。默认为 true。 |
查看每台机器执行merge线程数
GET _cat/thread_pool/force_merge?v&s=name
查看哪些index在merge
GET /_cat/indices/?s=segmentsCount:desc&v&h=index,segmentsCount,segmentsMemory,memoryTotal,mergesCurrent,mergesCurrentDocs,storeSize,p,r
使用task api 查看force merge
GET _tasks?detailed=true&actions=*forcemerge
查看segment
GET _cat/segments?v&h=shard,segment,size.memory
查看索引大小
GET _cat/indices/ads_user_profile?v