OpenTSDB 造成 Hbase 整点压力过大问题的排查和解决

业务背景

OpenTSDB 是一款非常适合存储海量时间序列数据的开源软件,使用 HBase 作为存储让它变的非常容易扩展。我们在建设美团性能监控平台的过程中,每天需要处理数以亿计的数据,经过几番探索和调研,最终选取了 OpenTSDB 作为数据存储层的重要组件。OpenTSDB 的安装和配置过程都比较简单,但是在实际的业务应用中,还是会出现这样那样的问题,本文详细介绍我们在OpenTSDB 实际使用过程中遇到的 HBase 整点压力过大的问题,期望对大家有些参考意义。

问题的出现

性能监控平台使用 OpenTSDB 负责存储之后不久(创建的表名称是 tsdb-perf),数据平台组的同事发现,tsdb-perf 这个表在最近这段时间每天上午 10 点左右有大量的读操作,造成 HBase 集群压力过大,但是想去分析问题的时候发现读操作又降为 0 了,为了避免类似情况未来突然发生,需要我来排查下原因。

于是我就想:性能监控平台目前只是个内部系统,用户使用量不大,并且只有在用户需要查看数据时去查询,数据读取量不应该造成 HBase 的压力过大。

重现问题

如果要解决这个问题,稳定重现是个必要条件,根据数据平台组同事的反馈,我们做了更详细的监控,每隔两分钟采集性能监控平台所用的 HBase 集群的读操作数量,发现是下面的变化趋势:

13:00:05	0
13:02:01	66372
13:04:01	96746
13:06:02	101784
13:08:01	99254
13:10:02	2814
13:12:01	93668
13:14:02	93224
13:16:02	90118
13:18:02	11376
13:20:01	85134
13:22:01	81880
13:24:01	80916
13:26:01	77694
13:28:02	76312
13:30:01	73310
13:32:02	0
13:34:01	0
13:36:01	0
13:38:02	0
13:40:01	0
13:42:02	0
13:44:01	0
13:46:02	0
13:48:01	0
13:50:02	0
13:52:01	0
13:54:02	0
13:56:01	0
13:58:02	0
14:00:01	0
14:02:01	36487
14:04:01	43946
14:06:01	53002
14:08:02	51598
14:10:01	54914
14:12:02	95784
14:14:04	53866
14:16:02	54868
14:18:01	54122
14:20:04	0
14:22:01	0
14:24:02	0
14:26:01	0
14:28:01	0
14:30:01	0
14:32:02	0
14:34:01	0

从图上不难看出,每到整点开始 tsdb-perf 这个表的读操作飚的很高,大约持续半个小时,之后恢复到 0 。到下个整点又出现类似的问题,并没有像数据平台组同事观察到的突然回复正常了,可能他们连续两次观察的时间点刚好错开了。

于是,真正的问题就变成了:OpenTSDB 到 HBase 的读操作每到整点开始飚的很高,持续大约半小时后回复正常,这种类脉冲式的流量冲击会给 HBase 集群的稳定性带来负面影响。

定位问题所在

事出反常必有妖,OpenTSDB 到 HBase 的大量读操作肯定伴随很大的网络流量,因为两者用 HTTP 通信,我们得仔细梳理下可能造成这种情况的几种原因。性能监控平台的架构图如下:

性能平台架构图

从架构图可以看出,只有数据聚合服务和报表系统会和 OpenTSDB 交互,聚合服务向里面写数据,报表系统从里面读数据。然后 OpenTSDB 负责把数据发送到 HBase 中。从数据流动的方向来讲,有可能是报表系统导致了大量的读操作,也有可能是聚合服务里面存在不合理的读请求,也有可能是 OpenTSDB 本身存在缺陷。

首先排除的是报表系统导致的大量读操作,因为只会在用户查看某些报表时才会从 OpenTSDB 读取数据,目前报表系统每天的访问量也才几百,不足以造成如此大的影响。

