prometheus 远程存储 Tdengine 实现读写分离原创
# prometheus 远程存储 Tdengine 实现读写分离
# 前言
prometheus 在监控方面的能力是有目共睹的,我们在实施监控方案时,为满足大规模应用集群的监控及数据的高效查询能力,通常也会考虑将prometheus的部署扩展为集群。对于prometheus集群的搭建,常见的是官方推荐的联邦模式,但该模式是一种分层结构,在查询监控数据时,仍对下层的Prometheus有一定性能影响。根据官方文档的阅读及个人对集群的理解,我设计了一个基于Tdengine 的prometheus读写分离方案。 该方案结合了Prometheus的远程读写功能及tdengine 的高性能查询及数据压缩能力,有效控制了prometheus集群部署的规模和数据存储压缩的问题,相对规模化数据也提升了查询性能。对于prometheus 的远端存储方案,网上很多文章都是基于influxdb的,当前方案选用的Tdengine是一款开源、云原生的时序数据库,相对influxdb,其提供了优秀的查询和集群能力,更多优点可见:TDengine和InfluxDB的性能对比报告 (opens new window)
# 架构规划
架构规划图如下,prometheus 选定为3个,其中两个分别负责不同k8s集群监控项数据的采集,其通过prometheus的remote_write 功能将数据远程存储到Tdengine 数据库集群。另外1个prometheus则通过prometheus的remote_read 功能从Tdengine 数据库集群读取数据,提供运维人员查询或给grafana实现数据展示。
Tdengine 支持 prometheus 是通过其内建组件taosAdapter 实现的,taosAdapter是 TDengine 集群和应用程序之间的桥梁和适配器。其不仅支持Prometheus数据的远程读写,还支持 Telegraf、StatsD、collectd 等数据收集代理软件的操作。
# 部署实施
# Tdengine 部署
我使用的版本是2.6.0.14,最新版本3.0 测试下来似乎有些问题,期待最新的修正版本。
- 部署单机环境
基于docker 化的Tdengine 部署非常简单,其中端口6041,就是taosAdapter的访问接口
version: '3'
services:
tdengine:
image: tdengine/tdengine:2.6.0.14
container_name: tdengine
hostname: tdengine
restart: always
ports:
- "6030:6030"
- "6041:6041"
- "6043-6049:6043-6049"
- "6043-6049:6043-6049/udp"
volumes:
- /etc/localtime:/etc/localtime
- /etc/timezone:/etc/timezone
- /opt/data/apps/tdengine/data:/var/lib/taos
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- 创建prometheus 数据库
对于部署好的Tdengine,首先需要创建prometheus 数据库
# 进入容器环境
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;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# prometheus 配置
prometheus 部署方式有很多,目前流行的是 kube-prometheus-stack 全家桶,虽然部署简单,但其是嵌入到K8S集群当中的,而且也制定了很多复杂的配置规则,所以建议实际生产环境以独立于K8S集群外部署为佳,至于独立部署方法将另起文章描述。对于开启prometheus的remote_write 是非常简单的,只需在配置文件中添加如下配置即可:
# 远程写,对只读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
2
3
4
5
6
7
8
9
10
11
12
13
# 其他事项
数据清理
数据的保留时间受prometheus 的参数storage.tsdb.retention.time 和tdengine 的参数keep 共同影响,将取最小值为有效值,建议Prometheus的参数大于tdengine 的参数,以确保数据统一由tdengine控制。只读peometheus 配置
为轻量化只读peometheus的部署,只读环境Prometheus的参数storage.tsdb.retention.time 设置为1h即可。
虽然负责写的prometheus 中的job是分别不同的配置,但作为负责读的prometheus 配置的job中亦要有全部prometheus 的job配置,以便实现数据查询。---好像有误