时序列数据库武斗大会之 OpenTSDB 篇

在前面的《时序列数据库武斗大会之 TSDB 名录 Part 1》《时序列数据库武斗大会之TSDB名录 Part 2》中,我们介绍了一些常见的TSDB,并在《时间序列数据库武斗大会之 KairosDB 篇》深入了解了KairosDB。本文将详细介绍TSDB中的OpenTSDB。

OpenTSDB ,可以认为是一个时系列数据(库),它基于HBase存储数据,充分发挥了HBase的分布式列存储特性,支持数百万每秒的读写,它的特点就是容易扩展,灵活的tag机制。

架构简介

这里我们简单看一下它的架构,如下图所示:

其最主要的部件就是TSD了,这是接收数据并存储到HBase处理的核心所在。而带有C(collector)标志的Server,则是数据采集源,将数据发给 TSD服务。

安装 OpenTSDB

为了安装 OpenTSDB ,都需要以下条件和软件:

  • Linux操作系统
  • JRE 1.6 or later
  • HBase 0.92 or later
  • 安装GnuPlot

如果你还想使用自带的界面,则需要安装GnuPlot 4.2及以后版本,以及gd和gd-devel等。这里我们选择了GnuPlot 5.0.1的版本。

根据情况执行(没有就装),安装所需软件

$ sudo yum install -y gd gd-devel libpng libpng-devel

之后安装GnuPlot:

$ tar zxvf gnuplot-5.0.1.tar.gz
$ cd gnuplot-5.0.1
$ ./configure
$ make
$ sudo make install

安装HBase

首先,确保设置了JAVA_HOME:

$ echo $JAVA_HOME
/usr

这个不多说了,非常简单,只需要按照 https://hbase.apache.org/book.html#quickstart 这里所说,下载、解压、修改配置文件、启动即可。

这时候,再设置HBASE_HOME:

$ echo $HBASE_HOME
/opt/hbase-1.0.1.1

之后便可启动hbase:

$ /opt/hbase-1.0.1.1/bin/start-hbase.sh
starting master, logging to /opt/hbase-1.0.1.1/logs/hbase-vagrant-master-localhost.localdomain.out  

安装 OpenTSDB

这个也很简单,如果build失败,那肯定是缺少Make或者Autotools等东西,用包管理器安装即可。

$ git clone git://github.com/OpenTSDB/opentsdb.git
$ cd opentsdb
$ ./build.sh

创建表OpenTSDB所需要的表结构:

$ env COMPRESSION=NONE ./src/create_table.sh
2016-01-08 06:17:58,045 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
HBase Shell; enter ‘help‘ for list of supported commands.
Type “exit” to leave the HBase Shell
Version 1.0.1.1, re1dbf4df30d214fca14908df71d038081577ea46, Sun May 17 12:34:26 PDT 2015

create ‘tsdb-uid’,
{NAME => ‘id’, COMPRESSION => ‘NONE’, BLOOMFILTER => ‘ROW’},
{NAME => ‘name’, COMPRESSION => ‘NONE’, BLOOMFILTER => ‘ROW’}
0 row(s) in 1.3180 seconds

Hbase::Table – tsdb-uid

create ‘tsdb’,
{NAME => ‘t’, VERSIONS => 1, COMPRESSION => ‘NONE’, BLOOMFILTER => ‘ROW’}
0 row(s) in 0.2400 seconds

Hbase::Table – tsdb

create ‘tsdb-tree’,
{NAME => ‘t’, VERSIONS => 1, COMPRESSION => ‘NONE’, BLOOMFILTER => ‘ROW’}
0 row(s) in 0.2160 seconds

Hbase::Table – tsdb-tree

create ‘tsdb-meta’,
{NAME => ‘name’, COMPRESSION => ‘NONE’, BLOOMFILTER => ‘ROW’}
0 row(s) in 0.4480 seconds

Hbase::Table – tsdb-meta  

在habse shell里,可以看到表已经创建成功。

> list
TABLE
tsdb
tsdb-meta
tsdb-tree
tsdb-uid
4 row(s) in 0.0160 seconds  

表创建之后,即可启动tsd服务,只需要运行如下命令:

$ build/tsdb tsd

如果看到输出:

2016-01-09 05:51:10,875 INFO [main] TSDMain: Ready to serve on /0.0.0.0:4242  

