基于阿里云HBase搭建OpenTSDB

OpenTSDB是一个基于HBase的分布式、可伸缩的开源时序数据库。OpenTSDB由TSD(Time Series Daemon)和一系列命令行工具组成。TSD用于接收用户请求并将时序数据存储在HBase中。TSD之间是相互独立的,没有master,也没有共享状态,因此可以根据系统的负载情况任意进行扩展。下图是一个基于OpenTSDB的监控系统架构图(来自官方文档):
基于阿里云HBase搭建OpenTSDB

本文介绍如何在阿里云HBase之上搭建OpenTSDB。

准备HBase和ECS实例

要在阿里云上部署OpenTSDB,我们需要:

  • 一个HBase实例,用来存储数据。HBase的规格可参考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"管理"进入详情页面。
基于阿里云HBase搭建OpenTSDB

选择左侧的"本实例安全组",然后点击"配置规则"。
基于阿里云HBase搭建OpenTSDB

之后点击"添加安全组规则",在弹出的页面配置安全组的规则。协议类型选择"自定义TCP",端口范围输入OpenTSDB的端口。
基于阿里云HBase搭建OpenTSDB

这两步完成之后,在浏览器输入 ECS的公网IP:OpenTSDB端口,即可使用web页面查询数据。见下图:
基于阿里云HBase搭建OpenTSDB

其他

本文仅简单介绍了OpenTSDB在阿里云上的部署和使用。关于OpenTSDB使用的更多细节可以参考官方文档,也可以在HBase技术社区的OpenTSDB话题下进行讨论。关于阿里云HBase的更多细节可以参考产品文档

上一篇:杭州爱才集团引入放心签电子合同助力灵活用工业务发展


下一篇:阿里云HBase发布冷存储特性,助你不改代码,1/3成本轻松搞定冷数据处理