其次,如何确认是否是聚合服务导致了大量的读请求呢?可以从网络流量的视角来分析,如果聚合服务到 OpenTSDB 的流量过大,完全有可能导致 OpenTSDB 到 HBase 的过大流量,但是由于目前聚合服务和 TSDB 写实例是部署在相同的机器上,无法方便的统计到网络流量的大小,于是我们把聚合服务和 TSDB 写实例分开部署,得到下面的流量统计图:

网络流量图

聚合服务只接收来自解析服务的数据包计算完毕之后发送给 TSDB,其网络流量如下图:

网络流量图

TSDB 服务只接收来自聚合服务的数据,然后发送到 HBase,却出现了脉冲式的冲高回落,网络流量如下图:

网络流量图

这样,就可以排除聚合服务造成的问题,出问题的地方就在 OpenTSDB 和 HBase 集群之间,其他业务线并没有造成 HBase 的压力过大,看来问题应该出在 OpenTSDB 里面,如果这个问题是 OpenTSDB 内部存在的,那么其他使用了 OpenTSDB 的系统肯定也存在类似的问题,下面是另外一个组部署的 OpenTSDB 的机器的网络流量图(注意,这台机器上只部署了 OpenTSDB 服务):

网络流量图

这让我更加确信问题是在 OpenTSDB 内部,也就是它的工作机制导致了这种问题。

查找问题原因

于是我先后查阅了 OpenTSDB 的官方文档和 Google Group 讨论组里的大部分帖子,还下载来了 OpenTSDB 的源代码,探个究竟,另外在从读操作从 0 到暴涨的过程中仔细盯着 OpenTSDB 的 stat 页面特别关注下面红色方框中的几个指标:

网络流量图

让我感觉比较诡异的是,与大量读操作同时发生的还有大量的删除操作,官方文档上的这段话很好的解释了我的疑惑:

If compactions have been enabled for a TSD, a row may be compacted after it’s base hour has passed or a query has run over the row. Compacted columns simply squash all of the data points together to reduce the amount of overhead consumed by disparate data points. Data is initially written to individual columns for speed, then compacted later for storage efficiency. Once a row is compacted, the individual data points are deleted. Data may be written back to the row and compacted again later.

这段话很好的解释了 OpenTSDB 的 Compaction 机制的工作原理,OpenTSDB 内部的工作原理比这个更复杂,下面我说下我通俗的理解:

  • 为了节省存储空间和提高数据读取速度,OpenTSDB 内部有个数据压缩(即 Compaction)的机制,将设定的某个时间段内某个指标的所有数据压缩成单行,重新写到 HBase;
  • OpenTSDB 运行时默认把收到的数据(原始数据点)每秒1次的速度批量写到 HBase 上,然后会周期性的触发上面提到的数据压缩机制,把原始数据点拿出来,压缩后重新写回HBase,然后把原始数据点删除,这就虽然我们只往 OpenTSDB 写数据但大量的读和删操作还是会发生的原因;
  • OpenTSDB 默认的配置是以 3600 秒为区间压缩,实际运行时就是整点触发,这样整点发生的大量读、删操作就可以解释了;

至此,线上 OpenTSDB 实例整点大量读操作造成 HBase 集群压力过大的问题原因基本明了。

如何解决问题

找到问题的原因之后,我们想到了以下 2 种解决方案:

  • 禁用 OpenTSDB 的 Compaction 机制,这样 OpenTSDB 就变成了 1 个纯粹的写实例,数据读取速度会有牺牲,因为每次读取需要扫描更多的数据,这个对于业务数据量很大的系统来说可能并不合适;
  • 想办法让 OpenTSDB 的数据压缩过程缓慢进行,这样到 HBase 的流量压力就会平缓很多,但是这样做还是有风险,因为如果从业务系统到 OpenTSDB 的流量暴涨仍然有可能会 HBase 压力过大,不过这就是另外1个问题了,HBase 需要扩容;

