OpenTSDB 是基于 HBase 存储时间序列数据的一个开源数据库,对于存储监控系统采集的数据来说非常合适,不仅在写入查询上有很高的效率,而且节省存储空间。

安装 HBase

因为 OpenTSDB 的后端存储使用的是 HBase,所以我们需要先安装 HBase。

参考文档: Quick Start - Standalone HBase

这里简单搭建了一个单机的 HBase 环境:

  1. 安装 JDK 环境,centos 上可以直接通过 yum 安装。
  2. 下载 HBase,http://apache.fayea.com/hbase/stable,这里我们选择下载 stable 的 1.1.3 版本,文件名为 hbase-1.1.3-bin.tar.gz,解压到任意目录。
  3. 修改 conf/hbase-env.sh ,设置  JAVA_HOME=/usr,这个是 /bin/java 所在的目录,通过 which java 查看。
  4. 修改 conf/hbase-site.xml, 设置 hbase 的数据存储目录以及 zookeeper 的数据存储目录,默认会放到 /tmp 目录下,这个目录机器重启后会清空,所以需要更改目录。
  5. 执行 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://debugo.com/opentsdb/

http://opentsdb.net/docs/build/html/installation.html#runtime-requirements

  1. 直接从 github 上下载 OpenTSDB 的 release 版本的 RPM 包。安装 yum localinstall opentsdb-2.2.0.noarch.rpm

  2. 配置完成后,我们通过下面命令在 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 中创建相应的表。

  3. 修改 OpenTSDB 的配置文件,/etc/opentsdb/opentsdb.conf,例如绑定的端口号等。这里需要注意的是 tsd.core.auto_create_metrics 从 false 改为 true。这样上传数据时会自动创建 metric,否则会提示 Unknown metric 的错误。也可以设置为 false,但是使用 tsdb mkmetric proc.loadavg.1m 来手动添加 metric。

  4. 启动 OpenTSDB,service opentsdb start 或者 nohup tsdb tsd &

  5. 通过浏览器访问 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"        }    }]