更新时间:2024-11-29 GMT+08:00

修改merge参数以及线程数

Elasticsearch写入数据时,refresh刷新会生成1个新的segment,segments会按照一定的策略进行索引段合并merge。merge的频率对写入和查询的速度都有一定的影响,如果merge频率比较快,会占用较多的IO,影响写入的速度,但同时segment个数也会比较少,可以提高查询速度。所以merge频率的设定需要根据具体业务去权衡,同时保证写入和查询都相对快速。Elasticsearch默认使用TieredMergePolicy,可以通过参数去控制索引段合并merge的频率:

  1. 参数“index.merge.policy.floor_segment”,Elasticsearch避免产生很小的segment,小于这个阈值的所有的非常小的segment都会merge直到达到这个floor的size,默认是2MB。
  2. 参数“index.merge.policy.max_merge_at_once”,一次最多只merge多少个segments,默认是10。
  3. 参数“index.merge.policy.max_merged_segment”,超过多大size的segment不会再做merge,默认是5GB。
  4. 参数“index.merge.policy.segment_per_tier”默认为10,表示每个tier允许的segment个数,注意这个值要大于等于“index.merge.policy.max_merge_at_once”值,否则这个值会先于最大可操作数到达,就会立刻做merge,这样会造成频繁merge。
  5. 参数“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"
         }
      }
}'