Prometheus
prometheus 在监控方面的能力是有目共睹的,我们在实施监控方案时,为满足大规模应用集群的监控及数据的高效查询能力,通常也会考虑将prometheus的部署扩展为集群。对于prometheus集群的搭建,常见的是官方推荐的联邦模式,但该模式是一种分层结构,在查询监控数据时,仍对下层的Prometheus有一定性能影响。根据官方文档的阅读及个人对集群的理解,我设计了一个基于Tdengine 的prometheus读写分离方案。 该方案结合了Prometheus的远程读写功能及tdengine 的高性能查询及数据压缩能力,有效控制了prometheus集群部署的规模和数据存储压缩的问题,相对规模化数据也提升了查询性能。对于prometheus 的远端存储方案,网上很多文章都是基于influxdb的,当前方案选用的Tdengine是一款开源、云原生的时序数据库,相对influxdb,其提供了优秀的查询和集群能力,更多优点可见:TDengine和InfluxDB的性能对比报告
得益于Prometheus 提供了 remote_write 和 remote_read 接口来利用其它数据库产品作为它的存储引擎。为了让 Prometheus 生态圈的用户能够利用 TDengine 的高效写入和查询,TDengine 也提供了对这两个接口的支持。
通过适当的配置, Prometheus 的数据可以通过 remote_write 接口存储到 TDengine 中,也可以通过 remote_read 接口来查询存储在 TDengine 中的数据,充分利用 TDengine 对时序数据的高效存储查询性能和集群处理能力。
通过图中读写分离的方案,可以高效的实现监控数据以及监控组件的分离、横向扩容等。
taosAdapter
其中Tdengine 支持 prometheus 是通过其内建组件taosAdapter 实现的,taosAdapter是 TDengine 集群和应用程序之间的桥梁和适配器。其不仅支持Prometheus数据的远程读写,还支持如下功能:
| RESTful 接口 兼容 InfluxDB v1 写接口 兼容 OpenTSDB JSON 和 telnet 格式写入 无缝连接到 Telegraf 无缝连接到 collectd 无缝连接到 StatsD
|
部署方案
部署Tdengine集群
本次测试使用docker-compose
部署单机多实例的Tdengine节点模拟生产环境正常集群情况
taosAdapter 在 TDengine 容器中默认是启动的。如果想要禁用它,在启动时指定环境变量 TAOS_DISABLE_ADAPTER=true
同时为了部署灵活起见,可以在独立的容器中启动 taosAdapter
如果要部署多个 taosAdapter 来提高吞吐量并提供高可用性,推荐配置方式为使用 nginx 等反向代理来提供统一的访问入口。具体配置方法请参考 nginx 的官方文档。如下是示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| version: "3"
networks: inter:
services: td-1: image: tdengine/tdengine:$VERSION networks: - inter environment: TAOS_FQDN: "td-1" TAOS_FIRST_EP: "td-1" volumes: - taosdata-td1:/var/lib/taos/ - taoslog-td1:/var/log/taos/ td-2: image: tdengine/tdengine:$VERSION networks: - inter environment: TAOS_FQDN: "td-2" TAOS_FIRST_EP: "td-1" volumes: - taosdata-td2:/var/lib/taos/ - taoslog-td2:/var/log/taos/ adapter: image: tdengine/tdengine:$VERSION entrypoint: "taosadapter" networks: - inter environment: TAOS_FIRST_EP: "td-1" TAOS_SECOND_EP: "td-2" deploy: replicas: 4 nginx: image: nginx depends_on: - adapter networks: - inter ports: - 6041:6041 - 6044:6044/udp command: [ "sh", "-c", "while true; do curl -s http://adapter:6041/-/ping >/dev/null && break; done; printf 'server{listen 6041;location /{proxy_pass http://adapter:6041;}}' > /etc/nginx/conf.d/rest.conf; printf 'stream{server{listen 6044 udp;proxy_pass adapter:6044;}}' >> /etc/nginx/nginx.conf;cat /etc/nginx/nginx.conf; nginx -g 'daemon off;'", ] volumes: taosdata-td1: taoslog-td1: taosdata-td2: taoslog-td2:
|
查看部署状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| tdengin默认账号密码 root:taosdata # 进入容器环境 docker exec -it tdengine /bin/bash # 进入taos 数据库控制台 taos # 创建prometheus数据库 # keep 数据保留180 天,默认为3650天,days 每10天为一个数据文件, # comp 数据文件的压缩程度为1,0:关闭,1:一阶段压缩,2:两阶段压缩。默认为2 create database prometheus keep 180 days 10 comp 1; # 退出 quit
# 用默认密码测试,在返回结果中可以看到 prometheus 数据库 curl -u root:taosdata -d 'show databases' 127.0.0.1:6041/rest/sql
# 也可以修改数据库参数 alter database prometheus keep 90;
|
Prometheus部署
对于开启prometheus的remote_write 是非常简单的,只需在配置文件中添加如下配置即可:
新建目录 prometheus,编辑配置文件prometheus.yml
| mkdir /etc/prometheus cd /etc/prometheus/ vim prometheus.yml
|
| # 远程写,对只读prometheus 配置时,屏蔽掉远程写配置即可 remote_write: - url: "http://x.x.x.x:6041/prometheus/v1/remote_write/prometheus" basic_auth: username: root password: taosdata
# 远程读 remote_read: - url: "http://x.x.x.x:6041/prometheus/v1/remote_read/prometheus" basic_auth: username: root password: taosdata
|
查看Prometheus配置
启动prometheus
| docker run -d \ -p 9090:9090 \ -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \ prom/prometheus
|
进入tdengin容器节点,查看数据是否进入