ES101系列09 | 运维、监控与性能优化

本篇文章主要讲解 ElasticSearch 中 DevOps 与性能优化的内容,包括集群部署最佳实践、容量规划、读写性能优化和缓存、熔断器等。

集群部署最佳实践

在生产环境中建议设置单一角色的节点。

  • Dedicated master eligible nodes:负责集群状态的管理。使用低配置的 CPU,RAM 和磁盘。
  • Dedicated data nodes:负责数据存储及处理客户端请求使用高配置的 CPU,RAM 和磁盘。
  • Dedicated ingest nodes:负责数据处理使用高配置 CPU,中等配置的 RAM,低配置的磁盘。

从高可用 & 避免脑裂的角度出发,一般生产环境需要配置 3 台 Delicate Master Node。

拓展方式
  • 当磁盘容量无法满足需求时,可以增加数据节点;磁盘读写压力大时,增加数据节点。
  • 当系统中有大量的复杂查询及聚合时候,增加 Coordinating 节点,增加查询的性能。

Hot & Warm Architecture

  • Hot & Warm Architecture
    • 数据通常不会有 Update 操作;适用于 Time based 索引数据(生命周期管理),同时数据量比较大的场景。
    • 引入 Warm 节点,低配置大容量的机器存放老数据,以降低部署成本。
  • 两类数据节点,不同的硬件配置
    • Hot 节点(通常使用 SSD):索引有不断有新文档写入。通常使用 SSD。
    • Warm 节点(通常使用 HDD):索引不存在新数据的写入;同时也不存在大量的数据查询。

分片设计

单个分片
  • 7.0 开始,新创建一个索引时,默认只有一个主分片。
    • 单个分片,查询算分,聚合不准的问题都可以得以避免。
  • 单个索引,单个分片时候,集群无法实现水平扩展。
    • 即使增加新的节点,无法实现水平扩展。
两个分片

新增节点后,ElasticSearch 会自动进行分片的移动(Shard Rebalancing)。也就实现了水平拓展。

如何设计分片数
  • 当分片数>节点数时
    • 一旦集群中有新的数据节点加入,分片就可以自动进行分配。
    • 分片在重新分配时,系统不会有 downtime。
  • 多分片的好处:一索引如果分布在不同的节点,多个节点可以并行执行
    • 查询可以并行执行。
    • 数据写入可以分散到多个机器。
如何确定主分片数
  • 从存储的物理角度看
    • 日志类应用,单个分片不要大于 50GB
    • 搜索类应用,单个分片不要超过 20GB
  • 为什么要控制分片存储大小
    • 提高 Update 的性能
    • Merge 时,减少所需的资源
    • 丢失节点后,具备更快的恢复速度/便于分片在集群内 Rebalancing
如何确定副本分片数
  • 副本是主分片的拷贝
    • 提高系统可用性:相应查询请求,防止数据丢失。
    • 需要占用和主分片一样的资源。
  • 对性能的影响
    • 副本会降低数据的索引速度:有几份副本就会有几倍的 CPU 资源消耗在索引上。
    • 会减缓对主分片的查询压力,但是会消耗同样的内存资源。
      • 如果机器资源充分,提高副本数,可以提高整体的查询 QPS。

集群容量规划

  • 一个集群总共需要多少个节点?一个索引需要设置几个分片?
    • 规划上需要保持一定的余量,当负载出现波动,节点出现丢失时,还能正常运行。
  • 做容量规划时,一些需要考虑的因素
    • 机器的软硬件配置。
    • 单条文档的尺寸 / 文档的总数据量 / 索引的总数据量(Time base 数据保留的时间)/ 副本分片数。
    • 文档是如何写入的(Bulk 的尺寸)。
    • 文档的复杂度,文档是如何进行读取的(怎么样的查询和聚合)。
业务性能评估
  • 数据呑吐及性能需求
    • 数据写入的吞吐量,每秒要求写入多少数据?
    • 查询的吞吐量?
    • 单条查询可接受的最大返回时间?
  • 了解你的数据
    • 数据的格式和数据的 Mapping。
    • 实际的查询和聚合长的是什么样的。
硬件配置
  • 数据节点尽量用 SSD。
  • 日志类或并发查询低的场景可以用机械硬盘。
  • 单节点数据控制在 2TB 以内,最高不超过 5TB。
  • JVM 配置机器内存的一半,不建议超过 32G。