即可认为启动成功。

保存数据到OpenTSDB

在安装并启动所有服务之后,我们就来尝试发送1条数据吧。

最简单的保存数据方式就是使用telnet。

$ telnet localhost 4242
put sys.cpu.user 1436333416 23 host=web01 user=10001  

这时,从 OpenTSDB 自带界面都可以看到这些数据。 由于sys.cpu.sys的数据只有一条,所以 OpenTSDB 只能看到一个点。

下图为 OpenTSDB 自带的查询界面,访问http://localhost:4242即可。

OpenTSDB中的数据存储结构

我们来看看 OpenTSDB 的重要概念uid,先从HBase中存储的数据开始吧,我们来看一下它都有哪些表,以及这些表都是干什么的。

tsdb:存储数据点

hbase(main):003:0> scan ‘tsdb‘
ROW                           COLUMN+CELL
 \x00\x00\x01U\x9C\xAEP\x00\x column=t:q\x80, timestamp=1436350142588, value=\x17
 00\x01\x00\x00\x01\x00\x00\x
 02\x00\x00\x02
1 row(s) in 0.2800 seconds  

可以看出,该表只有一条数据,我们先不管rowid,只来看看列,只有一列,值为0x17,即十进制23,即该metric的值。

左面的row key则是 OpenTSDB 的特点之一,其规则为:

metric + timestamp + tagk1 + tagv1… + tagkN + tagvN  

以上属性值均为对应名称的uid。

我们上面添加的metric为:

sys.cpu.user 1436333416 23 host=web01 user=10001  

一共涉及到5个uid,即名为sys.cpu.user的metric,以及host和user两个tagk及其值web01和10001。

上面数据的row key为:

\x00\x00\x01U\x9C\xAEP\x00\x00\x01\x00\x00\x01\x00\x00\x02\x00\x00\x02

具体这个row key是怎么算出来的,我们来看看tsdb-uid表。

tsdb-uid:存储name和uid的映射关系

下面tsdb-uid表的数据,各行之间人为加了空行,为方便显示。

tsdb-uid用来保存名字和UID(metric,tagk,tagv)之间互相映射的关系,都是成组出现的,即给定一个name和uid,会保存(name,uid)和(uid,name)两条记录。

我们一共看到了8行数据。

前面我们在tsdb表中已经看到,metric数据的row key为\x00\x00\x01U\x9C\xAEP\x00\x00\x01\x00\x00\x01\x00\x00\x02\x00\x00\x02,我们将其分解下,用+号连起来(从name到uid的映射为最后5行):

 \x00\x00\x01 + U + \x9C\xAE + P + \x00\x00\x01 + \x00\x00\x01 + \x00\x00\x02  + \x00\x00\x02
sys.cpu.user       1436333416           host    =      web01          user     =    10001  

可以看出,这和我们前面说到的row key的构成方式是吻合的。

需要着重说明的是时间戳的存储方式

虽然我们指定的时间是以秒为单位的,但是,row key中用到的却是以一小时为单位的,即:1436333416 – 1436333416 % 3600 = 1436331600

1436331600转换为16进制,即0x55 0x9c 0xae 0x50,而0x55即大写字母U,0x50为大写字母P,这就是4个字节的时间戳存储方式。相信下面这张图能帮助各位更好理解这个意思,即一小时只有一个row key,每秒钟的数据都会存为一列,大大提高查询的速度。

反过来,从uid到name也一样,比如找uid为\x00\x00\x02的tagk,我们从上面结果可以看到,该row key(\x00\x00\x02)有4列,而column=name:tagk的value就是user,非常简单直观。

重要:我们看到,上面的metric也好,tagk或者tagv也好,uid只有3个字节,这是 OpenTSDB 的默认配置,三个字节,应该能表示1600多万的不同数据,这对metric名或者tagk来说足够长了,对tagv来说就不一定了,比如tagv是ip地址的话,或者电话号码,那么这个字段就不够长了,这时可以通过修改源代码来重新编译 OpenTSDB 就可以了,同时要注意的是,重编以后,老数据就不能直接使用了,需要导出后重新导入。

tsdb-meta:元数据表

我们再看下第三个表tsdb-meta,这是用来存储时间序列索引和元数据的表。这也是一个可选特性,默认是不开启的,可以通过配置文件来启用该特性,这里不做特殊介绍了。

