`

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

 
阅读更多
在网上看到的一篇解决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
分享到:
评论

相关推荐

    一篇很好的架构文章

    【描述】:“一篇很好的架构文章 从各个角度总结了电商平台中的架构实践”表明这篇文章详细探讨了电商平台的架构设计,涵盖了多个关键领域,如系统架构的优化、服务的分布化、高可用性保障、负载均衡、数据存储以及...

    关于C++ 语录的一篇很好的文章

    这篇文章的标题"关于C++ 语录的一篇很好的文章"暗示了作者可能通过引用一系列富有洞察力的C++知识点,帮助读者理解和掌握这种强大的编程语言。C++的学习不仅仅是语法的堆砌,更是对计算机底层机制和编程思维的深刻...

    一篇关于程序员 文章

    Date的《Database System Concepts》是一本很好的数据库系统教材。 - 在线社区如CSDN提供了丰富的学习资源,包括博客文章、论坛讨论等,这些都是非常有价值的资料。 - 阅读英文资料也是提高技能的有效途径之一,...

    程序员们必读的一篇好文章

    “程序员们必读的一篇好文章”可能会探讨开源技术如何帮助程序员提高编程效率、解决问题速度等方面的优势。通过参与开源项目或贡献代码,程序员可以更好地理解系统底层逻辑,增强解决问题的能力。同时,这也是一个...

    一遍很好介绍VFS文件系统结构的文章

    在现代操作系统中,Linux以其高效率和灵活...为了进一步深入了解VFS和Linux文件系统结构,读者可以参考提供的资源链接,该链接指向了一篇详细介绍相关主题的文章,旨在为对Linux内核感兴趣的读者提供更深入的学习资源。

    acm弱校奋斗史,一篇很好的文章

    总的来说,这篇文章揭示了ACM竞赛对于弱校队伍的意义,它不仅是一个竞技平台,更是一个自我提升、团队协作和挑战极限的过程。无论结果如何,每一次的参赛都是对自身能力和意志的锻炼,也是对团队精神的锤炼。它鼓励...

    怎样写好一篇文章.doc

    【怎样写好一篇文章】 写好一篇文章是每个作者都需要掌握的基本技能,这涉及到多个方面的准备和实践。首先,提升写作水平需要长期的积累和多方面的学习。要关注阅读,尤其是语文课堂的学习,深入理解课文的内容和...

    一抹天蓝文章欣赏系统

    从标签"源代码"和"源码"来看,这个压缩包可能包含的是系统的源代码,对于开发者来说,这是一个很好的学习和定制的资源。用户可以深入研究代码,理解其工作原理,甚至根据自己的需求进行二次开发。同时,"资料"标签...

    ofdm很经典很好的文章

    10. **一种OFDMA系统资源分配方案.pdf**:在OFDMA系统中,资源分配是优化系统性能的关键,涉及到子载波分配、功率分配等问题。文章可能提出了一种新的资源分配策略,以提高频谱效率和用户公平性。 这些文章全面覆盖...

    两篇很好的情感文章.ppt

    第一篇文章通过描述一位女性在不同男性间的情感历程,揭示了男性和女性在感情表达与处理上的差异。男性可能不会留意每一个细节,不会经常用甜言蜜语表达爱意,也不会刻意庆祝每一个纪念日,但他们在关键时刻给予的...

    科技英语论文范文(很好的一篇文章,大家赶快下载吧。)

    论文中详细描述了为柴油机设计的在线诊断实验平台,该平台旨在模拟真实工况下的曲轴运行,集成MMMT诊断系统,并结合扭转信号分析,以实现对曲轴裂纹的实时监测和预警。 5. 结论与展望 论文最后对在线MMMT方法进行...

    新闻文章JSPCN中文网新闻发布系统v1.0-jspcnnews10

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

    基于PHP的好文本移动网站文章管理系统(GMArticle)php版源码.zip

    【标题】"基于PHP的好文本移动网站文章管理系统(GMArticle)php版源码.zip" 描述了一个使用PHP编程语言开发的文章管理系统,专为移动网站设计,旨在帮助用户高效地管理和发布文章内容。该系统可能包含了一系列核心...

    ARM9开发系统的linux启动过程剖析的文档

    本篇文章将深入探讨基于ARM9开发系统的Linux启动过程,帮助读者理解这一复杂但至关重要的技术环节。 首先,我们需要知道Linux启动过程可以分为几个主要阶段:BIOS或Bootloader、Kernel加载和初始化、Initramfs以及...

    article20.rar_admin_ClassMan.asp_asp 文章管理_index.asp_文章管理系统

    对于初学者,这是一个很好的实践平台,能够深入理解服务器端脚本语言如何驱动动态网站。同时,对于经验丰富的开发者,这可能是一个快速搭建简单内容管理系统的起点,可以在此基础上进行定制和扩展。

    socket编程的几篇很好的文章.rar_UNIX_csocket_socket_socket linux_socket 文

    6. **socket编程的几篇很好的文章**: 这个文件名表明压缩包内包含了一些关于Socket编程的文章,可能涵盖了基础概念、编程实例、疑难问题解答等内容,对于初学者或者进阶者来说都是宝贵的学习资源。 在学习Socket...

    线性系统理论-中英文对照.doc

    在线性系统理论中,有很多重要的概念和技术,例如: 1. 线性代数方程:线性代数方程是研究线性系统的基本工具,它可以用来描述系统的行为和性能。 2. 特征值和特征向量:特征值和特征向量是研究线性系统的重要概念...

    bbarticle10 文章管理系统

    《bbarticle10 文章管理系统》是一个针对个人网站设计的小型但功能齐全的文章管理系统。它借鉴了当前流行的动网文章管理系统的模式,旨在为用户提供一个简单易用且高效的平台来管理和发布文章。在这个系统中,用户...

    固定拓扑下带有时延的二阶多智能体系统的一致性问题.pdf

    同时,对于学习和研究多智能体系统一致性问题的学生,这篇文章也是一个很好的学习材料,能够帮助他们更好地理解和掌握相关理论知识。通过这篇文章,我们可以看到,尽管多智能体系统的一致性问题充满挑战,但通过创新...

    俄罗斯方块游戏,虽然没有源代码,但是有一篇文章详细的讲解了制

    在这个项目中,虽然没有提供完整的源代码,但有一篇文章详细介绍了如何制作这个游戏。这为对游戏编程感兴趣的人提供了一次学习的机会,特别是对于那些想要了解游戏开发基础的人来说,这是一个很好的实践项目。 描述...

Global site tag (gtag.js) - Google Analytics