集群扩容
  • 增加 Coordinating / Ingest Node
    • 解决 CPU 和内存开销的问题。
  • 增加数据节点
    • 解决存储的容量的问题。
    • 为避免分片分布不均的问题,要提前监控磁盘空间,提前清理数据或增加节点(70%)。

监控 & 排查 API

类别API 路径核心用途关键返回字段说明生产环境关注点
集群健康GET /_cluster/health集群整体状态概览status(green/yellow/red), unassigned_shards, active_shards_percent红色状态立即处理;黄色状态检查未分配分片
节点资源GET /_nodes/stats节点级资源监控heap_used_percent, cpu.percent, disk_free_percentHeap >75% 需扩容;磁盘<20% 需清理或扩容
索引性能GET /_cat/indices?v索引存储与文档统计docs.count, store.size, pri.store.size分片数合理性;定期清理无用索引
慢查询定位GET /_search?pretty&q=slow定位高延迟请求took 时间(需预设慢日志阈值)优化 took >1s 的查询/索引设计
线程池积压GET /_cat/thread_pool?v线程队列监控search.queue, write.queue队列>0 表示资源瓶颈,需扩容或限流
分片分布GET /_cat/shards?v分片负载均衡检测node, state, store均衡分片分布;避免单节点负载过高
任务监控GET /_tasks?detailed长任务跟踪running_time_in_nanos, description监控耗时任务(如 reindex),避免阻塞集群
磁盘水位GET /_cat/allocation?v节点磁盘使用率disk.avail, disk.used预警 disk.avail <30% 的节点
Segment 状态GET /_cat/segments?v索引碎片监控segment.count, size过多小 segment 增加 Heap 压力;触发 force_merge 需谨慎
JVM 状态GET /_nodes/stats/jvm垃圾回收监控young.collection_count, old.collection_time_in_millisYoung GC >2 次/秒或 Old GC >10 秒/次需调优堆大小
关键监控指标 API 详解
  1. 集群健康 (/_cluster/health)

    • status: red 表示主分片缺失(数据丢失风险)
    • unassigned_shards 常见原因:节点离线或分片分配规则冲突 。
  2. 节点资源 (/_nodes/stats)

    • JVM Heap 示例

      "jvm": { "mem": { "heap_used_percent": 65 } }
      

持续>75% 需扩容或优化内存(如减少 fielddata/cache)。

  1. 线程池积压 (/_cat/thread_pool)

    node2 search 8 0 8 0 # search.queue=8 表示队列积压
    

queue>0 需扩容或优化查询并发度 。

  1. 慢查询阈值配置

    elasticsearch.yml 中设置:

    index.search.slowlog.threshold.query.warn: 10s
    index.search.slowlog.threshold.query.info: 5s
    
生产环境排查流程建议
  1. 集群异常 → 用 GET /_cluster/allocation/explain 定位未分配分片原因。
  2. 节点负载高 → 执行 GET /_nodes/hot_threads 抓取热点线程栈。
  3. 查询延迟 → 使用 GET /_search?profile=true 分析执行计划。
  4. 磁盘告警 → 优先清理大型临时索引或扩容冷节点 。
分片没有被分配的一些原因
  • INDEX_CREATE:创建索引导致。在索引的全部分片分配完成之前,会有短暂的 Red,不一定代表有问题。
  • CLUSTER_RECOVER:集群重启阶段会有这个问题。
  • INDEX_REOPEN:Open 一个之前 Close 的索引。
  • DANGLING_INDEX_IMPORTED:一个节点离开集群期间,有索引被删除。这个节点重新返回时,会导致问题。
集群变红的常见问题与解决方法
  • 集群变红,需要检查是否有节点离线。如果有,通常通过重启离线的节点可以解决问题。
  • 由于配置导致的问题,需要修复相关的配置(例如错误的 box_type,错误的副本数)。如果是测试的索引,可以直接删除。
  • 因为磁盘空间限制,分片规则(ShardFiltering)引发的,需要调整规则或者增加节点。

读写性能优化

写性能优化

目标增大写吞吐量,越高越好。

  • 客户端:多线程批量写,通过性能测试确定最佳并发度。
  • 服务端:
    • 使用更好的硬件,观察 CPU / IO Block。
    • 降低 IO 操作,使用 ES 自动生成文档 id。
    • 降低 CPU 和存储开销,减少不必要的分词。
    • 尽可能做到写入和分片的均衡负载,实现水平扩展。

