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
1
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;

1
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
1
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配置,以便实现数据查询。---好像有误

上次更新: 2022/12/05, 22:29:05

Initializing...

最近更新
01
git的tag与branch 原创
05-21
02
阿里云SLS日志服务的数据脱敏及安全管理 原创
03-21
03
云平台的成本管理 原创
03-13
更多文章>
×