以下参数,在一定程度上可以优化ES节点的IO压力。
整个 merge 参数主要分为以下三类:限速,新段生成,forcemerge 参数。
限速
index.merge.scheduler.max_thread_count
最大 merge 线程数,如果是 ssd 盘可以适当调大该数值
index.merge.scheduler.auto_throttle
是否开启io限流,默认限制为 20MB/s
index.merge.scheduler.max_merge_count
当前最大执行的 merge 任务数
index.merge.policy.max_merge_at_onc
单次最大允许多少个段合并
新段生成
index.merge.policy.floor_segment
小于此的段将“向上取整”到此大小,这是为了防止频繁刷新微小段,从而避免索引中出现长尾效应。默认阈值为 2mb。如果索引比较大,有很多小的 Segment 可以适当提升该阈值,这样可以降低 Segment 的总量,从而降低查询时产生的 io。提升该阈值会带来更频繁的 Merge 操作。
index.merge.policy.max_merged_segment
最大的段大小默认是 5GB,ES 默认情况下不会生成大于 5GB 的段,在自动merge中,如果两个段合并后的大小会超过5gb,ES 会放弃该次合并操作。forcemerge 生成的段不受该阈值控制。
index.merge.policy.segments_per_tier
每层允许的段数。ES 在合并过程中,是分层合并的,具体合并流程可以参考 Chris 的博客。更小的值意味着更多的段合并操作和更少的段。该值必须大于等于 max_merge_at_once ,否则会带来频繁的段合并。
forcemerge参数
以上的参数都是控制 ES 的自动 merge,如果 ES 的自动 merge 不能满足需求,或者索引更新频率比较高,可以使用 ES 的 forcemerge api 来强制进行段合并,从而有效降低 Segment 数量和物理移除标记删除文档。
index.merge.policy.expunge_deletes_allowed
配合 only_expunge_deletes 参数使用,意味只删除比例高于该阈值的段进行段合并。
index.merge.policy.max_merge_at_once_explicit
控制 forcemerge 中单次最大段合并数量,用来控制f orcemerge 的段合并速率。
注意:forcemerge会带来大量的 io 和 cpu 占用,且 merge 会导致 cache 失效,一定要在业务低峰期进行,否则可能导致集群在高负载情况下发生雪崩。
translog落盘异步
{"translog":{"flush_threshold_size":"512mb","sync_interval":"5s","durability":"async"}}复制代码
ES 默认的刷盘方式是同步的,在每次写入在操作完成后,都会立刻进行 translog 的落盘操作。同步刷盘可以提供更好的数据保障性工作,但是会带来IO的开销。异步刷盘牺牲了一定的可靠性保障,但是降低了 IO 的开销,性能相对更好。
作者:政采云技术团队
链接:https://juejin.cn/post/7120011857665982478
来源:稀土掘金