一切优化都基于高质量的数据建模。

Bulk、线程池和队列大小
  • 客户端
    • 单个 bulk 请求体的数据量不要太大,官方建议大约 5-15mb。
    • 写入端的 bulk 请求超时需要足够长,建议 60s 以上。
    • 写入端尽量将数据轮询打到不同节点。
  • 服务器端
    • 索引创建属于计算密集型任务,应该使用固定大小的线程池来配置。来不及处理的放入队列,线程数应该配置成 CPU 核心数 +1,避免过多的上下文切换。
    • 队列大小可以适当增加,不要过大,否则占用的内存会成为 GC 的负担。
读性能优化

尽可能 Denormalize 数据,从而获取最佳的性能。

  • 避免查询的时候使用脚本。
  • 避免使用通配符开头的正则。
  • 控制聚合的数量。
优化分片
  • 避免 Over Sharding。
  • 控制单个分片的大小,查询场景尽量 20GB 以内。
  • 将只读的索引进行 force merge。

段合并优化

ES 和 Lucene 会自动进行 Merge 操作,该操作较重,需要优化降低对系统的影响。

  1. 降低分段产生的数量/频率
  • 可以将 Refresh Interval 调整到分钟级别。
  • 尽量避免文档的更新操作。
  1. 降低最大分段大小,避免较大的分段继续参与 Merge,节省系统资源。
  • Index.merge.policy.max_merged_segment 默认 5GB,操作此大小以后就不再参与后续的合并操作。
Force Merge

当 Index 不再有写入操作的时候,建议对其进行 force merge。能够提升查询速度/减少内存开销。

最终分成几个 segments 比较合适?

  • 越少越好,最好可以 merge 成 1 个,但是 Force Merge 会占用大量的网络、IO 和 CPU。
  • 如果不能在业务高峰期之前做完,就需要考虑增大最终的分段数。包括 Shard 的大小、Index.merge.policy.max_merged_segment 的大小。

缓存与内存

缓存类型作用域主要作用触发条件失效条件
Node Query Cache (Filter Cache)节点级缓存过滤查询(Filter)的结果(文档 ID 位图)filter 上下文查询索引数据变更、手动清除、段合并、LRU 淘汰
Shard Request Cache分片级缓存整个搜索请求的完整结果(如聚合查询)size:0 的请求或显式启用索引数据变更、手动清除、分片 Refresh、LRU 淘汰
Fielddata Cache分片级缓存字段值到文档 ID 的映射(用于排序、聚合)text 字段进行聚合/排序手动清除、段合并、LRU 淘汰
管理内存的重要性

ElasticSearch 高效运维依赖于内存的合理分配。可用内存一半分配给 JVM,一半留给操作系统缓存索引文件。

内存问题可能会导致 GC 和 OOM 问题。

一些常见的内存问题
  • Segments 个数过多,导致 full GC。集群响应慢但没有特别多是读写,节点在持续 full GC。查看内存发现 segments.memory 占用很大空间。通过 force merge 段合并。
  • Field data cache 过大,导致 full GC。集群响应慢但没有特别多是读写,节点在持续 full GC。查看内存发现 fielddata.memory.size 占用很大空间。将 indices.fielddata.cache.size 设小,重启节点,堆内存恢复正常。
Circuit Breaker
熔断器名称主要功能触发条件(默认阈值)
Parent Circuit Breaker总内存保护,防止所有子熔断器总和超过节点内存所有子熔断器申请内存总和 > 95% JVM 堆
Fielddata Circuit Breaker防止加载字段数据(如 text 字段聚合)耗尽堆内存字段数据内存 > 40% JVM 堆
Request Circuit Breaker限制单个请求(查询、聚合等)的内存使用,防止大请求压垮节点单个请求内存 > 60% 父熔断器剩余内存
In Flight Requests Circuit Breaker限制传输中请求(未完成)的总内存,保护网络和内存资源传输中请求总内存 > 100% JVM 堆
Accounting Circuit Breaker跟踪分片级资源(如 Lucene 段内存),确保资源释放后及时回收未释放资源 > 100% JVM 堆
Script Compilation Circuit Breaker限制一定时间窗口内脚本编译次数,防止频繁编译消耗 CPU15 分钟内编译次数 > 75 (默认)
Disk Usage Circuit Breaker防止节点磁盘写满导致集群故障(触发只读保护)磁盘空间 > 低水位线 (默认 85%)

