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.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 = 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两种表设计风格相结合

OpenTSDB设计解读的更多相关文章

  1. AI移动自动化测试框架设计(解读)

    声明:原文出自"前端之巅"微信公众号"爱奇艺基于AI的移动端自动化测试框架的设计"一文,作者:何梁伟,爱奇艺Android架构师.文章提供了一种基于AI算法的自 ...

  2. HashMap源码解析和设计解读

    HashMap源码解析 ​ 想要理解HashMap底层数据的存储形式,底层原理,最好的形式就是读它的源码,但是说实话,源码的注释说明全是英文,英文不是非常好的朋友读起来真的非常吃力,我基本上看了差不多 ...

  3. HBase高性能复杂条件查询引擎

    转自:http://blog.csdn.net/bluishglc/article/details/31799255 mark 写在前面 本文2014年7月份发表于InfoQ,HBase的PMC成员T ...

  4. 最佳运动类APP-Keep设计与欣赏

    运动类APP是大家手机中必备的一款软件.如果说谁手机里没有任何涉及运动类APP,那只能说真的与时代脱轨了.近些年随着物质生活条件的改善,人们开始越来越重视自己的身体,所以也越来越多的人会进行身体锻炼. ...

  5. "犯罪心理"解读Mybatis拦截器

    原文链接:"犯罪心理"解读Mybatis拦截器 Mybatis拦截器执行过程解析 文章写过之后,我觉得 "Mybatis 拦截器案件"背后一定还隐藏着某种设计动 ...

  6. slide效果

    html和js部分 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  7. Tornado 的教材

    Tornado 的教材 作者:杨昆链接:https://www.zhihu.com/question/19707966/answer/12731684来源:知乎著作权归作者所有,转载请联系作者获得授权 ...

  8. OpenTSDB-Writing Data

    Writing Data You may want to jump right in and start throwing data into your TSD, but to really take ...

  9. TCollector

    TCollector tcollector is a client-side process that gathers data from local collectors and pushes th ...

随机推荐

  1. 核苷酸(evolution)

    核苷酸(evolution) 题目描述 生物课是帕特里克最讨厌的课程,没有之一. 相比做一些无聊而又无趣的遗传题,他更喜欢其他所有的科目. 包括英语. 但是今天不同.他被一个关于RNA感染DNA的题目 ...

  2. android在JNI_OnLoad入口函数下断点动态调试so库

    一般来说,很多APK的校验代码,都会在程序运行的时候自动加载一些动态so库,然后执行这些库中的校验代码.所以为了能够通过程序的校验,我们必须在执行这些函数之前下断点——理想的方法就是在JNI_OnLo ...

  3. HTML 改变文字方向

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. iOS工程中一天只让进行一次的操作如何做?

     转至: iosNSDateNSObject一天一次   整体思路:当进行操作的时候记录操作时间存在偏好设置当中,当再次点击的时候获取现在的时间然后和之前记录的时间进行比较.如果是一天那么就提示“今天 ...

  5. 【简单的原创】div简单轮换显示

    原文发布时间为:2009-05-10 -- 来源于本人的百度文章 [由搬家工具导入] <html><head><title>div简单轮换显示</title& ...

  6. 本机开发Native Development:Invalid path for NDK (转)

    打开window菜单下的preference选项.选择Android,Native Development(本地开发) 选择你的NDK安装目录.但是,这个插件目前仅支持ndk的r4和r5版本,更高版本 ...

  7. 更新到xcode10以后出现几个无奈的问题,谨已此篇告诫广大ioser升级请慎重

    1.第一次用xcode 10 archive的时候遇到的电脑卡死不动的问题,期间鼠标键盘通通都动不了,只能强制关机来解决,于是又进行了一次可还是遇到相同的问题,无奈之下只能等待,大约20分钟左右(20 ...

  8. [深度应用]·Keras实现Self-Attention文本分类(机器如何读懂人心)

    [深度应用]·Keras实现Self-Attention文本分类(机器如何读懂人心) 配合阅读: [深度概念]·Attention机制概念学习笔记 [TensorFlow深度学习深入]实战三·分别使用 ...

  9. koa2 从入门到进阶之路 (三)

    之前的文章我们介绍了一下 koa 路由,get 传值,动态路由,本节我们看一下 koa 中间件 以及 koa 中间件的洋葱图执行流程. 一.什么是 Koa 的中间件 通俗的讲:中间件就是匹配路由之前或 ...

  10. POJ 3249 Test for Job (dfs + dp)

    题目链接:http://poj.org/problem?id=3249 题意: 给你一个DAG图,问你入度为0的点到出度为0的点的最长路是多少 思路: 记忆化搜索,注意v[i]可以是负的,所以初始值要 ...