文档章节

OpenTSDB设计解读

猪刚烈
 猪刚烈
发布于 2014/10/12 11:39
字数 1711
阅读 188
收藏 0
点赞 0
评论 1
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)来标识一条数据。严格地说,指标和标签之间并没有必然的从属关系,就像两个不同的指标的数据可能都有指示其来自哪台主机的host标签一样,但是有一点是确定的,即:对于一条数据来说,应该至少含有一个指标和一个标签,这样的数据才是有意义的,因此,在OpenTSDB的表设计上,就把 指标” (metrics)和 “标签”(Tag)统一放在了 tsdb-uid表中存储, 格式为:RowKey( 自增ID,3字节数组):name:metrics,name:tagk,name:tagv 同时对它们之间的反向关联关系也作了展开存储。

实际上我们看以看到,对于数据来说,指标到数据是一对多的父子关系,标签对数据也是一对多的父子关系,OpenTSDB在这里的设计是非常具有典型性的,实际上这也是HBase表设计上的一种常见的“Pattern”把表间关联关系展开,以JOIN的结果为RowKey存储数据!包括正向关联和反向关联两类数据!(请仔细参考图1理解)

下面让我们 插入 2个metrics: proc.stat.cpu proc.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 = 01010000 01101011 = 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两种表设计风格相结合


本文转载自:http://blog.csdn.net/bluishglc/article/details/31052749

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
加载中

评论(1)

勿空
OpenTSDB为什么将一小时的数据保存到一行,为啥不是30分钟,55分钟、2两个小时呢?对着有啥研究可分享下吗?
OpenTSDB 2.3+及TCollector 1.3+安装配置排错

其实不太想用opentsdb,一直以来用influxdb+grafana挺方便的,而且tsdb依赖hbase,虽说容量和速度有保证,但是分布式系统对于一个监控平台来说,终归还是有些重了,出问题定位更繁琐,但领导...

Slaytanic ⋅ 05/23 ⋅ 0

OpenTSDB - Chunked request not supported [解决]

OpenTSDB 中提供了tsmeta的管理接口, 提供存储元数据信息。 但是当我们再调用该接口时,request body中的内容过长,TSD后端使用的是netty进行网络通信,由于不能一次接收完整,就会出现断包...

莫问viva ⋅ 2015/11/20 ⋅ 2

ARMS: 原来实时计算可以这么简单!

业务实时监控服务( ARMS)是一款阿里云应用性能管理(APM)类监控产品。借助本产品,您可以基于前端、应用、业务自定义等服务,迅速便捷地为企业构建秒级响应的业务监控能力。 其中自定义监...

中间件小哥 ⋅ 06/07 ⋅ 0

