Elasticsearch写入瓶颈导致skywalking大盘空白

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 前言 继上次skywalking出故障《https://my.oschina.net/keking/blog/3016839》不到一个月,线上skywalking又出毛病了。又是大盘空白,trace列表最近的数据都查询不出来,但是时间稍久的数据就能查询出来,如一天前的数据有,一个小时前的数据就没有,这个只是表象,最终查明症结是ES的服务写入瓶颈,导致写入写入数据的线程阻塞导致的。

前言

继上次skywalking出故障《https://my.oschina.net/keking/blog/3016839》不到一个月,线上skywalking又出毛病了。又是大盘空白,trace列表最近的数据都查询不出来,但是时间稍久的数据就能查询出来,如一天前的数据有,一个小时前的数据就没有,这个只是表象,最终查明症结是ES的服务写入瓶颈,导致写入写入数据的线程阻塞导致的。下面是排错过程以及解决方案说明。

问题定位

工具还是那个工具Arthas,不了解的可以翻阅我之前的博文,这里不多说明Arthas。不过这次我们应用了一个新的进阶指令thread,它可以查看当前线程信息,查看线程的堆栈。当skywalking大盘没有数据时,使用如下指令:

thread -b

thread -b, 找出当前阻塞其他线程的线程

有时候我们发现应用卡住了, 通常是由于某个线程拿住了某个锁, 并且其他线程都在等待这把锁造成的。 为了排查这类问题, arthas提供了thread -b, 一键找出那个罪魁祸首。最后得到如下的结果:

如上图,相信大家已经看到问题所在了,重点在红色字体箭头指向的部分,不得不说Arthas做的太棒了。症结就是ES的批量写入失败线程阻塞了。后从社区了解到是因为ES写入瓶颈,导致skywalking在批量写入索引的时候线程阻塞了。导致阻塞的那段时间的数据都没有写到ES,然后查询是没有问题的,表象就是skywalking的大盘空白也查询不到近期的数据了。

解决方案

临时方案,skywalking参数调优

skywalking写入ES的操作是使用了ES的批量写入接口。我们可以调整这些批量的维度。尽量降低ES索引的写入频率,如:

  elasticsearch:
    clusterNodes: 192.168.20.221:9200
    indexShardsNumber: 2
    indexReplicasNumber: 0
    # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html
    bulkActions: 4000 # Execute the bulk every 2000 requests
    bulkSize: 40 # flush the bulk every 20mb
    flushInterval: 30 # flush the bulk every 10 seconds whatever the number of requests
    concurrentRequests: 2 # the number of concurrent requests
receiver-register:
  default:
receiver-trace:
  default:
    bufferPath: ../trace-buffer/  # Path to trace buffer files, suggest to use absolute path
    bufferOffsetMaxFileSize: 500 # Unit is MB
    bufferDataMaxFileSize: 1000 # Unit is MB
    bufferFileCleanWhenRestart: false

调整bulkActions默认2000次请求批量写入一次改到4000次。批量刷新从20M一次到40M一次。这种配置调优确实生效了,重启服务后两三天了都没有出现过ES写入阻塞的问题。不过这种设置只是暂时的,你只能期望流量不突发,或者应用不增加。一旦遇到突发流量和应用的增加,ES写入瓶颈还是会凸显出来。而且参数设置过大带来了一个新的问题,就是数据写入延时会比较大,一次服务交互发生的trace隔好久才能在skywalking页面上查询到。所以最终解决方案是优化ES的写入性能。

最终方案-优化ES的写入性能

如果是自建Elasticsearch服务,可以参考这篇博文:https://www.easyice.cn/archives/207。这个博主在基础大数据团队负责搜索引擎 Elasticsearch 优化和开发,博文里分享了很多可调优配置的参数。不过我们这边综合运维人力和支出方面的考虑,决定采用阿里云提供的Elasticsearch,不过这带来了一个新的问题,阿里云的ES服务不论内外网都需要Http Basic认证,但是目前的skywalking并没有提供这种支持。

结语

skywalking是一款非常不错的开源apm产品,很多功能特性甚至可以和商业的apm产品一争高下,比如trace查询等功能。我们线上的skywalking没有全面铺开去接入应用,但是问题还是发生了不少,希望这些线上的踩坑排坑经验能带来更多的参考价值。关于Elasticsearch 带Http Basic 认证skywalking不支持的问题,将在下文详描述去解决

作者简介:

陈凯玲,2016年5月加入凯京科技。曾任职高级研发和项目经理,现任凯京科技研发中心架构&运维部负责人。pmp项目管理认证,阿里云MVP。热爱开源,先后开源过多个热门项目。热爱分享技术点滴,独立博客KL博客(http://www.kailing.pub)博主。

关于架构&运维部

凯京研发中心架构&运维部的工作主要分两大部分,架构部分主要负责框架中间件的研究,如dubbo、apollo、skywalking、xxljob、分布式事务等、公司内开源项目(https://gitee.com/kekingcn)以及公共服务公共组件的研发维护、新技术的引进以及落地等。运维部分主要负责devops系统研发以及k8s容器环境的维护等工作。

架构组招聘

目前架构组还有两个虚位以待,欢迎志同道合的你来和我们一起交流。简历可发送至邮箱:chenkailing@keking.cn

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
6月前
|
JSON Prometheus Cloud Native
Grafana 系列 - 统一展示 -8-ElasticSearch 日志快速搜索仪表板
Grafana 系列 - 统一展示 -8-ElasticSearch 日志快速搜索仪表板
|
监控 数据可视化 前端开发
部署kibana分析系统并连接elasticsearch集群展现索引数据(八)
部署kibana分析系统并连接es展现索引数据 1.kibana分析系统简介 Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级的数据分析与可视化的目的。
1032 0
部署kibana分析系统并连接elasticsearch集群展现索引数据(八)
|
存储 自然语言处理 前端开发
ElasticSearch 集群架构与搜索深入理解(中)
ElasticSearch 集群架构与搜索深入理解
1380 0
|
18天前
|
运维 监控 安全
|
6月前
|
监控 数据可视化 关系型数据库
MetricBeat + Elasticsearch + Kibana 实现监控指标可视化
MetricBeat + Elasticsearch + Kibana 实现监控指标可视化
246 0
|
存储 弹性计算 监控
阿里云ElasticSearch基础巡检指标
阿里云ElasticSearch基础巡检指标
|
数据采集 弹性计算 开发工具
使用阿里云Elasticsearch快速搭建可观测系统
本实验带您体验如何登录阿里云Elasticsearch集群,使用Beats采集器收集ECS上的系统数据和Nginx服务数据,配置基础的指标分析看板,简单展示数据采集、分析的过程和操作方式。
|
关系型数据库 MySQL Java
基于Elasticsearch+Logstash+Kibana的小型流量分析系统
基于Elasticsearch+Logstash+Kibana的小型流量分析系统
|
存储 Prometheus 监控
基于Elasticsearch的指标可观测实践
主要介绍Elasticsearch为什么做时序引擎、Elasticsearch做时序引擎的挑战、Elasticsearch 时序引擎特性介绍、阿里云基于Elasticsearch TimeStream介绍。文章结尾更有关于《阿里云Elasticsearch在时序场景下的深入探索》的demo演示视频。
1372 0
基于Elasticsearch的指标可观测实践
|
缓存 搜索推荐 Java
ElasticSearch 集群架构与搜索深入理解(上)
ElasticSearch 集群架构与搜索深入理解
298 0
ElasticSearch 集群架构与搜索深入理解(上)
下一篇
无影云桌面