修改merge参数以及线程数
Elasticsearch写入数据时,refresh刷新会生成1个新的segment,segments会按照一定的策略进行索引段合并merge。merge的频率对写入和查询的速度都有一定的影响,如果merge频率比较快,会占用较多的IO,影响写入的速度,但同时segment个数也会比较少,可以提高查询速度。所以merge频率的设定需要根据具体业务去权衡,同时保证写入和查询都相对快速。Elasticsearch默认使用TieredMergePolicy,可以通过参数去控制索引段合并merge的频率:
- 参数“index.merge.policy.floor_segment”,Elasticsearch避免产生很小的segment,小于这个阈值的所有的非常小的segment都会merge直到达到这个floor的size,默认是2MB。
- 参数“index.merge.policy.max_merge_at_once”,一次最多只merge多少个segments,默认是10。
- 参数“index.merge.policy.max_merged_segment”,超过多大size的segment不会再做merge,默认是5GB。
- 参数“index.merge.policy.segment_per_tier”默认为10,表示每个tier允许的segment个数,注意这个值要大于等于“index.merge.policy.max_merge_at_once”值,否则这个值会先于最大可操作数到达,就会立刻做merge,这样会造成频繁merge。
- 参数“index.merge.scheduler.max_thread_count”,单个shard上可能同时合并的最大线程数。默认会启动Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2))个线程进行merge操作,适用于SSD固态硬盘。但是如果硬盘是机械硬盘,很容易出现IO阻塞,将线程数设置为1。
一般情况下,通过调节参数“index.merge.policy.max_merge_at_once”和“index.merge.policy.segment_per_tier”去控制merge的频率。
参数修改 |
好处 |
坏处 |
---|---|---|
提高“index.merge.policy.max_merge_at_once” 和“index.merge.policy.segment_per_tier”参数值(例如 :50) |
提升indexing速度 |
减少了segment merge动作的发生,意味着更多的segments,会降低searching速度 |
降低“index.merge.policy.max_merge_at_once” 和“index.merge.policy.segment_per_tier”参数值(例如 :5) |
Segments更少,即能够提升searching速度 |
更多的segments merge操作,会花费更多系统资源(CPU/IO/RAM),会降低indexing速度 |
修改参数命令如下示例:
curl -XPUT --tlsv1.2 --negotiate -k -u : "https://ip:httpport/myindex-001/_settings?pretty" -H 'Content-Type: application/json' -d' { "merge":{ "scheduler":{ "max_thread_count" : "1" }, "policy":{ "segments_per_tier" : "20", "max_merge_at_once": "20", "floor_segment" : "2m", "max_merged_segment" : "5g" } } }'