Search写入性能优化

  性能相关
内容纲要

概要描述


优化search数据入库性能

详细说明


增加refresh的间隔时间。

Search每个index默认1s就会触发一次 refresh,然后Refresh会把内存中的的数据刷新到操作系统的文件缓存系统中。每次索引的 refresh 会产生一个新的 segment 段,这会导致频繁的segment merge 行为。一般在查询实时性要求不高的场景下可改为30s,甚至是”-1”(关闭refresh)。 入库完之后修改回默认值是1s 即可,如:

curl -XPUT "localhost:9200/[index_name]/_settings?pretty" -d '{
  "index" : {
  "refresh_interval" : "30s" 
  }
}'

减少副本

ES 为了保证集群的可用性,提供了 Replicas(副本)支持,然而每个副本也会执行分析、索引及可能的合并过程,所以 Replicas 的数量会严重影响写索引的效率。
当写索引时,需要把写入的数据都同步到副本节点,副本节点越多,写索引的效率就越慢。
如果我们需要大批量进行写入操作,可以先禁止 Replica 复制,设置 index.number_of_replicas: 0 关闭副本。在写入完成后,Replica 修改回正常的状态。

curl -XPUT "localhost:9200/[index_name]/_settings?pretty" -d '{
  "index" : {
  "number_of_replicas" : 0 
  }
}'

merge相关参数

增大每次merge的segment大小,从而减少merge次数,减轻负载


curl -XPUT '192.168.2.181:9200/index/_settings?pretty' -d '
{
 "index.merge.policy.floor_segment": "100mb",
 "index.merge.scheduler.max_thread_count": "1",
 "index.merge.policy.max_merged_segment":"100m"
}'

去掉mapping中_all字段

Index中默认会有_all这个字段,默认会把所有字段的内容都拷贝到这一个字段里面,这样会给查询带来方便,但是会增加索引时间和索引尺寸。

在创建index mapping中设置

"_all":{"enabled":false}

使用es自动生成id

es对于自动生成的id有优化,避免了版本查找。因为其生成的id是唯一的

方法为在bulk写入时不指定_id的值

精细设置全文域

string类型字段默认会分词,不仅会额外占用资源,而且会影响创建索引的速度。所以,把不需要分词的字段设置为not_analyzed

提升段合并速度

ES 默认对段合并的速度是 20m/s,如果使用了 SSD,我们可以通过以下的命令将这个合并的速度增加到 100m/s。

curl -XPUT "localhost:9200/_cluster/settings
{
    "persistent" : {
        "indices.store.throttle.max_bytes_per_sec" : "100mb"
    }
}

增加translog flush大小

Flush主要目的是待translog达到多大之后将入库的数据从内存flush到磁盘,并生成新的translog。在不发生频繁长gc的前提下可以适当调大该参数以提高入库性能, 但该参数变大之后recovery的时间会变长。 默认值是512m 。

curl -XPUT "localhost:9200//_settings?pretty" -d '{
  "index" : {
  "translog.flush_threshold_size" : "4g" 
  }
}

设置bulk queue

建立索引的过程偏计算密集型任务,应该使用固定大小的线程池配置,来不及处理的放入队列,线程数量配置为 CPU 核心数+1,避免过多的上下文切换.队列大小可以适当增加。

curl -XPUT 'localhost:9200/_cluster/settings?pretty' -d '{
  "persistent": { ①
  "threadpool.bulk.queue_size" : 1000 ②
  }
}'

① persistent: 保证修改的cluster参数在集群重启后生效。
② 指bulk队列的长度, 配置可以防止流量。
注意:es 5.x以后版本不支持动态设置,参数调整为thread_pool.bulk.queue_size,并需将其配置到elasticsearch.yml文件中,可以去manager界面进行修改,然后配置服务、

设置batch.size(insert)

esdrive批量插入的大小:sql运行时可设置的参数

set esdrive.insert.batch.size=20000; ①

① 默认值是1000.
在 hive-site.xml 文件中修改以下参数:需重启inceptor。

  discovery.zen.ping.unicast.hosts=localhost ①

① Transwarp Search的transport client会将所有Transwarp Search请求发到本地的Transwarp Search node上做转发,这样可以少走2次网络传输。但在cluster mode下需要保证每个运行的executor的机器上都有Transwarp Search node,在localmode下需要考虑本地Transwarp Search node是否容易过载。

其他信息


这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。