OpenTSDB是一个基于HBase的分布式、可伸缩的开源时序数据库。OpenTSDB由TSD(Time Series Daemon)和一系列命令行工具组成。TSD用于接收用户请求并将时序数据存储在HBase中。TSD之间是相互独立的,没有master,也没有共享状态,因此可以根据系统的负载情况任意进行扩展。下图是一个基于OpenTSDB的监控系统架构图(来自官方文档):
本文介绍如何在阿里云HBase之上搭建OpenTSDB。
准备HBase和ECS实例
要在阿里云上部署OpenTSDB,我们需要:
需要注意的是:
(1)ECS需要和HBase在相同的region内。如果是专有网络,需要ECS和HBase在同一个vpc下。
(2)建议选择linux操作系统(例如CentOS)。本文描述的安装步骤均在CentOS上执行成功,请注意其他操作系统可能部分命令会有不同。
(3)需要把ECS的IP加入到HBase的白名单中。
安装OpenTSDB
安装
要运行OpenTSDB,需要安装如下组件:
- 安装HBase客户端
- 安装GnuPlot
- 安装OpenTSDB
1 安装HBase客户端
HBase客户端的作用主要是执行建表脚本在HBase中创建出OpenTSDB需要的表。HBase客户端的安装、配置过程可以参考这个文档。
2 安装GnuPlot
GnuPlot是一个命令行的交互式绘图工具,OpenTSDB使用GnuPlot绘图。GnuPlot可以简单通过yum安装:
yum install -y gnuplot
3 安装OpenTSDB
可以在github上选择需要的版本,下载安装包安装或是下载源码tar包进行编译。以rpm包为例:
wget https://github.com/OpenTSDB/opentsdb/releases/download/v2.3.0/opentsdb-2.3.0.rpm
yum localinstall opentsdb-2.3.0.rpm
运行tsdb version看到如下输出
net.opentsdb.tools 2.2.0 built at revision 07d0464 (MINT)
Built on 2016/02/15 22:56:59 +0000 by hobbes@clhbase:/home/hobbes/opentsdb_OFFICIAL/build
表明已经安装完成了。
配置
1 在HBase中创建OpenTSDB需要的表
OpenTSDB提供了一个脚本来执行建表的动作。命令如下:
env COMPRESSION=SNAPPY HBASE_HOME=/path/to/hbase /usr/share/opentsdb/tools/create_table.sh
执行之后,会在HBase中创建出tsdb、tsdb-uid、tsdb-tree和tsdb-meta四个表。
在执行建表的脚本时需要设置这两个环境变量:
- COMPRESSION表示OpenTSDB的表所使用的压缩方式。脚本中的默认值是lzo,但是阿里云HBase不支持这种压缩方式,我们把这个参数设置为SNAPPY。SNAPPY是阿里云HBase推荐的压缩方式,参见云HBase文档。
- HBASE_HOME配置为HBase客户端的安装目录。
2 修改OpenTSDB的配置文件
配置文件的路径在/etc/opentsdb/opentsdb.conf。我们需要把其中的tsd.storage.hbase.zk_quorum这个参数修改为HBase的ZK连接地址(可在HBase控制台查看)。
配置完成后,运行如下命令启动OpenTSDB:
tsdb tsd
执行
curl http://localhost:4242/api/config
看到如下输出
{"tsd.core.auto_create_metrics":"false","tsd.core.auto_create_tagks":"true","tsd.core.auto_create_tagvs":"true","tsd.core.meta.enable_realtime_ts":"false","tsd.core.meta.enable_realtime_uid":"false","tsd.core.meta.enable_tsuid_incrementing":"false","tsd.core.meta.enable_tsuid_tracking":"false","tsd.core.plugin_path":"/usr/share/opentsdb/plugins","tsd.core.preload_uid_cache":"false","tsd.core.preload_uid_cache.max_entries":"300000","tsd.core.socket.timeout":"0","tsd.core.storage_exception_handler.enable":"false","tsd.core.tree.enable_processing":"false","tsd.core.uid.random_metrics":"false","tsd.http.cachedir":"/tmp/opentsdb","tsd.http.query.allow_delete":"false","tsd.http.request.cors_domains":"","tsd.http.request.cors_headers":"Authorization, Content-Type, Accept, Origin, User-Agent, DNT, Cache-Control, X-Mx-ReqToken, Keep-Alive, X-Requested-With, If-Modified-Since","tsd.http.request.enable_chunked":"false","tsd.http.request.max_chunk":"4096","tsd.http.show_stack_trace":"true","tsd.http.staticroot":"/usr/share/opentsdb/static/","tsd.mode":"rw","tsd.network.async_io":"true","tsd.network.bind":"0.0.0.0","tsd.network.keep_alive":"true","tsd.network.port":"4242","tsd.network.reuse_address":"true","tsd.network.tcp_no_delay":"true","tsd.network.worker_threads":"","tsd.no_diediedie":"false","tsd.query.allow_simultaneous_duplicates":"true","tsd.query.filter.expansion_limit":"4096","tsd.query.skip_unresolved_tagvs":"false","tsd.query.timeout":"0","tsd.rtpublisher.enable":"false","tsd.rtpublisher.plugin":"","tsd.search.enable":"false","tsd.search.plugin":"","tsd.stats.canonical":"false","tsd.storage.compaction.flush_interval":"10","tsd.storage.compaction.flush_speed":"2","tsd.storage.compaction.max_concurrent_flushes":"10000","tsd.storage.compaction.min_flush_threshold":"100","tsd.storage.enable_appends":"false","tsd.storage.enable_compaction":"true","tsd.storage.fix_duplicates":"false","tsd.storage.flush_interval":"1000","tsd.storage.hbase.data_table":"tsdb","tsd.storage.hbase.meta_table":"tsdb-meta","tsd.storage.hbase.prefetch_meta":"false","tsd.storage.hbase.tree_table":"tsdb-tree","tsd.storage.hbase.uid_table":"tsdb-uid","tsd.storage.hbase.zk_basedir":"/hbase","tsd.storage.hbase.zk_quorum":"hb-wz9sn9wc5li4zbg04-001.hbase.rds.aliyuncs.com:2181,hb-wz9sn9wc5li4zbg04-002.hbase.rds.aliyuncs.com:2181,hb-wz9sn9wc5li4zbg04-003.hbase.rds.aliyuncs.com:2181","tsd.storage.repair_appends":"false"}
这表明,tsdb已经启动起来了。
使用OpenTSDB
OpenTSDB中,一条时序数据包含如下内容:
- metric名称
- UNIX时间戳
- metric的值
- tags:是一系列的k-v值,用来描述metric数据的属性。在查询数据时可以按照某一个属性做过滤和聚合。
我们以官方文档上所举的例子来描述OpenTSDB的写入和读取:采集cpu用户态使用率。我们将metric命名为sys.cpu.user,用两个tag来描述其属性:host和cpu表示数据描述的是哪个服务器的哪个cpu。
创建metric
使用如下命令
tsdb mkmetric sys.cpu.user
写入数据
作为测试,我们可以使用telnet接口写入两条数据:
# telnet localhost 4242
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
put sys.cpu.user 1356998400 42.5 host=webserver01 cpu=0
put sys.cpu.user 1356999400 42.7 host=webserver01 cpu=0
读取数据
可以使用命令行读取刚才写入的两条数据:
# tsdb query 1356998400 1356999400 sum sys.cpu.user
sys.cpu.user 1356998400000 42.500000 {host=webserver01, cpu=0}
sys.cpu.user 1356999400000 42.700001 {host=webserver01, cpu=0}
也可以使用http接口查询:
# curl 'http://localhost:4242/api/query?start=1356998400&m=sum:sys.cpu.user'
[{"metric":"sys.cpu.user","tags":{"host":"webserver01","cpu":"0"},"aggregateTags":[],"dps":{"1356998400":42.5,"1356999400":42.70000076293945}}]
在web页面查询数据
OpenTSDB提供了一个web页面供查询数据。通过以下步骤可以开放这个页面。
1 ECS绑定公网IP
如果ECS已经有一个公网IP则可以忽略这一步。否则,需要绑定一个弹性公网IP用来从公网访问ECS。具体操作步骤参见EIP文档。
2 修改安全组规则
ECS默认的安全组规则没有开放OpenTSDB的端口。我们需要开放这个端口。
登陆ECS控制台,点击OpenTSDB所在的ECS"管理"进入详情页面。
选择左侧的"本实例安全组",然后点击"配置规则"。
之后点击"添加安全组规则",在弹出的页面配置安全组的规则。协议类型选择"自定义TCP",端口范围输入OpenTSDB的端口。
这两步完成之后,在浏览器输入 ECS的公网IP:OpenTSDB端口,即可使用web页面查询数据。见下图:
其他
本文仅简单介绍了OpenTSDB在阿里云上的部署和使用。关于OpenTSDB使用的更多细节可以参考官方文档,也可以在HBase技术社区的OpenTSDB话题下进行讨论。关于阿里云HBase的更多细节可以参考产品文档。