1. OpenTSDB架构
作为被广泛应用的大数据平台,Hadoop提供了分布式存储、计算、任务调度等,可有效解决海量数据的存储、计算、检索等问题。构筑在Hadoop分布式文件系统HDFS上的HBase数据库,以列式存储方式支持HDFS的随机读写、海量数据存储与检索。OpenTSDB是基于HBase开发的一款开源时序数据库,OpenTSDB的架构如图所示:
图1 OpenTSDB架构图
OpenTSDB由运行在HBase之上的一个或多个TSD (Time Series Daemon)时间序列守护程序组成,TSD通过RPC与HBase交互,用户只需通过TSD暴露的Http或Telnet接口即可实现时序数据存取,而不必直接关注HBase底层存储。OpenTSDB的存储机制围绕列式数据库HBase的KV宽表存储模型展开,OpenTSDB通过HBase中tsdb_uid、tsdb、tsdb_tree、tsdb_meta四张表存储时序数据。tsdb_uid为字典表,用于存储id和name的映射关系,metric和tages在此表中做字典化存储,以降低重复字符串的存储空间;tsdb表用于存储时序数据点;tsdb_tree用于将时间序列组织成类似文件系统的树形结构;tsdb_meta为元数据表,用于记录时间线总数记录;若没有开启元数据功能和Rollup(预聚合)功能,tsdb_tree和tsdb_meta表将不需要。
字典表tsdb_uid根据HBase的原子增量命令automicIncrement自动生成并存储metric、tagk、tagv与uid的映射与反向映射关系,tsdb_uid存储name与uid对应关系的表结构如图2所示。其中,name列簇用于存储metric、tagk、tagv的原始字符串序列,对应rowkey为HBase自动生成的uid;id列簇用于用于存储metric、tagk、tagv原始字符串到uid的映射,rowkey为原始字符串,列值为对应的uid。通过这种双向映射存储,OpenTSDB将tsdb_uid表内容缓存在内存中,使metric、tagk、tagv可以快速与uid实现相互转化。OpenTSDB的默认配置中,根据name映射出来的uid的宽度为3个字节。
图2 tsdb_uid表存储结构
tsdb表用来存储时序数据点,tsdb表存储结构如下图3所示。OpenTSDB将每小时数据点存储在一行,每一列为一个数据点,tsdb表只有一个列簇t,列名为+0~+3600,表示数据点Timestamp与这一行整点小时的时间偏移量(若要求时序数据按照毫秒(ms)粒度记录数据值,可将该列簇的列设置为+0~+3600000)。
图3 tsdb表存储结构
tsdb表的rowkey设计如下图4所示,rowkey由可选的salt、metric与tag的 uid、小时整点timestamp和tags的kv键值对uid组成。其中,salt占3个字节、timestamp占4个字节,其余部分占3个字节。假设数据点的时间戳为timestamp,则rowkey中timestamp部分为timestamp / 3600,其中timestamp需要转换为秒级时间戳。这样的设计避免在一行中填充太多数据点,同时可以支持在查询时支持按照metric和时间范围扫描数据点,提高数据查询的效率。
图4 tsdb表rowkey设计
作为时序数据库,OpenTSDB不仅支持原始数据点的查询,即根据输入的metric、tag和时间范围对原始数据点检索,还支持对原始数据进行聚合查询。比如原始数据是1秒一个数据点,可以按照每小时的数据平均值查询。OpenTSDB还支持Rollup聚合,用户可以通过OpenTSDB暴露的API创建比原始数据时间粒度更大的数据表,用于保存原始数据聚合后的粗粒度数据。
2. OpenTSDB安装部署
OpenTSDB构建在HBase集群之上,所以使用OpenTSDB前提是安装部署一套HBase集群,HBase集群的安装部署涉这里就略过了,这里假定你已经搭建好了一套HBase集群。
OpenTSDB的安装部署有两种方式:一种是源码包的编译安装,另一种是二进制文件方式部署,这两选择二进制部署方式。
- Gnuplot依赖安装
OpenTSDB自带web UI的部署依赖gnuplot画图程序,在正式开始安装前,现在服务器部署gnuplot:yum install -y gnuplot - OpenTSDB安装
OpenTSDB rpm包的下载地址为https://github.com/OpenTSDB/opentsdb/releases,目前最新版本为2.4.1
下载后运行rpm –ivh opentsdb-2.4.1-1-20210902183110-root.noarch.rpm即可完成OpenTSDB安装
OpenTSDB默认配置文件为/etc/opentsdb/opentsdb.conf,要想成功启动OpenTSDB需要对HBase和OpenTSDB进行相关配置 - HBase中时序数据库创建
OpenTSDB要想正确启动至少要在HBase中创建tsdb、tsdb-uid表(tsdb-meta与tsdb-tree可选)
HBase中时序数据库表
OpenTSDB提供了在HBase中创建对应表的脚本,脚本在OpenTSDB安装主机的/usr/share/opentsdb/tools/create_table.sh
脚本内容如下:
#!/bin/sh
# Small script to setup the HBase tables used by OpenTSDB.
test -n "$HBASE_HOME" || {
echo >&2 'The environment variable HBASE_HOME must be set'
exit 1
}
test -d "$HBASE_HOME" || {
echo >&2 "No such directory: HBASE_HOME=$HBASE_HOME"
exit 1
}
TSDB_TABLE=${TSDB_TABLE-'tsdb'}
UID_TABLE=${UID_TABLE-'tsdb-uid'}
TREE_TABLE=${TREE_TABLE-'tsdb-tree'}
META_TABLE=${META_TABLE-'tsdb-meta'}
BLOOMFILTER=${BLOOMFILTER-'ROW'}
# LZO requires lzo2 64bit to be installed + the hadoop-gpl-compression jar.
COMPRESSION=${COMPRESSION-'SNAPPY'}
# All compression codec names are upper case (NONE, LZO, SNAPPY, etc).
COMPRESSION=`echo "$COMPRESSION" | tr a-z A-Z`
# DIFF encoding is very useful for OpenTSDB's case that many small KVs and common prefix.
# This can save a lot of storage space.
DATA_BLOCK_ENCODING=${DATA_BLOCK_ENCODING-'DIFF'}
DATA_BLOCK_ENCODING=`echo "$DATA_BLOCK_ENCODING" | tr a-z A-Z`
TSDB_TTL=${TSDB_TTL-'FOREVER'}
case $COMPRESSION in
(NONE|LZO|GZIP|SNAPPY) :;; # Known good.
(*)
echo >&2 "warning: compression codec '$COMPRESSION' might not be supported."
;;
esac
case $DATA_BLOCK_ENCODING in
(NONE|PREFIX|DIFF|FAST_DIFF|ROW_INDEX_V1) :;; # Know good
(*)
echo >&2 "warning: encoding '$DATA_BLOCK_ENCODING' might not be supported."
;;
esac
# HBase scripts also use a variable named `HBASE_HOME', and having this
# variable in the environment with a value somewhat different from what
# they expect can confuse them in some cases. So rename the variable.
hbh=$HBASE_HOME
unset HBASE_HOME
exec "$hbh/bin/hbase" shell <<EOF
create '$UID_TABLE',
{NAME => 'id', COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER', DATA_BLOCK_ENCODING => '$DATA_BLOCK_ENCODING'},
{NAME => 'name', COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER', DATA_BLOCK_ENCODING => '$DATA_BLOCK_ENCODING'}
create '$TSDB_TABLE',
{NAME => 't', VERSIONS => 1, COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER', DATA_BLOCK_ENCODING => '$DATA_BLOCK_ENCODING', TTL => '$TSDB_TTL'}
create '$TREE_TABLE',
{NAME => 't', VERSIONS => 1, COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER', DATA_BLOCK_ENCODING => '$DATA_BLOCK_ENCODING'}
create '$META_TABLE',
{NAME => 'name', COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER', DATA_BLOCK_ENCODING => '$DATA_BLOCK_ENCODING'}
EOF
只需要在安装了HBase并设置了HBase环境变量的主机上运行该脚本即可,脚本默认HBase压缩编码为LZO,若要改为其他编码方式修改脚本中$COMPRESSION参数即可,这里选择SNAPPY压缩编码。
OpenTSDB配置
要想正确启动OpenTSDB,opentsdb.conf文件至少需要指定HBase集群相关参数
tsd.storage.hbase.zk_quorum:指定HBase ZooKeeper的连接信息
tsd.storage.hbase.zk_basedir:指定HBase的ZooKeeper基本目录
tsd.storage.hbase.data_table:指定存储时间序列数据的HBase表的名称
tsd.storage.hbase.uid_table:指定存储UID映射的HBase表的名称
tsd.core.auto_create_metrics:如果启用,将自动创建未知的度量标准
tsd.storage.enable_compaction:如果启用,将执行数据紧缩以减小存储占用
tsd.network.port:指定tsd程序端口号,默认为4242
更多配置参数及含义请参考http://opentsdb.net/docs/build/html/user_guide/configuration.html
OpenTSDB启动
正确配置HBase和OpenTSDB后即可成功启动OpenTSDB,采用rpm安装的OpenTSDB,直接运行systemctl start opentsdb即可启动tsd程序
OpenTSDB启动后在浏览器输入http://IP:4242,出现如下OpenTSDB web UI表名OpenTSDB已经启动成功
OpenTSDB web UI
3. OpenTSDB数据读写
在OpenTSDB中,数据的读写操作通常通过HTTP协议进行。可以使用HTTP API来写入数据并查询已存储的时间序列数据。
3.1 写入数据
要将数据点插入OpenTSDB,可以使用HTTP的POST请求。数据点通常包括时间戳、度量标准(Metric)、标签(Tags)以及数据值。以下是一个示例:
curl -X POST http://localhost:4242/api/put --data '[{
"metric": "temperature",
"timestamp": 1625157600,
"value": 25.5,
"tags": {
"location": "room1",
"sensor": "sensor1"
}
}]'
这个例子将一个温度数据点插入到OpenTSDB中,度量标准为 "temperature",时间戳为 UNIX 时间戳 1625157600,数值为 25.5,并带有两个标签,分别是 "location" 和 "sensor"
3.2 查询数据
OpenTSDB使用HTTP的GET请求查询存储的时间序列数据。以下是一个示例,用于查询指定度量标准下的数据点:
curl -X GET 'http://localhost:4242/api/query?start=1h-ago&m=avg:temperature{location=room1,sensor=sensor1}'
数据的可视化查询,可以在OpenTSDB自带web UI中选择对应时间段和指标名称进行查询,如下为本人自己搭建环境的一个查询结果。
OpenTSDB web UI数据可视化
3.3 数据删除
要删除已存储的数据点,可以使用HTTP的DELETE请求。以下是一个示例:
curl -X DELETE 'http://localhost:4242/api/query?start=1h-ago&m=avg:temperature{location=room1,sensor=sensor1}'
这个例子删除了与前面查询相同条件下的数据点。
这只是OpenTSDB的基本用法示例,OpenTSDB支持更复杂的查询和数据分析操作,例如按时间范围、聚合函数等进行查询。您可以根据自己的需求查阅OpenTSDB的文档(http://opentsdb.net/docs/build/html/index.html)以获取更多详细信息和高级操作的示例。