ELK 架构中 ES 性能优化

1. 背景

由于目前日志采集流程中, 经常遇到用户磁盘 IO 占用超过 90% 以上的场景, 但是观察其日志量大约在 2k~5k 之间, 整体数据量不大, 所以针对该问题进行了一系列的压测和实验验证,最后得出这篇优化建议文档

2. 压测前期准备

2.1 制造大量日志

该阶段为数据源输入阶段, 为了避免瓶颈在数据制造侧, 所以需要保证 filebeat 具有足够的日志制造能力
最后效果, filebeat 可以达到 70k QPS 的数据发往logstash . (真实数据可以更高, 70k qps 是因为目前单实例 logstash 的 CPU 计算瓶颈, logstash 配置的 output 为空的情况下)

2.2 logstash 侧降低副本, 调整资源限制

Logstash 主要是 cpu 密集型服务, 数据传输到 es 的时候为了观察方便, 设置 logstash 副本数为 1, 并将 cpu 的 limit 开放到 12 core. 同时为了避免影响到 es, 将 该单实例 logstash 部署到 master 节点
验证性能方案
不断调节 logstash 配置, 找出性能消耗较大的配置项

2.3 es 侧配置等保持不变

根据之前的推断, 磁盘 io 主要由于 es index 写入进行的消耗, 所以 es 是本次调节的重点, 暂时保持配置不变, 在验证过程中不断调节 es 配置

2.4 其他调整

  1. 其他无关服务关闭, 卸载 mongo, Redis . 等无关服务

3. 压测步骤

  1. 关闭 logstash 到 es 的输出, 通过 logstash 的 metrics 观察不同配置对 logstash 处理能力的影响
  2. Logstash 配置不变情况下, 调节 es index 生命周期策略等配置, 通过 es 的 metrics 观察不同配置对 doc 数量和 磁盘 io 的影响

4. 优化建议

4.1 logstash 优化

4.1.1 删除 logstsh 大量字段删除操作, 移动到 filebeat 侧进行

mutate remove_field 处理消耗大量 cpu, 可以将部分操作移动到 filebeat 中

4.1.2 优化 logstash 配置参数, 提升每批次处理量 (优先)
pipeline.batch.size: 500
pipeline.batch.delay: 200

空间换时间, 内存会有小幅上升, 但是会提升 cpu 处理效率

4.1.3 优化 if else 处理逻辑(暂缓)

由于 logstash 没有 switch 等语句, 只能嵌套多个 if else. 所以可以将中日志频率高的 event code 放在前面

4.1.4 使用 logstash pipeline, 避免多个数据源的相互影响(暂缓)

Logstash 提供了 logstash pipeline 机制, 避免 filter 之间的相互影响
参考: Creating a Logstash pipeline | Logstash Reference [8.15] | Elastic

4.2 es 优化

4.2.1 index segment分段设置 等参数优化 (优先)

索引模版增加 合并相关参数

{
  "index": {
    "codec": "best_compression", 
    "mapping": {
      "total_fields": {
        "limit": "10000"
      }
    },
    "refresh_interval": "30s",
    "translog": {
      "flush_threshold_size": "512mb",
      "sync_interval": "10s",
      "durability": "async"
    },
    "merge": {
      "scheduler": {
        "max_thread_count": "1"
      },
      "policy": {
        "floor_segment": "2mb",
        "max_merge_at_once": "5",
        "max_merged_segment": "5gb"
      }
    }
  }
}

将各个索引模版增加以上参数, 各参数解释

  • “codec”: “best_compression”, // 使用最佳压缩方式, 节省磁盘和 io 性能, 会稍微影响读取性能, 但是目前场景为写多读少
  • “refresh_interval”: “30s”, // 增加刷新间隔, 避免频繁刷新, 占用磁盘 io, 数据最大 30s 后可被检索
  • “translog.flush_threshold_size”: “128mb”, // 设置事务日志(translog)达到多大时进行刷新(flush)
  • “translog.sync_interval”: “10s”,// 定事务日志同步到磁盘的频率, 10s 内的数据可能在宕机时候丢失
  • “translog.durability”: “async”, // async 表示异步持久化,事务日志不会立即同步到磁盘,而是根据 translog.sync_interval 的设置进行同步
  • “merge.scheduler.max_thread_count”: 1, // 较高的线程数可以加快合并速度,但也会增加磁盘 IO。设置为 1 表示只使用一个线程进行合并
  • “merge.policy.floor_segment”: “2mb”, // 小于此大小的段将被优先合并,以减少段的数量并提高查询性能。
  • “merge.policy.max_merge_at_once”: “5”, // 较高的值可以减少段的数量,但也会增加合并操作的 I/O 负载
  • “merge.policy.max_merged_segment”: “5gb” // 较大的段可以减少段的数量,但也会增加单个段的大小,可能影响查询性能。
4.2.2 生命周期策略关闭强制合并 (优先)

