前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ES数据写入调优

ES数据写入调优

原创
作者头像
ruochen
修改2021-11-24 14:10:45
7800
修改2021-11-24 14:10:45
举报
文章被收录于专栏:若尘的技术专栏
禁用Swapping

大多数操作系统都尽可能多地为文件系统缓存使用内存,并切换出未使用的应用程序内存。这可能导致部分JVM堆被交换到磁盘上。

对于性能和节点的稳定性来说,这种交换是非常糟糕的,应该不惜一切代价避免。它可能导致垃圾收集持续几分钟而不是几毫秒,这可能导致节点响应缓慢,甚至脱离集群。

Linux/Unix系统中使用mlockall在RAM中锁定进程的地址空间,阻止Elasticsearch内存被交换出去,从而实现禁用Swapping。

按以下步骤启用“bootstrap.memory_lock”参数。

1.以管理员帐号登录FusionInsight Manager界面,选择“集群 > 待操作集群的名称 > 服务 > Elasticsearch > 配置 >

全部配置 > 自定义”。

2.添加新的参数“bootstrap.memory_lock”,设置值为“true”,单击“保存”按钮,保存配置并重启Elasticsearch服务。

3.使用root用户登录任意Elasticsearch数据节点,执行如下命令验证是否修改成功。执行命令后结果显示包含“true”则表示修改成功。

代码语言:txt
复制
curl -XGET "http://ip:httpport/_nodes?filter_path=**.mlockall"
1 让分片均匀分布

针对于5个以上机器节点,为了让各个实例上的分片均匀分布,添加如下参数,设置每个索引在单个实例上的分片个数,如下所示为每个索引在每个实例上的分片为2个。

`curl -XPUT "http://ip:httpport/myindex/_settings?pretty' -H 'Content-

Type:application/json' -d ' {

"index.routing.allocation.total_shards_per_node":"2" }'`

2 修改索引刷新时间及副本数

默认“index.refresh_interval”“1s”,即每秒都会强制生成1个新的segments文件,增大索引刷新时间,可以生成更大的segments文件,有效降低IO并减少segments

merge的压力,该配置项可以建索引时指定(或者配置到template里去)。

如果只是单纯导入数据,不需要做实时查询,可以把refresh禁用(即设置index.refresh_interval为-1),并设置“index.number_of_replicas”为“0”,当然这样设置会有数据丢失风险。等到数据完成导入后,再把参数设置为合适的值。

命令为单索引下操作如下所示,同时也支持多索引(索引名按逗号分隔)和全索引(用*通配符)操作。

代码语言:txt
复制
curl -XPUT "http://ip:httpport/myindex/_settings" -H 'Content-Type: application/json' -d'
代码语言:txt
复制
{
代码语言:txt
复制
    "number_of_replicas": 0,
代码语言:txt
复制
    "refresh_interval": "180s"
代码语言:txt
复制
}'
3.修改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的频率。

image.png

修改参数命令如下示例:

代码语言:txt
复制
curl -XPUT "http://ip:httpport/myindex-001/_settings?pretty" -H 'Content-Type: application/json' -d'
代码语言:txt
复制
{
代码语言:txt
复制
     "merge":{
代码语言:txt
复制
         "scheduler":{
代码语言:txt
复制
            "max_thread_count" : "1"
代码语言:txt
复制
         },
代码语言:txt
复制
         "policy":{
代码语言:txt
复制
              "segments_per_tier" : "20",
代码语言:txt
复制
              "max_merge_at_once": "20",
代码语言:txt
复制
              "floor_segment" : "2m",
代码语言:txt
复制
              "max_merged_segment" : "5g"
代码语言:txt
复制
         }
代码语言:txt
复制
      }
代码语言:txt
复制
}'

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 禁用Swapping
  • 1 让分片均匀分布
  • 2 修改索引刷新时间及副本数
  • 3.修改merge参数以及线程数
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档