实际操作过程中,我们使用了第 2 种方案,修改 OpenTSDB 的源代码中 src/core/CompactionQueue.java 中的 FLUSH_SPEED 常量为 1,重新编译即可。这样改动的实际影响是:默认压缩速度是 2 倍速,即最多半个小时内完成前 1 个小时数据的压缩,重新写回到 HBase,可以把这个调成 1 倍速,给它 1 个小时的时间来完成前 1 个小时数据的 Compaction,这样到 HBase 的流量会平缓很多。

经验和教训

几经辗转,终于找到问题原因所在(离解决问题还有距离),下面是我的几点感受:

  • 解决问题之前,要能够稳定重现,找到真正的问题所在,不能停留在表面,如果不进行几个小时的 HBase 读操作监控,不会发现整点暴涨持续半小时然后回落的问题;
  • 系统的运行环境很复杂,必要的时候要想办法把问题隔离到影响因素更少的环境中,更容易发现问题,比如性能监控平台各组件的混合部署给机器间的流量分析造成了困难;
  • 使用开源软件,最好能深入了解下运行机制,用起来才得心应手,不然出了问题就很麻烦,这次的排查过程让我更加详细的了解了 OpenTSDB 的运行机制;

至此,本文完~

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

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

相关文章

LintCode 183. 木材加工(二分查找)

1. 题目 有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为 k。当然,我们希望得到的小段越长越好,你需要计算能够得到的小段木头的最大长度。 样例 1 输入: L [232, 124, 456] k 7 输出: …

AC算法在美团上单系统的应用

1.背景 在美团,为了保证单子质量,需要对上单系统创建的每一个产品进行审核。为了提高效率,审核人员积累提炼出了一套关键词库,先基于该词库进行自动审核过滤,对于不包括这些关键词的产品信息不再需要进行人工审核。因此…

LintCode 600. 包裹黑色像素点的最小矩形(BFS)

1. 题目 一个由二进制矩阵表示的图,0 表示白色像素点,1 表示黑色像素点。 黑色像素点是联通的,即只有一块黑色区域。 像素是水平和竖直连接的,给一个黑色像素点的坐标 (x, y) ,返回囊括所有黑色像素点的矩阵的最小面积…

浙大、阿里提出DictBERT,字典描述知识增强的预训练语言模型

文 | 刘聪NLP源 | NLP工作站写在前面大家好,我是刘聪NLP。今天给大家带来一篇IJCAI2022浙大和阿里联合出品的采用对比学习的字典描述知识增强的预训练语言模型-DictBERT,全名为《Dictionary Description Knowledge Enhanced Language Model Pre-training…

LintCode 207. 区间求和 II(线段树)