tsdb-tree:树形表

第4个表是tsdb-tree,用来以树状层次关系来表示metric的结构,只有在配置文件开启该特性后,才会使用此表,这里我们不介绍了,可以自己尝试。

通过HTTP接口保存数据

保存数据除了我们前面用到的telnet方式,也可以选择HTTP API或者批量导入工具“` import(http://opentsdb.net/docs/build/html/user_guide/cli/import.html )

假设我们有如下数据,保存为文件mysql.json:

[ { "metric": "mysql.innodb.rowlocktime", "timestamp": 1435716527, "value": 1234, "tags": { "host": "web01", "dc": "beijing" } }, { "metric": "mysql.innodb.rowlocktime", "timestamp": 1435716529, "value": 2345, "tags": { "host": "web01", "dc": "beijing" } }, { "metric": "mysql.innodb.rowlocktime", "timestamp": 1435716627, "value": 3456, "tags": { "host": "web02", "dc": "beijing" } }, { "metric": "mysql.innodb.rowlocktime", "timestamp": 1435716727, "value": 6789, "tags": { "host": "web01", "dc": "tianjin" } } ]

之后执行如下命令:

$ curl -X POST -H “Content-Type: application/json” http://localhost:4242/api/put -d @mysql.json

即可将数据保存到 OpenTSDB 了。

查询数据

看完了如何保存数据,我们再来看看如何查询数据。

查询数据可以使用query接口,它既可以使用get的query string方式,也可以使用post方式以JSON格式指定查询条件,这里我们以后者为例,对刚才保存的数据进行说明。

首先,保存如下内容为search.json:

{ "start": 1435716527, "queries": [ { "metric": "mysql.innodb.rowlocktime", "aggregator": "avg", "tags": { "host": "*", "dc": "beijing" } } ] }

执行如下命令进行查询:

$ curl -s -X POST -H "Content-Type: application/json" http://localhost:4242/api/query -d @search.json | jq . [ { "metric": "mysql.innodb.rowlocktime", "tags": { "host": "web01", "dc": "beijing" }, "aggregateTags": [], "dps": { "1435716527": 1234, "1435716529": 2345 } }, { "metric": "mysql.innodb.rowlocktime", "tags": { "host": "web02", "dc": "beijing" }, "aggregateTags": [], "dps": { "1435716627": 3456 } } ] ``` 可以看出,我们保存了dc=tianjin的数据,但是并没有在此查询中返回,这是因为,我们指定了dc=beijing这一条件。

值得注意的是,tags参数在新版本2.2中,将不被推荐,取而代之的是filters参数。

总结

可以看出来, OpenTSDB 还是非常容易上手的,尤其是单机版,安装也很简单。有HBase作为后盾,查询起来也非常快,很多大公司,类似雅虎等,也都在用此软件。

但是,大规模用起来,多个TDB以及多存储节点等,应该都需要专业、细心的运维工作了。

原文

时间: 2024-12-19 13:42:50

时序列数据库武斗大会之 OpenTSDB 篇的相关文章

时序列数据库选型

时序列数据库武斗大会之什么是TSDB 由于工作上的关系,最近看了一些关于时序列数据库的东西,当然,我所看的也都是以开源方案为主. 趁着这股热劲还没退,希望能整理一些资料出来.如果正好你也有这方面的需求,那么希望这一系列的介绍能够帮助到你. 1. 什么是时序列数据库(Time series database)? 一听到时序列数据库,如果只是稍有耳闻的人,可能立刻会联想到运维和监控系统. 没错,确实是很多运维.监控系统都采用了TSDB作为数据库系统来存储海量的.严格按时间递增的.在一定程度来说结构非

2012年数据库技术大会演讲PPT打包

 2012年数据库技术大会演讲PPT打包 DB2 Overview of Disaster Recovery Options.pdf: http://www.t00y.com/file/76767890 DB2锁问题处理最佳实践.pdf: http://www.t00y.com/file/76767892 GOS-MySQL-development.pdf: http://www.t00y.com/file/76767896 IBM Big Data Platform.pdf: http:/

数据定义未来——2016数据库技术大会总结