关闭强制合并, 避免在 index 读写较高时, 进行合并操作, 可以在空闲时段离线进行合并操作

4.2.3 增加温阶段, 在温阶段中, 合并 segement 和降低副本数(暂缓)

将临近删除的数据, 增加温阶段, 合并 segement 和降低副本数, 以此达到降低磁盘使用量的目的

5. 最终效果

硬盘: 机械硬盘, vmware 虚拟盘
Logstash 配置: 单实例 12 核 8g
ES data 配置: 双实例 12 核 8g
极限情况下(磁盘 io 成为瓶颈的情况下)
峰值: 12k qps
平均值: 9k qps

收益
优化前 峰值 5k qps
优化后 峰值 12k qps

6. 关于这次优化的问题解答

  1. 为什么之前 io 负载高
    1. 频繁的 merge 造成, io 进程多, 同时还有强制合并
  2. 为什么 logstash 内存高
    1. jvm 直接占用内存, 不是实际使用的内存
    2. 实际要看 jvm 内的指标量
  3. 什么是 segement, 为什么要合并, 什么时候合并
    1.  Elasticsearch 中,段是一个倒排索引的基本单元
    2. es 会自动和手动合并 segement
    3. segement 不变, 只能被合并, 合并可以通过参数调节
      4.- 数据首先写入内存缓冲区,然后定期刷新到新的段中
    4. 分配和段的管理是由底层的 Lucene 库自动处理的
  4. ingest 是什么, pipeline 是做什么的
    1. 用于在数据被索引之前对其进行预处理, 与处理数据用的
    2. pipeline 是一系列处理器(processors)的集合

7. 最佳实践

  • 尽量批量发送数据到 Elasticsearch。
  • 数据预处理尽可能在数据产生侧完成。
  • 每个 Elasticsearch shard 的建议大小为 50GB。
  • 不重要的数据可不保留副本。
  • Elasticsearch 的 segment 合并会严重占用磁盘 IO,对于不需要实时处理的数据,可以减缓合并频率。
  • Logstash 是 CPU 密集型应用,一般不需要大量内存。
  • Filebeat 功能强大,可以处理一些数据缓存等任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/875668.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微生物分类检测系统源码分享

微生物分类检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

突发!OpenAI发布最强模型o1:博士物理92.8分,IOI金牌水平

梦晨 衡宇 发自 凹非寺量子位 | 公众号 QbitAI 参考ChatGPT:点击使用 来了来了!刚刚,OpenAI新模型无预警上新: o1系列,可以进行通用复杂推理,每次回答要花费更长时间思考。 在解决博士水平的物理问题时&a…

Notepad++插件:TextFX 去除重复行

目录 一、下载插件 TextFX Characters 二、去重实操 2.1 选中需要去重的文本 2.2 操作插件 2.3 结果展示 2.3.1 点击 Sort lines case sensitive (at column) 2.3.2 点击 Sort lines case insensitive (at column) 一、下载插件 TextFX Characters 点【插件】-【插件管理…

【OpenAPI】Spring3 集成 OpenAPI 生成接口文档

Spring3 集成 OpenAPI 生成接口文档 1. 依赖 Spring 版本&#xff1a;3.0.5 Java 版本&#xff1a;jdk21 OpenAPI 依赖&#xff1a; <!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui --> <dependency><groupI…

如何通过 PhantomJS 模拟用户行为抓取动态网页内容

引言 随着网页技术的不断进步&#xff0c;JavaScript 动态加载内容已成为网站设计的新常态&#xff0c;这对传统的静态网页抓取方法提出了挑战。为了应对这一挑战&#xff0c;PhantomJS 作为一个无头浏览器&#xff0c;能够模拟用户行为并执行 JavaScript&#xff0c;成为了获…

GeoPandas在地理空间数据分析中的应用

GeoPandas是一个开源的Python库&#xff0c;专门用于处理和分析地理空间数据。它建立在Pandas库的基础上&#xff0c;扩展了Pandas的数据类型&#xff0c;使得用户能够在Python中方便地进行GIS操作。GeoPandas的核心数据结构是GeoDataFrame&#xff0c;它是Pandas的DataFrame的…

uniapp小程序,使用腾讯地图获取定位

本篇文章分享一下在实际开发小程序时遇到的需要获取用户当前位置的问题&#xff0c;在小程序开发过程中经常使用到获取定位功能。uniapp官方也提供了相应的API供我们使用。 官网地址&#xff1a;uni.getLocation(OBJECT)) 官网获取位置的详细介绍这里就不再讲述了&#xff0c;大…

红光一字激光器在工业中的性能指标怎样

红光一字激光器作为现代工业中不可或缺的重要设备&#xff0c;以其独特的性能和广泛的应用场景&#xff0c;成为众多行业的首选工具。本文就跟大家详细探讨红光一字激光器在工业中的性能指标&#xff0c;以及这些指标如何影响其在实际应用中的表现。 光束质量 红光一字激光器以…

