OpenTSDB设计解读

标签: opentsdb 设计 | 发表时间:2014-06-16 06:03 | 作者:bluishglc
出处:http://blog.csdn.net
OpenTSDB是基于HBase存储时间序列数据的一个开源数据库,确切地说,它只是一个HBase的应用而已,其对于时间序列数据的处理可以供其他系统参考和借鉴。本文会针对它在数据库的设计方面展开一些探索和讨论。本文原文链接: http://blog.csdn.net/bluishglc/article/details/31052749,转载请注明出处!

本文基于的是OpenTSDB最早的一个稳定版本1.0.0进行讲解的,下载部署完成之后,我们首先需要了解的是它的数据库Schema, 它主要有两个表:tsdb-uid和tsdb. 前者描述指标(metrics)相关的元数据,后者存储时间序列数据。首先我们来了解一下“指标”(metrics)的概念,简单讲一个指标就是一个需要收集的数据项,但是只有指标是不能全面地描述出一条数据产生的相关背景信息的,比如:如果我们要统计cpu的使用率,我们可以建立一下名为 proc.stat.cpu的metrics,如果我们从不同的机器和用户下收集了大量的cpu信息,如果没有对一条信息进行一定地标识,我们是无法区分出哪些数据来自哪台机器的哪个用户,所以我们需要建立一些“标签”(Tag)来标识一条数据,而这些“标签”是从属于一个指标的。所以如果是关系建模的话,“指标”(metrics)、“标签”(Tag)和“记录”(Record)三者之间的关系应该是: (下载EA)

但是到了OpenTSDB的表设计上,就把“指标”(metrics)和“标签”(Tag)统一放在了tsdb-uid表中存储,而两者之间的关联关系则直接按JOIN的形式做为一条纪录存储了,格式为:
RowKey( 自增ID,3字节数组):name:metrics,name:tagk,name:tagv
同时也对它们之间的 反向关联关系也作了展开存储。

这里要特别强调的是, 这里设计是非常具有典型性的,实际上这也是HBase表设计上的一种常见的“Pattern”把表间关联关系展开,以JOIN的结果为RowKey存储数据!包括正向关联和反向关联两类数据!(请仔细参考图1理解)

下面让我们插入2个metrics: proc.stat.cpuproc.stat.mem,以及一条记录:  proc.stat.cpu 1297574486 54.2 host=foo type=user来观察一下数据表结构

首先是 tsdb-uid表:



从表中的记录可知:

1. 第一条记录:rowkey为\x00,含3个字段:metrics,tagk,tagv, 其值分别是已经添加的所有指标、标签名和标签值的数量。这一条数据是系统生成和维护的。这里有两个metrics:cpu和mem,两个key:host和type,两个value:foo和user,所以 rowkey为\x00的三个数据的value都是2

2. 一个UID是针对一种指标+一种标签名+一种标签值的组合分配的,即: 一种指标+一种标签名+一种标签值 = 一个UID,也就是说:一个UID对应的一种指标+一种标签名+一种标签值的组合才是可以单独抽取出来时行统计的最小单位!

然后我们看 tsdb表:

我们看重点看一下纪录表的rowkey:

指标UID(指标+标签的某个组合)+ 数据生成时间(取整点时间)+标签1-Key的UID+标签1-Vlaue的UID+...+标签N-Key的UID+标签N-Vlaue的UID

让我们以图纪录为例,重点看一下时间的处理:

1297574486 = 2011-02-13 13:21:26    

MWeP = 01001101 01010111 01100101 01010000 = 1297573200 = 2011-02-13 13:00:00 (截取整点小时位)

PK 0101000001101011 1286 (从整点小时到记录时间的秒偏差,1286秒正是21分钟26秒)

1297573200+1286=1297574486

PK,即小时内秒数被当作了Column

一些设计技巧:

1. 针对Hot Spot的应对策略

OpenTSDB处理的是典型的时间序列化数据,必然面临“热点”问题,关于它对热点问题的处理,HBase的官方文档  http://hbase.apache.org/book/rowkey.design.html 中专门提到过:

 However, the difference is that the timestamp is not in the  lead position of the key, and the design assumption is that there are dozens or hundreds (or more) of different metric types. Thus, even with a continual stream of input data with a mix of metric types, the Puts are distributed across various points of regions in the table.    

一般来说,如果使用时间做rowkey,那么前面就必须加“哈希”字段(也就是salted处理)。但是OpenTSDB并没有特别的哈希字段,它的处理比较聪明:首先,时间字段不会放在rowkey的开始位置,其次,rowkey开始位置挑选了自身的一个理想的业务字段“metrics"来替代了“哈希”字段。

从OpenTSDB的处理上我们可以总结出一点:在处理时间序列数据时,如果系统中存在“理想的”“天然的”起哈希作用的字段应该优先考虑其作为rowkey的起始组成部分,后接时间字段,但如果找不到这样的字段再设置人工的哈希字段


2. rowkey的设计思想

一.为了能够检索特定的metrics,tag name,tag name的data point, 将 metrics,tag name,tag name编入rowkey是显然的事情,但是直接使用它们来组成rowkey有两个明显的问题:
1. 会占用大量的存储空间(因为这些值会大量重复地出现在很多的rowkey中)
2. 由于每一个metrics,tag key,tag value的长度都是不固定的,这不利于通过字节偏移量来直接定位它们.(否则需要使用特定的分隔符,而且为了避免输入信息中可能存在特定的分隔符导致解析出错,还要对所有输入信息的分割符进行转义处理)