1. 题目 在类的构造函数中给一个整数数组, 实现两个方法 query(start, end) 和 modify(index, value): 对于 query(start, end), 返回数组中下标 start 到 end 的 和。对于 modify(index, value), 修改数组中下标为 index 上的数为 value. 样例1 输入: [1,2,7,8,5] [query(0…

深入解析String#intern

在 JAVA 语言中有8中基本类型和一种比较特殊的类型String。这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念。常量池就类似一个JAVA系统级别提供的缓存。 8种基本类型的常量池都是系统协调的,String类型的常量池…

想通这点,治好 AI 打工人的精神内耗

文 | 天于刀刀受到疫情影响,今年公司的校招生报道日还未到来,23 年的秋招提前批就已经是如火如荼地开展。而诸神黄昏算法岗,作为招聘中最靓眼的仔,简历门槛早已是硕士打底博士起步,项目竞赛多多益善的情况了。面临着今…

DHL

有句俗语谓:“不看不知道,一看吓一跳”,这次通过“中外运-敦豪”的一次快递,亲身感受到这种“吓一跳”的滋味。 MS 总部从 1 月 26 日寄出 MVP Award 快递包之后,在随后的电子邮件中给出了每个人的 DHL 快件追踪号&…

数据结构--树--线段树(Segment Tree)

文章目录1. 概念2. 建树3. 查询4. 修改5. 完整代码及测试上图 from 熊掌搜索 类似数据结构:树状数组 1. 概念 线段树是一种二叉树,是用来表示一个区间的树: 常常用来查询区间的:和、最小值、最大值树结点中存放不是普通二叉树的…

神经网络可视化有3D版本了,美到沦陷!(已开源)

源 |量子位做计算机视觉,离不开CNN。可是,卷积、池化、Softmax……究竟长啥样,是怎样相互连接在一起的?对着代码凭空想象,多少让人有点头皮微凉。于是,有人干脆用Unity给它完整3D可视化了出来。还不光是有个…

CentOS6上Hadoop集群中服务器cpu sys态异常的定位与解决

问题现象 在zabbix系统中,对Hadoop集群的历史监控数据分析时,发现在执行大Job任务时,某些服务节点的cpu sys态很高;具体以hadoop_A服务节点为例,在10:15-10:40这个时间段,cpu user态为60%,而sys…

偶也Blog了

欢迎大家和我交流…………转载于:https://www.cnblogs.com/dsclub/archive/2004/06/18/16753.html

LintCode 1692. 组队打怪(田忌赛马,二分查找)

1. 题目 你现在有n个英雄,每个英雄的战斗力为 atk1,你要用这些英雄去对付n个怪物,每个怪物的战斗力为atk2。 在一场战斗中,你需要安排每个英雄分别与一个怪兽战斗,如果英雄战斗力高于怪兽,那个怪兽就会被击杀&#xf…

谷歌搜索,全球宕机??

文 | 好困源 | 新智元忽然之间,谷歌搜索,挂了。美东时间周一晚上9点(北京时间周二早上9点)左右,有不少用户突然发现自己上不去谷歌了。对于这次谷歌的突然宕机,网友们完全没有任何的心理准备。「谷歌停止工…

.NET建模

.NET建模 Deborah Melewski, Jack Vaughan[2004/1/1] 建模和软件设计又将迎来新一波的高峰。UML和模型驱动架构MDA目前在业界越发引人注目,清晰地进行前置设计(design up front,译者注:这是过去批判得比较多的,是瀑布…

基于Flume的美团日志收集系统(一)架构和设计

背景 美团的日志收集系统负责美团的所有业务日志的收集,并分别给Hadoop平台提供离线数据和Storm平台提供实时数据流。美团的日志收集系统基于Flume设计和搭建而成。 《基于Flume的美团日志收集系统》将分两部分给读者呈现美团日志收集系统的架构设计和实战经验。 第…

LintCode 1690. 朋友推荐(二分插入)

1. 题目 某交友网站会给除了第一个用户以外的每个新注册的用户推荐一位之前已经注册过并且性格值和他最相近的用户,如果有多人满足条件则选择性格值较小的。 给定数组val[]表示按时间顺序注册的 n 位用户的性格值,输出一个大小为 n-1 的数组&#xff0…

WinForm与脚本的交互

这是去年学习SmartClient时写下的,有兴趣可以看看 将Winform Control嵌入IE,很多时候需要JS脚本与Control进行交互。一方面是在脚本中使用控件的属性,调用控件的方法,另外一方面是脚本中能够响应控件的事件。对于第一个问题较为简单&#…

我用AI大模型帮我写公众号赚钱!

文 |卖萌酱大家好,我是卖萌酱。最近太忙了,有很多想写的文章,但实在精力匮乏。怎么办,不能停更吧?就在这时,卖萌酱听到了一个新名词:AIGC。什么意思呢?我们知道互联网上的早期内容&a…

Nacos部署中的一些常见问题汇总

开个帖子,汇总一下读者经常提到的一些问题 问题一:Ubuntu下启动Nacos报错 问题描述 使用命令sh startup.sh -m standalone启动报错: ./startup.sh: 78: ./startup.sh: [[: not found./startup.sh: 88: ./startup.sh: [[: not found./startu…