0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Elasticsearch写入优化记录,从3000到8000/s

Android编程精选 来源:blog.csdn.net/wmj2004/article/ 作者:blog.csdn.net/wmj2004 2022-04-11 10:55 次阅读

背景

  • 基于elasticsearch-5.6.0

  • 机器配置:3个阿里云ecs节点,16G,4核,机械硬盘

优化前,写入速度平均3000条/s,一遇到压测,写入速度骤降,甚至es直接频率gc、oom等;优化后,写入速度平均8000条/s,遇到压测,能在压测结束后30分钟内消化完数据,各项指标回归正常。

生产配置

这里我先把自己优化的结果贴出来,后面有参数的详解:

elasticsearch.yml中增加如下设置

indices.memory.index_buffer_size:20%
indices.memory.min_index_buffer_size:96mb

#Searchpool
thread_pool.search.size:5
thread_pool.search.queue_size:100
#这个参数慎用!强制修改cpu核数,以突破写线程数限制
#processors:16
#Bulkpool
#thread_pool.bulk.size:16
thread_pool.bulk.queue_size:300
#Indexpool
#thread_pool.index.size:16
thread_pool.index.queue_size:300

indices.fielddata.cache.size:40%

discovery.zen.fd.ping_timeout:120s
discovery.zen.fd.ping_retries:6
discovery.zen.fd.ping_interval:30s

索引优化配置:

PUT/_template/elk
{
"order":6,
"template":"logstash-*",#这里配置模板匹配的Index名称
"settings":{
"number_of_replicas":0,#副本数为0,需要查询性能高可以设置为1
"number_of_shards":6,#分片数为6,副本为1时可以设置成5
"refresh_interval":"30s",
"index.translog.durability":"async",
"index.translog.sync_interval":"30s"

}
}

优化参数详解

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

禁用_all字段: 对于日志和apm数据,目前没有场景会使用到

副本数量设置为0: 因为我们目前日志数据和apm数据在es只保留最近7天的量,全量日志保存在hadoop,可以根据需要通过spark读回到es – 况且副本数量是可以随时修改的,区别分片数量

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

设置index.refresh_interval: 索引刷新间隔,默认为1s。因为不需要如此高的实时性,我们修改为30s – 扩展学习:刷新索引到底要做什么事情

设置段合并的线程数量:

curl-XPUT'your-es-host:9200/nginx_log-2018-03-20/_settings'-d'{
"index.merge.scheduler.max_thread_count":1
}'

段合并的计算量庞大,而且还要吃掉大量磁盘I/O。合并在后台定期操作,因为他们可能要很长时间才能完成,尤其是比较大的段

机械磁盘在并发I/O支持方面比较差,所以我们需要降低每个索引并发访问磁盘的线程数。这个设置允许max_thread_count + 2个线程同时进行磁盘操作,也就是设置为1允许三个线程

扩展学习:什么是段(segment)?如何合并段?为什么要合并段?(what、how、why)

1.设置异步刷盘事务日志文件:

"index.translog.durability":"async",
"index.translog.sync_interval":"30s"

对于日志场景,能够接受部分数据丢失。同时有全量可靠日志存储在hadoop,丢失了也可以从hadoop恢复回来

2.elasticsearch.yml中增加如下设置:

indices.memory.index_buffer_size:20%
indices.memory.min_index_buffer_size:96mb

已经索引好的文档会先存放在内存缓存中,等待被写到到段(segment)中。缓存满的时候会触发段刷盘(吃i/o和cpu的操作)。默认最小缓存大小为48m,不太够,最大为堆内存的10%。对于大量写入的场景也显得有点小。

扩展学习:数据写入流程是怎么样的(具体到如何构建索引)?

1.设置index、merge、bulk、search的线程数和队列数。例如以下elasticsearch.yml设置:

#Searchpool
thread_pool.search.size:5
thread_pool.search.queue_size:100
#这个参数慎用!强制修改cpu核数,以突破写线程数限制
#processors:16
#Bulkpool
thread_pool.bulk.size:16
thread_pool.bulk.queue_size:300
#Indexpool
thread_pool.index.size:16
thread_pool.index.queue_size:300

2.设置filedata cache大小,例如以下elasticsearch.yml配置:

indices.fielddata.cache.size:15%

filedata cache的使用场景是一些聚合操作(包括排序),构建filedata cache是个相对昂贵的操作。所以尽量能让他保留在内存中

然后日志场景聚合操作比较少,绝大多数也集中在半夜,所以限制了这个值的大小,默认是不受限制的,很可能占用过多的堆内存

扩展学习:什么是filedata?构建流程是怎样的?为什么要用filedata?(what、how、why)

1.设置节点之间的故障检测配置,例如以下elasticsearch.yml配置:

discovery.zen.fd.ping_timeout:120s
discovery.zen.fd.ping_retries:6
discovery.zen.fd.ping_interval:30s

大数量写入的场景,会占用大量的网络带宽,很可能使节点之间的心跳超时。并且默认的心跳间隔也相对过于频繁(1s检测一次)

此项配置将大大缓解节点间的超时问题

后记

这里仅仅是记录对我们实际写入有提升的一些配置项,没有针对个别配置项做深入研究。

扩展学习后续填坑。基本都遵循(what、how、why)原则去学习。