背景 作为国内数据库与大数据领域最大规模的技术盛宴,2016第七届中国数据库技术大会(DTCC)如约于2016年5月12日-14日再度震撼来袭.大会以"数据定义未来"为主题,云集了国内外顶尖专家,共同探讨MySQL.NoSQL.Oracle.缓存技术.云端数据库.智能数据平台.大数据安全.数据治理.大数据和开源.大数据创业.大数据深度学习等领域的前瞻性热点话题与技术.本届大会共设定2个主会场,25个分会场,并将吸引5000多名IT人士参会,为数据库人群.大数据从业人员.广大互联网人士及

Mysql数据库优化技术之配置篇、索引篇 ( 必看 必看 转)

转自:Mysql数据库优化技术之配置篇.索引篇 ( 必看 必看 ) (一)减少数据库访问 对于可以静态化的页面,尽可能静态化 对一个动态页面中可以静态的局部,采用静态化 部分数据可以生成XML,或者文本文件形式保存 使用数据缓存技术,例如: MemCached (二)优化的检测方法 1.用户体验检测 2.Mysql状态检测 在Mysql命令行里面使用show status命令,得到当前mysql状态. 主要关注下列属性: key_read_requests (索引读的请求数)(key_buffe

服务器直接关机,再开机,硬重启时把数据库搞坏了,状态为“可疑”的解决方法

服务器放的网站都正常,就是远程连不上,着急改点东西,就让机房的人把服务器重启了一下,那边一般都是直接关机,再开机,硬重启. 之前也一直没有出现过异常,但今天硬重启了以后,发现网站出错,一看原来是数据库状态为“可疑”,不能用了,真是吓我一跳,第一次遇到这种问题. 在网上搜了一下,找到解决方法,管用,挺好的,记录一下. 首页把iis及一些连数据库的服务停掉,80和1433端口在防火墙里面也禁止连接,意思就是不让访问,要不会影响执行速度. 把DbName换成坏掉的数据库名,当前数据库选Master,步

关于DTCC数据库技术大会

本次DTCC数据库技术大会是第9届了,这次大会虽然有不少公司的产品推介,总体来说还是有不少干货的. 专场较多,有选择地主要听了大数据实践跟流式计算这块.网易跟滴滴的分享比较不错. 了解到了现在大家是用spark streaming/ Flink来进行流式计算的比较多. 我们之前都是用kafka+storm+spark来做实时仓库的. 不知道spark streaming/Flink跟storm比较有什么先进之处,这个问题记下来,似乎是开发更简洁?使用SQL式开发? 对于hbase的查询,我们之前

SQL Server数据库性能优化之索引篇【转】

http://www.blogjava.net/allen-zhe/archive/2010/07/23/326966.html 性能优化之索引篇 近期项目需要, 做了一段时间的SQL Server性能优化,遇到了一些问题,也积累了一些经验,现总结一下,与君共享.SQL Server性能优化涉及到许多方面,如良好的系统和数据库设计,优质的SQL编写,合适的数据表索引设计,甚至各种硬件因素:网络性能.服务器的性能. 操作系统的性能,甚至网卡.交换机等.这篇文章主要讲到如何改善索引,还将有另一篇讨论

SQL Server数据库性能优化之索引篇

SQL Server性能优化涉及到许多方面,如良好的系统和数据库设计,优质的SQL编写,合适的数据表索引设计,甚至各种硬件因素:网络性能.服务器的性能.操作系统的性能,甚至网卡.交换机等.这篇文章主要讲到如何改善索引 当根据索引码的值搜索数据时,索引提供了对数据的快速访问.事实上,没有索引,数据库也能根据SELECT语句成功地检索到结果,但随着表变得越来越大,使用“适当”的索引的效果就越来越明显.索引有助于提高检索性能,但过多或不当的索引也会导致系统低效.因为用户在表中每加进一个索引,数据库就要

Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题

这几天在用spring boot开发项目, 在开发的过程中遇到一个问题hibernate在执行sql时,总会提示表不存在. 寻找之后发现, 建表时,表统一采用了大写.hibernate会把大写统一转换成小写.且 mysql在 linux下 大小写敏感. 解决: 1. 尝试修改mysql的cnf文件,改成不区分大小写.修改完成之后发现问题并没有解决,还产生了新的问题,表名无论大小写都失败了. 2. 数据库层面修改没有效果, 表结构和表名不能修改,那只能通过代码实现来解决此问题了. 先感谢  三个博