`

一篇很好的解决系统问题过程描述文章

 
阅读更多
在网上看到的一篇解决hbase性能问题的文章,虽然文章不长,但是我相信作者在此经历的过程和从中学到的知识要比这个深刻的太多了。
原文地址:http://tech.meituan.com/opentsdb_hbase_compaction_problem.html

业务背景

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 的流量会平缓很多。

[/size][/b]经验和教训[/size][/b]
几经辗转,终于找到问题原因所在(离解决问题还有距离),下面是我的几点感受:

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

相关推荐

    jsp新闻发布系统源码

    JSP中文网新闻发布系统是由jsp中文网为了方便...每一篇新闻都可以有自己的关键字来描述,说明该新闻的主要内容,并且可以关联该新闻内容相似的新闻,新闻还可以无限分类。让您可以在一个新闻系统中管理你所有的新闻。

    JSPCNnews10.rar_B/S新闻_jsp 文章发布

    SP中文网新闻发布系统是由jsp中文网为了方便管理...每一篇新闻都可以有自己的关键字来描述,说明该新闻的主要内容,并且可以关联该新闻内容相似的新闻,新闻还可以无限分类。让您可以在一个新闻系统中管理你所有的新闻

    操作系统(内存管理)

    在很多 UNIX® 系统中,为了指出当前系统中断点,必须使用 sbrk(0) 函数。 sbrk 根据参数中给出的字节数移动当前系统中断点,然后返回新的系统中断点。使用参数 0 只是返回当前中断点。这里是我们的 malloc 初始化...

    UML学习入门就这一篇文章

    UML这三个字母的全称是UnifiedModelingLanguage,直接翻译就是统一建模...UML就是其中的一种标准,注意这可不是唯一标准,只是UML是大家比较推崇的一种标准而已,说不定以后有一个更好的标准可能会取代她呢!UML并不是强

    Unity communicate with serialport.rar

    1、几个月前我发布过一篇关于Unity的串口通信问题,只是阐述了问题,但是没有什么好的解决方案。经过我几个对串口相关的Unity项目开发,也发现了几种解决方案。开发中遇到的一些问题都详细的描述出来。 2、在上一篇...

    人体通信网络BAN

    一篇国外的很好的人体通信文章。传感器节点网络放置或植入到一个生物体体内形成的网络叫做肢体区域网络(BAN)。这项工作中我们将描述肢体区域网络的原则,肢体区域网络利用人的身体作为一个传输媒介,即人体通信(IBC)。...

    论文研究 - 耦合二维反应扩散系统的有限差分隐式格式

    在这篇研究文章中,描述了两个有限差分隐式数值方案,以近似以耦合形式存在的二维修正反应扩散费舍尔系统的数值解。 有限差分隐式方案显示了计算算法的无条件稳定和二阶准确性质,并且通过具有已知解析解的示例完成...

    初学者如何玩转类GPT产品,看完你可能会觉得不仅简单,而且容易上手

    在初学阶段,向AI大模型提问时 使用模板化方法可能是一个很好的选择。因为模板化可以帮助新手更快速地熟悉如何与AI交流,并获得更有效的回答。以下是一些模板建议: 1:明确问题 在提问时,请确保问题表述清晰明了...

    进化过程:一个特殊问题

    为了理解生物系统的动态特性,理解进化过程的本质的重要性,在本期的三篇文章中得到了很好的说明。 John Maynard Smith、Edward J. Feil 和 Noel H. Smith 描述了细菌致病菌株的种群动态,以及重组和爆炸性克隆生长...

    软件过程规范

    其实以前零散的也整理过其中的一些,只是完整的一直就没很好的整理,现在贴出的这个也只是相当于目录结构式的: 这份基本是个目录式的,明天按照这个结构完整的写出一篇关于软件过程规范的文章,主要是完整的进行...

    ADC和DAC设计中接地的问题.doc

    尽管datasheet建议它们应该分别连到系统的模拟地和数字地,但通常更好的做法是忽略这个建议,将它们连在一块再接到系统的模拟地。   一个哲学问题!   AGND和DGND应该都连到系统模拟地平面。描述...

    软件设计规范

    阐述问题,写文章我们有某篇布局之法;哲学研究我们有严谨的逻辑方法。需求分析,我们一定可以创造自己的方法。这是什么方法?满足使用要求,满足使用流程。离散/隔离各个需求。事实上,面向外部的分析理解和面向...

    游戏画面就弹出内存不能为read修复工具

    解决方法:Win XP的“预读取”技术这种最佳化技术也被用到了应用程序上,系统对每一个应用程序的前几次启动情况进行分析,然后新增一个描述套用需求的虚拟“内存映像”,并把这些信息储存到WindowsPrefetch文件夹。...

    刀客建站系统 v1.0.zip

    可视化编辑,所见即所得,制作一个图文并茂的网页就像用word编辑一篇文档一样简单。不需网页制作方面的技能知识,就能轻松建好您的站点。 (4)简约不简单,功能很强大 预设多个模板,同时允许用户修改默认的模板...

    37篇经过消化云计算论文打包下载

    GridBatch系统为解决在云计算下的大规模精密数据批处理问题,GridBatch是一个编程模型,用户能控制数据的分割,控制计算怎么被分布的,最后给出一个例子,展示了他在EC2下的高性能。 8、 Cost-Benefit Analysis ...

    miceCMS觅策企业网站管理系统 5.0.zip

    miceCMS通过重新路由规则实现URL伪静态,这不仅只是针对搜索引擎具有很好的友好性,同时对于访问者来说也是如此;您可以对网站首页以及各分类、内容页面设定各自的关键字(Keywords),描述信息(Description)和标题...

    深入COM服务器.doc

     如果你读过上一篇文章。应该很熟悉COM客户端是怎么会事了。本文将讨论COM的另一端——COM服务器。内容包括如何用C++编写一个简单的不涉及 类库的COM服务器。深入到创建COM服务器的内部过程,毫无遮掩地研究那些库...

    Linux操作系统基础教程

    一.Linux的文件系统结构.....................................................................................................6 二. 文件类型................................................................

    37篇经过消化的云计算论文

    GridBatch系统为解决在云计算下的大规模精密数据批处理问题,GridBatch是一个编程模型,用户能控制数据的分割,控制计算怎么被分布的,最后给出一个例子,展示了他在EC2下的高性能。 8、 Cost-Benefit Analysis of ...

Global site tag (gtag.js) - Google Analytics