-End-

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6515

    浏览量

    87615
  • Elasticsearch
    +关注

    关注

    0

    文章

    25

    浏览量

    2789

原文标题:Elasticsearch 写入优化记录,从3000到8000/s

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如果需要分频8000,在STM32CubeMx应设置为7999还是8000?

    如果需要分频8000,在STM32CubeMx应设置为7999,还是8000?
    发表于 04-26 06:08

    怎样才能使用范围(0x8004-0xBFFC)进行I2C写入呢?

    我们怎样才能使用范围(0x8004-0xBFFC)进行 I2C 写入呢? 我们可以直接将写入的数据复制范围 (0x8000-0xBFFC) 吗?或者需要配置其他寄存器?
    发表于 01-23 08:13

    如何应用AD8000的反馈路径 ?

    如何应用 AD8000 的反馈路径 ?
    发表于 11-15 06:56

    源译识 | 译文分享:Elasticsearch诉Amazon商标侵权案

    【编者按】 ElasticSearch是归属Elastic公司的一个开源项目,提供分布式、高扩展、高实时的搜索与数据分析引擎。Amazon公司于2015年基于ElasticSearch推出了自己
    的头像 发表于 11-06 19:10 441次阅读

    Python 更新 Elasticsearch 的几种方法

    今天总结一下通过 Python 更新 Elasticsearch 数据的几个方法 Elasticsearch 是一个实时的分布式搜索分析引擎,它能让你以前所未有的速度和规模,去探索你的数据。它被用作
    的头像 发表于 11-01 10:11 456次阅读
    Python 更新 <b class='flag-5'>Elasticsearch</b> 的几种方法

    SpringBoot 连接ElasticSearch的使用方式

    在上篇 ElasticSearch 文章中,我们详细的介绍了 ElasticSearch 的各种 api 使用。 实际的项目开发过程中,我们通常基于某些主流框架平台进行技术开发,比如
    的头像 发表于 10-09 10:35 429次阅读

    Elasticsearch存在的各种漏洞问题

    elasticsearch 8 之前使用的一个老系统使用了elasticsearch7.x版本,之后又反应es版本存在各种漏洞 无奈只能做版本升级来解决问题,计划是将版本升级到8.x,在网
    的头像 发表于 09-30 10:40 1663次阅读
    <b class='flag-5'>Elasticsearch</b>存在的各种漏洞问题

    一文详解RedisJSON和其他框架的对比

    RedisJSON 的读取、写入和负载搜索延迟在更高的百分位数中远比 ElasticSearch 和 MongoDB 稳定。当增加写入比率时,RedisJSON 还能处理越来越高的整体吞吐量,而当
    发表于 09-27 11:00 272次阅读
    一文详解RedisJSON和其他框架的对比

    Elasticsearch保姆级入门

    我们需要创建一个供 Elasticsearch 和 Kibana 使用的 network。这个 network 将被用于 Elasticsearch 和 Kibana 之间的通信。
    的头像 发表于 09-01 15:24 280次阅读
    <b class='flag-5'>Elasticsearch</b>保姆级入门

    博科开放系统磁带流水线、快速写入和存储优化的TCP

    电子发烧友网站提供《博科开放系统磁带流水线、快速写入和存储优化的TCP.pdf》资料免费下载
    发表于 08-30 16:51 0次下载
    博科开放系统磁带流水线、快速<b class='flag-5'>写入</b>和存储<b class='flag-5'>优化</b>的TCP

    将声音音频编码器记录到MP3格式存储缩微SD卡中

    应用程序 : 此示例代码编码将声音音频编码器记录到 MP3 格式, 并将其存储 缩微SD 卡中。 反过来, 此 MP3 文件可以由音频编码器播放 。 BSP 版本: M460 BSP
    发表于 08-29 07:54

    把ILM地址0x8000_0000改为0x6000_0000需要更改哪些?

    把ILM地址0x8000_0000改为0x6000_0000,需要更改哪些?
    发表于 08-11 13:28

    基于 Elasticsearch 的日志系统架构如何面临挑战

    优化:例如增加了倒排索引,支持原生的半结构数据类型,优化了 Text 匹配速度和文本算法等,最终实现相较 Elasticsearch 最高 10 倍的性价比提升。 为了让大家快速使用 Doris 搭建
    的头像 发表于 08-08 10:21 667次阅读
    基于 <b class='flag-5'>Elasticsearch</b> 的日志系统架构如何面临挑战

    RedisJson横空出世,比ES快7倍,惊爆了!

    此外,RedisJSON 的读取、写入和负载搜索延迟在更高的百分位数中远比 ElasticSearch 和 MongoDB 稳定。当增加写入比率时,RedisJSON 还能处理越来越高的整体吞吐量,而当
    的头像 发表于 07-11 15:09 527次阅读
    RedisJson横空出世,比ES快7倍,惊爆了!

    NUC980下载imageDDR中,执行地址入口为什么是0x8000

    刚入手一个新塘的NUC980 IOT开发板,使用nuwriter 下载BSP 带的imageDDR中,执行地址入口=0x8000,可以看到内核启动成功,但是不知道为什么地址入口设为=0x8000? 使用不同的地址入口试验了一
    发表于 06-26 06:47