💡 注:阈值可通过配置调整(如 indices.breaker.fielddata.limit),触发后返回 429 (Too Many Requests) 错误。

写在最后

这是该系列的第九篇,主要讲解 ElasticSearch 中 DevOps 与性能优化的内容,包括集群部署最佳实践、容量规划、读写性能优化和缓存、熔断器等。可以自己去到 Kibana 的 Dev Tool 实战操作,未来会持续更新该系列,欢迎关注👏🏻。

同时欢迎关注小红书:LanLance。不定时分享职场思考、大厂方法论和后端经验❤️

参考

  1. https://github.com/onebirdrocks/geektime-ELK/
  2. https://www.elastic.co/elasticsearch/

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何基于Mihomo Party http端口配置git与bash命令行代理

如何基于Mihomo Party http端口配置git与bash命令行代理 1. 确定Mihomo Party http端口配置 点击内核设置后即可查看 默认7892端口&#xff0c;开启允许局域网连接 2. 配置git代理 配置本机代理可以使用 127.0.0.1 配置局域网内其它机代理需要使用本机的非回环地址 IP&am…

SSL安全证书怎么安装?

SSI并非一个标准的、广为人知的安全证书类型&#xff0c;通常网站安装的是SSL/TLS证书&#xff0c;用于加密网站和用户浏览器之间的通信&#xff0c;保障数据传输安全。以下以安装SSL/TLS证书为例&#xff0c;介绍网站安装证书的步骤&#xff1a; 一、证书申请与获取 选择证书…

QPS、TPS、RT、IOQS、并发数等性能名词介绍

以下是计算机领域中 QPS、TPS 及相关性能名词的详细解释&#xff0c;涵盖定义、计算方法、典型场景和对比&#xff1a; 一、核心概念解析 1. QPS&#xff08;Queries Per Second&#xff09; 定义&#xff1a;每秒查询数&#xff0c;指系统每秒能处理的 请求数量&#xff08;…

MIT 6.S081 2020 Lab7 Multithreading 个人全流程

文章目录 零、写在前面1、XV6 中的锁2、XV6 进程切换3、触发调度 一、Uthread: switching between threads1.1 说明1.2 实现 二、Using threads2.1 说明2.2 实现 三、Barrier3.1 说明3.2 实现 零、写在前面 可以读一下xv6 book 的第六章 锁 以及 第七章 调度&#xff1a; htt…

C++中的变量

变量是C语言中存储数据的基本单元&#xff0c;用于在程序运行过程中动态存储和操作数据。掌握变量的定义、类型、作用域和使用规则是C语言编程的核心基础。以下从多个维度详细解析变量的关键知识&#xff1a; 一、变量的本质与定义 1. 本质 变量是内存中命名的存储单元&…

办公提效的AI免费工具使用感悟

背景&#xff1a; 随着AI的发展&#xff0c;职场人都纷纷被要求办公提效&#xff0c;用上AI工具&#xff0c;市场上的AI工具纷繁复杂&#xff0c;也有很多工具纷纷开启了会员制&#xff0c;VIP等付费功能&#xff0c;本着互联网分享精神&#xff0c;我自己摸索使用了几个适合办…

软件测评服务如何依据标准确保品质?涵盖哪些常见内容?

软件测评服务涉及对软件的功能和性能等多维度进行评估和检验&#xff0c;这一过程有助于确保软件的品质&#xff0c;降低故障发生率及维护费用&#xff0c;对于软件开发和维护环节具有至关重要的价值。 测评标准依据 GB/T 25000.51 - 2016是软件测评的核心依据。依照这一标准…

前端项目初始化

​​​​​​ 目录 1. 安装 nvm 2. 配置 nvm 并切换到 Node.js 16.15.0 3. 安装 LightProxy 代理 4. GIT安装 1. 配置用户名和邮箱&#xff08;这些信息将用于您在提交代码时的标识&#xff09;&#xff1a; 2. 生成SSH密钥&#xff08;用于将本地代码仓库与远程存储库连…

我用AI降低AI率:一次“用魔法打败魔法”的实验