【痛点解决】跨网跨区域的文件传输摆渡解决办法指南

跨网跨区域的文件传输摆渡&#xff0c;顾名思义就是需要跨越不同网络、不同地区&#xff0c;或者是不同安全域的文件传输&#xff0c;一般有这样传输需求的机构&#xff0c;在组织架构、网络结构&#xff0c;或者传输需求上&#xff0c;都会比较复杂。 跨网跨区域文件传输是什…

51单片机快速入门之定时器和计数器

51单片机快速入门之定时器 断开外部输入 晶振振荡 假设为 12MHz 12分频之后,为1MHz 当其从0-65536 时,需要65536μs 微秒 也就是65.536ms 毫秒 溢出(值>65536 时)>中断>执行中断操作 假设需要1ms后产生溢出,则需要设置初始值为64536 此时定时器会从 64536 开始计…

掌握 JavaScript ES6+:现代编程技巧与模块化实践

掌握 JavaScript ES6&#xff1a;现代编程技巧与模块化实践 一 . 变量声明 let二 . 声明常量 const三 . 模板字符串四 . 函数的参数默认值五 . 箭头函数六 . 对象初始化七 . 解构7.1 接收 JSON 对象7.2 接收数组 八 . 延展操作符九 . 导入和导出9.1 方式一9.2 方式二 这篇文章我…

Android视频编辑:利用FFmpeg实现高级功能

在移动设备上进行视频编辑的需求日益增长&#xff0c;用户期望能够在智能手机或平板电脑上轻松地编辑视频&#xff0c;以满足社交媒体分享或个人存档的需求。Android平台因其广泛的用户基础和开放的生态系统&#xff0c;成为视频编辑应用的理想选择。FFmpeg&#xff0c;作为一个…

Maven入门学习笔记

一、maven介绍 Maven是一款自动化构建工具&#xff0c;专注服务于JAVA平台的项目构建和依赖管理。在javaEE开发的历史上构建工具的发展也经历了一系列的演化和变迁。 管理jar包 当我们使用SSM之后我们就需要使用非常多的jar包 没有maven找jar包非常的麻烦。 使用maven下载…

简单了解 JVM

目录 ♫什么是JVM ♫JVM的运行流程 ♫JVM运行时数据区 ♪虚拟机栈 ♪本地方法栈 ♪堆 ♪程序计数器 ♪方法区/元数据区 ♫类加载的过程 ♫双亲委派模型 ♫垃圾回收机制 ♫什么是JVM JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。 虚拟机是指通过软件模…

WPF DataGrid 列表中,DataGrid.Columns 列根据不同的值显示不同内容

需求&#xff1a;在WPF DataGrid 控件中&#xff0c;有以下列&#xff0c;绑定了一个LogType&#xff0c;值分别是0,1,2&#xff0c;根据不同的值&#xff0c;显示不同的内容以及背景 <DataGrid ItemsSource"{Binding EventLog}"><DataGrid.Columns><…

代码管理工具——git及阿里云云效的使用(包含git的使用及云效自动化部署)

1、做项目开发时都会用到代码管理工具,像是我之前使用过gitHub,Visual Studio等一些代码管理工具&#xff0c;这里介绍的是阿里云云效的使用。 2、首先登录阿里云云效&#xff0c;登录进去之后会看到公司给你开放的一个仓库。 3、进入仓库&#xff0c;点击克隆/下载&#xff0…

Google大数据架构技术栈

数据存储层 Colossus Colossus作为Google下一代GFS&#xff08;Google File System&#xff09;。 GFS本身存在一些不足 单主瓶颈 GFS 依赖单个主节点进行元数据管理&#xff0c;随着数据量和访问请求的增长&#xff0c;出现了可扩展性瓶颈。想象一下&#xff0c;只有一位…

网红酒店|基于java的网红酒店预定系统(源码+数据库+文档)

酒店预定|网红酒店|网红酒店预定系统 目录 基于java的网红酒店预定系统 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&am…

R语言统计分析——功效分析(比例、卡方检验)

参考资料&#xff1a;R语言实战【第2版】 1、比例检验 当比较两个比例时&#xff0c;可使用pwr.2p.test()函数进行功效分析。格式为&#xff1a; pwr.2p.test(h, n, sig.level, power, alternative) 其中&#xff0c;h是效应值&#xff0c;n是各相同的样本量。效应值h的定义如…

智能头盔语音识别声控芯片,AI离线语音识别ic方案,NRK3301

头盔是交通事故中保护电动车车主安全的最后一道屏障。为了增加骑行用户的安全保护&#xff0c;改善骑行用户的出行体验&#xff0c;让用户从被动使用头盔到主动佩戴头盔&#xff0c;头盔厂家与九芯电子合作&#xff0c;推出了语音智能头盔&#xff0c;它具备首家骑行专用的智能…