OpenTSDB 是基于 HBase 存储时间序列数据的一个开源数据库,对于存储监控系统采集的数据来说非常合适,不仅在写入查询上有很高的效率,而且节省存储空间。
安装 HBase
因为 OpenTSDB 的后端存储使用的是 HBase,所以我们需要先安装 HBase。
参考文档: Quick Start - Standalone HBase
这里简单搭建了一个单机的 HBase 环境:
- 安装 JDK 环境,centos 上可以直接通过 yum 安装。
- 下载 HBase,http://apache.fayea.com/hbase/stable,这里我们选择下载 stable 的 1.1.3 版本,文件名为
hbase-1.1.3-bin.tar.gz
,解压到任意目录。 - 修改
conf/hbase-env.sh
,设置JAVA_HOME=/usr
,这个是/bin/java
所在的目录,通过which java
查看。 - 修改
conf/hbase-site.xml
, 设置 hbase 的数据存储目录以及 zookeeper 的数据存储目录,默认会放到/tmp
目录下,这个目录机器重启后会清空,所以需要更改目录。 - 执行
bin/start-hbase.sh
启动 HBase,之后可以通过jps
命令来查看 HMaster 进程是否启动成功。bin/stop-hbase.sh
用于关闭 HBase。
conf/hbase-site.xml
的配置示例如下
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///home/testuser/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/testuser/zookeeper</value>
</property>
</configuration>
通过命令行操作 HBase
这里可以稍微熟悉一下 HBase 的操作,非必须。
连接到 HBase
./bin/hbase shell
创建一张表
create 'test', 'cf'
查看表信息
list 'test'
向表中插入数据
put 'test', 'row1', 'cf:a', 'value1'
put 'test', 'row2', 'cf:b', 'value2'
put 'test', 'row3', 'cf:c', 'value3'
查看表中所有数据
scan 'test'
查看指定行的数据
get 'test', 'row1'
禁用指定表(删除表或修改表设置前需要先禁用该表)
disable 'test'
恢复指定表
enable 'test'
删除表
drop 'test'
安装OpenTSDB
参考文章
http://opentsdb.net/docs/build/html/installation.html#runtime-requirements
-
直接从 github 上下载 OpenTSDB 的 release 版本的 RPM 包。安装
yum localinstall opentsdb-2.2.0.noarch.rpm
。 -
配置完成后,我们通过下面命令在 HBase 中建立 opentsdb 所需的表。默认情况下 opentsdb 建立的 HBase 表启用了 lzo 压缩。需要开启 Hadoop 中的 lzo 压缩支持, 这里我们直接在下面脚本中把 COMPRESSION 的支持关闭。修改
/usr/share/opentsdb/tools/create_table.sh
,设置COMPRESSION=NONE
,并且在文件开始处设置 HBase 所在目录,HBASE_HOME=/home/xxx/hbase-1.1.3
。之后执行该脚本,在 HBase 中创建相应的表。 -
修改 OpenTSDB 的配置文件,
/etc/opentsdb/opentsdb.conf
,例如绑定的端口号等。这里需要注意的是 tsd.core.auto_create_metrics 从 false 改为 true。这样上传数据时会自动创建 metric,否则会提示 Unknown metric 的错误。也可以设置为 false,但是使用tsdb mkmetric proc.loadavg.1m
来手动添加 metric。 -
启动 OpenTSDB,
service opentsdb start
或者nohup tsdb tsd &
。 -
通过浏览器访问 http://x.x.x.x:4242 查看是否安装成功。
HTTP API
插入数据
/api/put
根据 url 参数的不同,可以选择是否获取详细的信息。
/api/put?summary // 返回失败和成功的个数
{
"failed": 0,
"success": 1
}
/api/put?details // 返回详细信息
{
"errors": [],
"failed": 0,
"success": 1
}
通过POST方式插入数据,JSON格式,例如
{
"metric":"self.test",
"timestamp":1456123787,
"value":20,
"tags":{
"host":"web1"
}
}
查询数据
/api/query
可以选择 Get 或者 Post 两种方式,推荐使用 Post 方式,JSON 格式。
{
"start": 1456123705,
"end": 1456124985,
"queries": [
{
"aggregator": "sum",
"metric": "self.test",
"tags": {
"host": "web1"
}
},
{
"aggregator": "sum",
"metric": "self.test",
"tags": {
"host": "web2"
}
}
]
}
start 和 end 为指定的查询时间段。
queries 为一个数组,可以指定多个查询。
metric 和 tags 是用于过滤的查询条件。
返回字符串也为json格式
[
{
"metric": "self.test",
"tags": {},
"aggregateTags": [
"host"
],
"dps": {
"1456123785": 10,
"1456123786": 10
}
},
{
"metric": "self.test",
"tags": {
"host": "web1"
},
"aggregateTags": [],
"dps": {
"1456123784": 10,
"1456123786": 15
}
}
]
聚合
aggregator 是用于对查询结果进行聚合,将同一 unix 时间戳内的数据进行聚合计算后返回结果,例如如果 tags 不填,1456123705 有两条数据,一条 host=web1
,另外一条 host=web2
,值都为10,那么返回的该时间点的值为 sum 后的 20。
条件过滤
可以针对 tag 进行一些条件的过滤,返回 tag 中 host 的值以 web 开头的数据。
"queries": [
{
"aggregator": "sum",
"metric": "self.test",
"filters": [
{
"type": "wildcard",
"tagk": "host",
"filter": "web*"
}
]
}
]
downsample
简单来说就是对指定时间段内的数据进行聚合后返回,例如需要返回每分钟的平均值数据
"queries": [
{
"aggregator": "sum",
"metric": "self.test",
"downsample": "1m-avg",
"tags": {
"host": "web1"
}
}
]