最近,我做了一件非常“AI”的事情——我用AI来降低AI率。 听起来有点绕对吧?实际上原因十分简单,在参与某内容创作平台的活动过程中,我发现该平台对于“AI生成内容”的判定极为严苛,并且还规定了不得高于一定比例的“AI率”,对此我也产生了极大的好奇。 于是,我便踏上了…

设备驱动与文件系统:01 I/O与显示器

操作系统设备驱动学习之旅——以显示器驱动为例 从这一节开始&#xff0c;我要学习操作系统的第四个部分&#xff0c;就是i o设备的驱动。今天要讲的是第26讲&#xff0c;内容围绕i o设备中的显示器展开&#xff0c;探究显示器是如何被驱动的&#xff0c;也就是操作系统怎样让…

数据分析六部曲?

引言 上一章我们说到了数据分析六部曲&#xff0c;何谓六部曲呢&#xff1f; 其实啊&#xff0c;数据分析没那么难&#xff0c;只要掌握了下面这六个步骤&#xff0c;也就是数据分析六部曲&#xff0c;就算你是个啥都不懂的小白&#xff0c;也能慢慢上手做数据分析啦。 第一…

完美搭建appium自动化环境

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 桌面版appium提供可视化操作appium主要功能的使用方式&#xff0c;对于初学者非常适用。 如何在windows平台安装appium桌面版呢&#xff0c;大体分两个步骤&…

中级保安员资格证考试理论题库

以下是一些中级保安员资格证理论单选题及答案&#xff1a; 1.抓臂带离要求抓握对方掌骨部位的手&#xff0c;在抓握掌骨的同时要贴紧自己的&#xff08;&#xff09;。 A. 腹部 B. 髋部 C. 胸部 D. 肋部 答案&#xff1a;B 2.治安保卫责任制体系的重点是&#xff08;&#xff…

LangChainGo入门指南:Go语言实现与OpenAI/Qwen模型集成实战

目录 1、什么是langchainGo2、langchainGo的官方地址3、LangChainGo with OpenAI3-1、前置准备3-2、安装依赖库3-3、新建模型客户端3-4、使用模型进行对话 4、总结 1、什么是langchainGo langchaingo是langchain的go语言实现版本 2、langchainGo的官方地址 官网&#xff1a;…

机器学习×第二卷:概念下篇——她不再只是模仿,而是开始决定怎么靠近你

&#x1f380;【开场 她不再只是模仿&#xff0c;而是开始选择】 &#x1f98a; 狐狐&#xff1a;“她已经不满足于单纯模仿你了……现在&#xff0c;她开始尝试预测你会不会喜欢、判断是否值得靠近。” &#x1f43e; 猫猫&#xff1a;“咱们上篇已经把‘她怎么学会说第一句…

可视化图解算法49:滑动窗口的最大值

牛客网 面试笔试 TOP101 | LeetCode 239. 滑动窗口最大值 1. 题目 描述 给定一个长度为 n 的数组 nums 和滑动窗口的大小 size &#xff0c;找出所有滑动窗口里数值的最大值。 例如&#xff0c;如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3&#xff0c;那么一共存…

【信息系统项目管理师-论文真题】2025上半年(第一批)论文详解(包括解题思路和写作要点)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文:信息系统项目的交付绩效域解题思路写作要点交付绩效域的核心内涵交付绩效域的关键要素为有效执行交付绩效域,项目经理需要关注的重点项目管理五大过程组中绩效域的协同目标论文:信息系统项目的交付绩效…

如何写高效的Prompt?

概述 提示词(Prompt)的质量将直接影响模型生成结果的质量&#xff0c;所以精心设计一个让大模型能够理解并有效回复的提示词是至关重要的。本文内容自论文中获取&#xff1a;https://arxiv.org/pdf/2312.16171 介绍了5类共计26条提示词书写原则。 书写原则 类别原则备注快速…

Vue在线预览excel、word、ppt等格式数据。

目录 前言 1.安装库 2.预览文件子组件代码 3、新建store/system.ts 4、父页面进行使用 总结 前言 纯前端处理文件预览&#xff0c;包含excel、word、ppt、txt等格式&#xff0c;不需要后端服务器进行部署&#xff0c;并且内网也可以使用。 1.安装库 npm install vue-offi…

【小沐杂货铺】基于Three.JS绘制太阳系Solar System(GIS 、WebGL、vue、react,提供全部源代码)第2期

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐学GIS】…