linux-快速安装可视化面板grafana

  简介   Grafana是一个可视化面板(Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器,支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源...

linux运维菜 ⋅ 06/20 ⋅ 0

深度解读!时序数据库HiTSDB:分布式流式聚合引擎

背景 HiTSDB时序数据库引擎在服务于阿里巴巴集团内的客户时,根据集团业务特性做了很多针对性的优化。 然而在HiTSDB云产品的打磨过程中逐渐发现,很多针对性的优化很难在公有云上针对特定用户...

技术小能手 ⋅ 04/19 ⋅ 0

Learn Influxdb the hard way (1) - Overview of the architecture

前言 Influxdb是目前最流行的时序性数据库之一,由Go语言编写,无需特殊的环境依赖,简单方便,非常适合作为监控系统的后端存储。在容器相关领域的场景中,经常和telegraf、grafana、prometh...

莫源 ⋅ 05/04 ⋅ 0

大数据时代数据库-云HBase架构&生态&实践

2018第九届中国数据库技术大会,阿里云高级技术专家、架构师封神(曹龙)带来题为大数据时代数据库-云HBase架构&生态&实践的演讲。主要内容有三个方面:首先介绍了业务挑战带来的架构演进,其...

云迹九州 ⋅ 05/21 ⋅ 0

基于阿里云HiTSDB搭建工业物联网平台实践

背景 工业企业的能耗占了全社会能耗的绝大多数,本方案基于阿里云全面的物联网、云计算与大数据技术搭建云端的企业能源管理物联网平台实现能耗数据采集、统计分析、平衡调度、节能优化等全面...

中间件小哥 ⋅ 04/23 ⋅ 0

(6)Centos7 搭建pyenv

1.引言 在工作中不同项目对的版本有着不同的要求,与的差异,是的很多时候我们要同时使用者两种环境来做对比。众所周知,的交互性设计能带来很大的方便。最理想的状态下就是能够随时切换的版...

lovecarpenter ⋅ 03/21 ⋅ 0

大数据:美团酒旅实时数据规则引擎应用实践

背景 美团点评酒旅运营需求在离线场景下,已经得到了较为系统化的支持,通过对离线数据收集、挖掘,可对目标用户进行T+1触达,通过向目标用户发送Push等多种方式,在一定程度上提高转化率。但...

meituantech ⋅ 04/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

20.zip压缩 tar打包 打包并压缩

6月25日任务 6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩 6.5 zip压缩工具: zip支持压缩目录 zip压缩完之后原来的文件不删除 不同的文件内容其实压缩的效果不一样 文件内有很多重复的用xz压...

王鑫linux ⋅ 12分钟前 ⋅ 0

double类型数据保留四位小数的另一种思路

来源:透析公式处理,有时候数据有很长的小数位,有的时候由在四位以内,如果用一般的处理方法,那么不足四位的小树会补充0到第四位,这样子有点画蛇添足的感觉,不太好看。所以要根据小数的...

young_chen ⋅ 19分钟前 ⋅ 0

Python 优化 回溯下降算法

使用sympy构造表达式,实现回溯下降算法 画出函数图像,先使用暴力搜索,找到最小值约为2.5左右 然后选定初始点,开始进行回溯搜索,下降方向为负梯度方向 下降的误差与步数大致呈现下面的状...

阿豪boy ⋅ 23分钟前 ⋅ 0

Django配置163邮箱出现 authentication failed(535)错误解决方法

最近用Django写某网站,当配置163邮箱设置完成后,出现535错误即:smtplib.SMTPAuthenticationError: (535, b'Error: authentication failed') Django初始配置邮箱设置 EMAIL_HOST = "smtp.1...

陈墨轩_CJX ⋅ 25分钟前 ⋅ 0

用接口模拟可伸缩枚举(34)

1、枚举的可伸缩性最后证明都不是什么好点子 扩展类型的元素是基本类型实例,基本类型的实例却不是扩展类型的元素,很混乱 目前还没有很好的方法来枚举基本类型的所有元素,及其扩展 可伸缩性...

职业搬砖20年 ⋅ 28分钟前 ⋅ 0

Ubuntu18.04 IDEA快捷键无法使用

IDEA默认的回退到上一视图的快捷键是Ctrl + Alt + Left,在ubuntu中这个快捷键被占用了,在16.04中可以在界面中取消这个快捷键,但是18.04就看不到了,可以使用以下命令解决 gsettings set ...

Iceberg_XTY ⋅ 33分钟前 ⋅ 0

如何解决s权限位引发postfix及crontab异常

一、问题现象 业务反馈某台应用服务器,普通用户使用mutt程序发送邮件时,提示“postdrop warning: mail_queue_enter: create file maildrop/713410.6065: Permission denied”,而且普通用法...

问题终结者 ⋅ 45分钟前 ⋅ 0

Unable to load database on disk

由于磁盘空间满了以后,导致zookeeper异常退出,清理磁盘空间后,zk启动报错,信息如下: 2018-06-25 17:18:46,904 INFO org.apache.zookeeper.server.quorum.QuorumPeerConfig: Reading co...

刀锋 ⋅ 今天 ⋅ 0

css3 box-sizing:border-box 实现div一行多列

<!DOCTYPE html><html><head><style> div.container{ background:green; padding:10px 10px;}div.box{box-sizing:border-box;-moz-box-sizing:border-box; /* Fir......

qimh ⋅ 今天 ⋅ 0

Homebrew简介和基本使用

一、Homebrew是什么 Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径...

说回答 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部