0 前言
量化系统在运行的过程中有数据监控的需求,期望能够对策略的运行状态、资金指标等信息进行监控,刚好又接触了docker相关的技术,于是产生了利用docker来部署一套监控系统的想法。所幸,社区已经有很多前人的工作了,搭建起来也比较顺利,有兴趣的朋友可以与我交流~
监控系统采用opentsdb+grafana技术组合,后面也会深入的学习一下时序数据库opentsdb。
1 docker opentsdb部署
OpenTSDB是一个分布式的、可伸缩的时间序列数据库,其底层存储以HBase为主。OpenTSDB支持多tag维度查询,支持毫秒级的时序数据。OpenTSDB主要实现了时序数据的存储和查询,其自带的前端界面比较简单,经常会结合grafana一起使用。另外,OpenTSDB也提供了丰富的插件接口,可以帮助开发人员对其进行扩展。
接下来,介绍一下基于docker进行OpenTSDB部署。petergrace/opentsdb-docker镜像已经配置好了HBase,以及一些opensdb运行所需要的表,基于此镜像部署比较简单。
(1)下载镜像
docker pull petergrace/opentsdb-docker
(2)启动容器
docker run -d -p 4242:4242 --name opentsdb petergrace/opentsdb-docker
注意,启动docker容器之后,要过几十秒hbase才启动成功,然后才可以访问opentsdb。
(3)部署效果
访问浏览器:localhost:4242,可以得到如下效果。注意,这个界面很不好用。
2 docker grafana部署
Grafana是一个跨平台的开源的度量分析和可视化工具,主要用于查询并可视化展示采集的数据。Grafana提供了丰富的可视化展示方式,包括快速灵活的客户端图表,拥有不同方式的可视化指标和日志的面板插件以及丰富的仪表盘插件,包括热图、折线图、图表等。
grafana官方提供了打包好的docker镜像,但grafana docker在对接opentsdb docker时,有坑,需要使用容器互联机制。
(1)下载镜像
docker pull grafana/grafana
(2)启动容器
docker run -d --name=grafana-tsdb --link=opentsdb:opentsdb -p 3000:3000 grafana/grafana
注意,在使用opentsdb容器作为数据源时,需要加上容器互联机制--link=opentsdb:opentsdb。docker容器互联机制使用--link参数可以让窗口之间安全地进行交互。若不使用--link,在grafana配置opentsdb数据源时会出现 <font color="red">HTTP Error Bad Gateway </font>。
(3)部署效果
启动容器以后,浏览器访问localhost:3000,便可进入grafana主页,默认用户名和密码都是admin。
(4)连接opentsdb数据源
有几个需要注意的点:
- http://opentsdb:4242,这里我测试opentsdb为启动grafana docker时的--link名称,此时使用localhost是连不上的。我还没有测试部署到服务器上这样能不能访问。
- 注意opentsdb版本选2.3就行。我进入opentsdb-docker容器里面看,是2.4版本的,不过也可以连。
# 3 python client写入方案
github上找到一个用于OpenTSDB的python Client,实测了一下,挺好使。
(1)安装opentsdb-py(2)写入随机值测试pip install opentsdb-py
import logging
import numpy as np
import time
from opentsdb import TSDBClient
logging.basicConfig(level=logging.DEBUG)
tsdb = TSDBClient()
while 100000:
random_value = np.random.randint(0, 100)
tsdb.send('metric.test', random_value, tag1='val1', tag2='val2')
time.sleep(1)
tsdb.close()
tsdb.wait()
(3)grafana metic展示
python脚本写数据开始之后,便可以在grafana面板中查询打metric的值了。
至此,数据监控方案就完整的搭建出来了,不过目前是在本地进行的实验,不知道部署到服务器上会不会还有坑。
4 数据持久化方案
数据持久化方案主要依赖于docker的数据管理,docker的数据卷是一个可供容器使用的特殊目录,它将主机操作系统直接映射进容器。注意在stop docker容器时,使用-t选项,给hbase足够的时间关闭,否则数据会丢失。推荐至少等待30秒。
可以有两种做法:
(1)基于opentsdb-docker镜像说明,使用docker-compose up -d,来使用docker-compose.yml来启动容器,在docker-compose.yml内将数据卷挂载到${pwd}/.data/目录下。
git clone https://github.com/PeterGrace/opentsdb-docker.git
cd opentsdb-docker
docker-compose up -d # 启动docker容器
docker-compose stop -t 30 # 关闭docker容器
docker-compose.yml文件内容如下,可以发现就是在docker容器的启动配置,既然如此,那应该可以在docker run时配置启动参数。
<font color='orange'>docker-compose持久化方案已经验证过,在docker-compose stop之后,再启动,仍然可以读取到原来的数据。</font>
---
opentsdb:
hostname: otsdb-host
image: petergrace/opentsdb-docker:latest
environment:
- WAITSECS=30
ports:
- 4242:4242
- 60030:60030
volumes:
- "./data:/data/hbase"
container_name: opentsdb
(2)在docker run 时加-v参数。
参考docker-compose的配置,在docker run时加-v参数实证也是可以的。下图展示了stop容器和rm容器后的持久化效果。
docker run -d -p 4242:4242 --name opentsdb -v="D:\docker\opentsdb:/data/hbase" petergrace/opentsdb-docker:latest # 启动optsdb容器
docker stop -t 30 opentsdb # 关闭opentsdb容器
docker start opentsdb # 重新启动opentsdb容器