Products
GG网络技术分享 2026-04-17 12:10 0

哎呀,最近真是被这个 Elasticsearch 折腾得够呛!明明 CPU 看着空空荡荡的,像个没事人一样,后来啊接口响应时间却慢得让人抓狂。我简直要怀疑人生了!一开始我还以为是服务器硬件问题,各种升级硬件,后来啊呢?效果微乎其微!简直就是浪费钱啊!后来经过一番折腾和深入排查… 事情的真相简直让人哭笑不得。这就像你辛辛苦苦准备了一桌好菜,后来啊发现筷子不见了… 气不气,来一波...?
先说说做的当然是监控。监控目标嘛,无非就是想知道 ES 到底发生了什么。配置文件上加了慢查询日志和慢索引配置。用 Kibana 盯着那些日志看啊看, 一堆信息跳出来… 然后用 Logstash 把这些日志抽出来想搞个邮件告警。后来啊呢?告警倒是来了很多,可都是些“无用信息”!告诉我哪个查询慢了是好事儿,但告诉我“某个节点磁盘空间不足”或者“某个进程挂掉了”我早就知道了啊!
| 产品 | 功能 | 价格 |
|---|---|---|
| Logstash | 日志收集、 处理和转发 | 免费开源 |
| Kibana | 数据可视化和探索 | 免费开源 |
| Zabbix | IT基础设施监控 | 免费开源 |
后来在一位老哥的指点下我开始关注 ES 的内部机制——segment! ES依赖一个重要的组件Lucene,关于数据结构的优化通常来说是对Lucene的优化,它是集群的一个存储于检索工作单元,结构如下图: 在Lucene中,分为索引与检索两部分,索引部分包含分词器、 一阵见血。 过滤器、字符映射器等,检索部分包含查询解析器等。
弄一下... 一个Lucene索引包含多个segments。小的 segment 数量多的话会导致频繁的合并操作 ,而这个过程会占用大量的 IO 和 CPU 资源!
Elastic官方建议一个node最好不要多于3个shards。担心数据量增长,可以对elasticsearchJVM堆空间进行限制:最大推荐的是30-32G,所以每个分片的最大容量限制为30G,然后在对分片数量进行合理的估算。 大胆一点... 比方说,数据量达到200G,这个时候分片分配7-8个最好。分片的大小要跟堆的大小作比较。
终于在仔细分析慢查询日志的时候发现了一些端倪! 原来大部分慢查询都集中在一些特定的字段上… 这些字段恰好是一些嵌套型的字段! 而且这些字段的数据类型是 text 类型! 你说 text 类型有什么问题? 变得非常长!,加油! 1 elasticsearch Id=247 WAITING on java.util.concurrent.LinkedTransferQueue@369223fa 2 at sun.misc.Unsafe.park 3 - waiting on java.util.concurrent.LinkedTransferQueue@369223fa 4 at java.util.concurrent.locks.LockSupport.park 5... 此时segment被打开并供search使用查询 3.buffer清空并重复上述步骤 4.buffer不断添加、 开搞。 清空translog不断累加,当达到某些条件触发commit操作,刷到磁盘。es默认的刷盘操作为request但容易部分操作比较耗时,在日志型集群、允许数据在刷盘过程中少量丢失可以改成异步async 文章浏览阅读1k次。监控目标 1.在elasticsearch配置文件上添加慢查询日志和慢索引配置 2.使用kibana监测elasticsearch慢查询日志的生成,使用logstash抽取日志的方式,有慢查询日志生成,就以邮件告警的方式提醒。 3.使用zabbix分别监控集群的状态、 CPU进程数、磁盘读写性能、JVM使... 文章浏览阅读5.7k次。 最近在做一些索引相关的优化测试, 未来可期。 最近项目上线了一个elasticsearch相关的功能,
| 参数名称 | 默认值 | 描述 |
|---|---|---|
| refresh_interval | 1s | 控制 ES 多久刷新一次索引的内容到磁盘上 |
| bulk size | 5MB | 控制每次批量请求的大小 |
我的看法是... 如何提高elasticsearch的查询速度 版权收获一边被
码到三十五04-082万+
操作动态配置,
我真想把当初那个推荐我用 Elasticsearch 的家伙揪出来好好问问他!当然啦… 现在问题解决了就好…希望这篇文章能给正在经历类似困境的朋友们带来一些帮助! .Demand feedback