围绕一个性能指标,会有多种附加"属性"(或者说"标签")对其进行说明与描述, 那么对指标的查询也自然是以这些标签或标签值展开的,因此一条指标记录的rowkey必然要包含这些标签和标签值.但是由于标签和标签值是不定长的,这为rowkey的设计带来麻烦,所以需要为这些标签和标签值分配一个定长的ID,在rowkey中使用它们的ID来指代它们,这样rowkey就可以规范化,方便从rowkey中直接通过偏移截取需要的"部分".
二.Tall-Narrow和Wide-Flat两种表设计风格相结合


作者:bluishglc 发表于2014-6-15 22:03:08 原文链接
阅读:73 评论:0 查看评论

相关 [opentsdb 设计] 推荐:

OpenTSDB设计解读

- - CSDN博客云计算推荐文章
OpenTSDB是基于HBase存储时间序列数据的一个开源数据库,确切地说,它只是一个HBase的应用而已,其对于时间序列数据的处理可以供其他系统参考和借鉴. 本文会针对它在数据库的设计方面展开一些探索和讨论. 本文原文链接: http://blog.csdn.net/bluishglc/article/details/31052749,转载请注明出处.

OpenTSDB的设计之道(转)

- - 数据库 - ITeye博客
原文地址:http://san-yun.iteye.com/blog/1993519. OpenTSDB是一个架构在Hbase系统之上的实时监控信息收集和展示平台. 它在海量数据的压力下,仍然保证了存储的效率,那么它背后有什么值得借鉴的地方呢. 1)使用AsyncHbase而非HBase自带的HTable.

OpenTSDB 详解

- - 运维生存时间
OpenTSDB用HBase存储所有的时序(无须采样)来构建一个分布式、可伸缩的时间序列数据库. 它支持秒级数据采集所有metrics,支持永久存储,可以做容量规划,并很容易的接入到现有的报警系统里. OpenTSDB可以从大规模的集群(包括集群中的网络设备、操作系统、应用程序)中获取相应的metrics并进行存储、索引以及服务,从而使得这些数据更容易让人理解,如web化、图形化等.

OpenTSDB监控系统的研究和介绍

- - 搜索技术博客-淘宝
此次航天局为了让天宫一号与神舟九号载人交会顺利对接成功,采用了新一代数值天气预报系统为神九保驾护航. 新一代数值天气预报系统是中国国内技术最先进、分辨率最高、预报时效最长的数值天气预报系统. 新系统在火箭燃料加注、飞船发射和返回、载人交会对接等关键节点发挥重要作用. 同样,作为后台系统或网站的运维,我们同样需要类似的监控或预报系统快速发现各种不稳定现象和解决性能问题以达到SLA(服务等级协议)的标准.

为了设计而设计

- - 幻风阁|kent.zhu'sBlog
我有个习惯,每天晚上睡前会搜罗一遍最新的App用用. 最开始的时候ios的App还相对比较朴实,强调功能的实用性,后来不知何故吹起一阵ios的App必须足够精美的怪风. 于是乎,各类App纷纷上演换装游戏,一个比一个做的精美,即使是一个很工具性的应用也把自己浓妆艳抹的往坐台小姐的风格搞……. 上周末跟Tony和Angela在下厨房喝茶闲聊,我说目前的移动产品设计可以分为2类,一类是做给用户用的,一类是做给设计师们欣赏与收藏的.

杯盖设计

- Yu - 创意设计-有趣、时尚、另类的创意
微向上的设计,在倒水完毕的时候可以让水滴顺着杯盖回流到杯子中,而不会随意的滴下来. 虽然是细小的设计,但是考虑的却是生活的便利.

再设计Redesign

- Mark - 腾讯CDC
  一个网站的核心是它的功能和内容,而设计则决定了这些功能、内容如何被组织和展现出来.   对已成功的网站进行再设计——重新构造它的组织和展现形式是具有挑战性的. 偏偏有设计师喜欢迎难而上,尝试对facebook、google这些著名网站进行概念设计. 他们通常有两条思路,一是对现有问题挖掘然后改进,二是提出完全创新的想法.

简约设计

- - 淘宝网通用产品团队博客
写下这个标题,那么首先得要明确什么叫简约. 简约就是让用户操作简单,让用户更快的达到自己的目的. 一个产品在于解决一个需求,如何让用户最好的完成需求就成为一个产品经理首先得要解决的问题. 那么在日常工作中,我们又有什么可以做的呢. 在《简约至上》里面有四种策略,但是有的东西太高级了,在平时的工作未必能够用得上,所以我自己来提炼一下,看看日常工作中能够遇到并且可以解决问题的方法.

再设计Redesign

- 小趴 八足趴 八足 ramener - 互联网的那点事...
一个网站的核心是它的功能和内容,而设计则决定了这些功能、内容如何被组织和展现出来. 对已成功的网站进行再设计——重新构造它的组织和展现形式是具有挑战性的. 偏偏有设计师喜欢迎难而上,尝试对facebook、google这些著名网站进行概念设计. 他们通常有两条思路,一是对现有问题挖掘然后改进,二是提出完全创新的想法.