20-prometheus存储系统

熊 0 阅读 监控平台

Prometheus 有着非常高效的时间序列数据存储方法 , 每个采样数据仅仅占用3.5byte左右空间 , 假设上百万条时间序列 , 每30秒间隔采集一次 , 保留60天 , 大概只占用200多G空间(引用官方数据)。 注意 : prometheus监控数据默认每15s采集一次 , 默认数据保留15天(15天之前的数据会滚动删除)

1. prometheus本地存储简介

prometheus-storage-1

默认情况下 , prometheus将采集到的数据存储在本地的TSDB数据库中 , 路径默认为prometheus安装目录的data目录 , 数据写入过程为先把数据写入wal(预写日志)日志并放在内存2小时后将内存数据保存至一个新的block块 , 同时再把新采集的数据写入内存并在2小时后再保存至一个新的block块 , 以此类推。

注意:可以通过--storage.tsdb.path参数修改监控数据存储目录

结构如下所示:

prometheus-storage-2

1.1 block简介

每个block为一个data目录中以01开头的存储目录 , 如下 :

prometheus-storage-3

任意查看01开头的存储目录 , 如下 :

prometheus-storage-4

block数据结构如下所示 : 注意 : 每个chunk默认512M , 多于512M的数据会被拆分出来生成第二个chunk , 少于512M的数据会被合并压缩到一块(默认将小的数据块压缩到大的数据块中)

prometheus-storage-5

1.2 block特性

block会压缩、合并历史数据块 , 以及删除过期的块 , 随着压缩、合并 , block 的数量会减少 , 在压缩过程中会发生三件事:定期执行压缩、合并小的 block 到大的 block、清理过期的块。 每个块有 4 部分组成:

[root@prometheus-server01 prometheus]#tree /apps/prometheus/data/01G7JS2BJQAKW24VJPQ4P6Z7J0
/apps/prometheus/data/01G7JS2BJQAKW24VJPQ4P6Z7J0
├── chunks
│   └── 000001    #数据目录,每个大小为 512MB , 超过会被切分为多个 , 少于会被压缩到一块
├── index         #索引文件 , 记录存储的数据的索引信息 , 通过文件内的几个表来查找时序数据
├── meta.json      #block 元数据信息 , 包含了样本数、采集数据数据的起始时间、压缩历史
└── tombstones    #逻辑数据 , 主要记载删除记录和标记要删除的内容 , 删除标记 , 可在查询块时排除样本。

1.3 本地存储配置参数

常用配置参数如下:

--config.file="prometheus.yml"       #指定配置文件
--web.listen-address="0.0.0.0:9090"   #指定监听地址
--storage.tsdb.path="data/"          #指定数存储目录
--storage.tsdb.retention.size=B, KB, MB, GB, TB, PB, EB   #指定chunk大小 , 默认512MB
--storage.tsdb.retention.time=       #数据保存时长 , 默认 15 天
--query.timeout=2m               #最大查询超时时间(一般是指grafana查询prometheus数据)
--query.max-concurrency=20        #最大查询并发数(一般是指grafana查询prometheus数据)
--web.read-timeout=5m            #最大空闲超时时间(一般是指grafana查询prometheus数据)
--web.max-connections=512        #最大并发连接数(是指通过prometheus web界面查询数据)
--web.enable-lifecycle             #启用API动态加载配置功能

2. 远端存储--victoriametrics

官网链接:https://victoriametrics.com/

github链接:https://github.com/VictoriaMetrics/VictoriaMetrics victoriametrics可通过集群部署实现高可用 , 为了便于后续部署 , 环境准备如下: 使用192.168.71.7、192.168.71.11、192.168.71.46这三个节点用于部署victoriametrics集群

架构图 :

prometheus-storage-6

2.1 部署单机版victoriametrics

2.1.1 通过二进制部署单机版victoriametrics

注意 : 单机版安装包和集群版安装包不一样

image-20240704205652785

首先 , 进行单机版部署 , 将单机版victoriametrics部署在192.168.71.7节点上 步骤如下: github下载地址:https://github.com/VictoriaMetrics/VictoriaMetrics/releases 在192.168.71.7节点上:

  1. 下载二进制安装包并解压

    root@storage01:~# wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.102.0-rc2/victoria-metrics-linux-amd64-v1.102.0-rc2.tar.gz
    root@storage01:~# tar -xf victoria-metrics-linux-amd64-v1.102.0-rc2.tar.gz -C /usr/local/bin/

    这里会直接将压缩包中的二进制执行文件放置在对应的bin目录下

  2. 创建service文件

    root@storage01:~# systemctl cat victoria
    # /etc/systemd/system/victoria.service
    [Unit]
    Description=For Victoria-metrics-prod Service
    After=network.target
    ​
    [Service]
    ExecStart=/usr/local/bin/victoria-metrics-prod -httpListenAddr=0.0.0.0:8428 -storageDataPath=/data/victoria -retentionPeriod=3
    ​
    [Install]
    WantedBy=multi-user.target

    常用参数说明

    -httpListenAddr=0.0.0.0:8428      #监听地址及端口
    -storageDataPath       #VictoriaMetrics 将所有数据存储在此目录中 , 默认为执行启动 victoria 的当前目录下的 victoria-metrics-data 目录中。
    -retentionPeriod      #存储数据的保留 , 较旧的数据会自动删除 , 默认保留期为 1 个月 , 默认单位为 m(月) , 支持的单位有 h (hour), d (day), w (week), y (year)。

    注意 : victoriametrics的读路径和写路径不一样 , 需要分别配置。

  3. 开启创建的服务, 并设置为自启动

    root@storage01:~# systemctl daemon-reload
    root@storage01:~# systemctl enable --now victoria
    Created symlink /etc/systemd/system/multi-user.target.wants/victoria.service → /etc/systemd/system/victoria.service.
  4. 验证

    image-20240704211431719
    image-20240704211505916

2.1.2 修改prometheus配置

victoriametrics配置完成后 , 需要修改prometheus配置 , 将prometheus监控数据写入victoriametrics。

  1. 在192.168.71.47上修改prometheus配置(加入prometheus远端写入配置参数)

    #这里只贴出修改部分内容
    # my global config         
    global:
      scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
      evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
      # scrape_timeout is set to the global default (10s).
    remote_write:
      - url: http://192.168.71.7:8428/api/v1/write
    #指定写入victoriametrics服务器的数据写入路径
    官网配置参考链接:https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write
  2. 重新加载prometheus配置文件

    curl -X POST http://192.168.71.47:9090/-/reload

2.1.3 验证victoriametrics数据

  1. 访问victoriametrics web页面

    浏览器输入192.168.71.7:8428

    image-20240704213432953
  2. 点击vmui , 查看web控制台 , 在搜索框查找想要获取的数据 这里输入node_load1查看node负载情况 , 可以查询到数据 , 说明数据已经写入到victoriametrics , 而不是存储在prometheus本地

    image-20240704213613484

2.1.4 grafana配置

由于grafana是通过查询prometheus数据来获取监控数据 , 而此时监控数据并没有存储到本地 , 而是存储在远端存储victoriametrics上 , 因此grafana此时不能通过prometheus获取监控数据。

我们只需要在grafana控制台添加新的数据源 , 设置victoriametrics作为数据源即可。grafana数据源支持victoriametrics。

  1. 登录grafana控制台添加新的数据源

    image-20240704214003383
    image-20240704214227668
  2. 导入模板 : 1860 由于之前导入过该模板 , 因此需要修改模板名称和UID用以区分 , 数据源选择刚添加的victoriametrics数据源

    image-20240704214533333
  3. 导入完成后查看监控数据

    image-20240704214619234

2.2 通过docker-compose部署单机victoriametrics

  1. 部署docker-compose 通过以下脚本部署docker-compose , 脚本如下:

  2. 从github clone代码到本地(如果本地没有git命令需要进行安装)

    cd /root/
    git clone https://github.com/VictoriaMetrics/VictoriaMetrics.git
  3. 通过docker-compose拉起victoriametrics

    root@storage02:~# cd VictoriaMetrics-master/deployment/docker/
    root@storage02:~/VictoriaMetrics-master/deployment/docker# docker-compose up -d
  4. 验证

    浏览器访问: 192.168.71.11:8428

    image-20240705154726711

2.3 部署集群版victoriametrics

2.3.1 组件介绍

prometheus-storage-7
  • vminsert : 写入组件(写) , vminsert负责接收数据写入并根据对度量名称及其所有标签的一致 hash 结果将数据分散写入不同的后端 vmstorage 节点之间 vmstorage , vminsert 默认端口 8480。

  • vmstorage : 存储原始数据并返回给定时间范围内给定标签过滤器的查询数据 , 默认端口 8482。

  • vmselect : 查询组件(读) , 连接 vmstorage , 默认端口 8481。

其它可选组件:

  • vmagent : 是一个很小但功能强大的代理 , 它可以从 node_exporter 各种来源收集度量数据 , 并将它们存储在 VictoriaMetrics 或任何其他支持远程写入协议的与 prometheus 兼容的存储系统中 , 有替代prometheus server 的意向。

  • vmalert : 替换 prometheus server , 以 VictoriaMetrics 为数据源 , 基于兼容 prometheus 的告警规则 , 判断数据是否异常 , 并将产生的通知发送给 alertermanager

  • Vmgateway : 读写 VictoriaMetrics 数据的代理网关 , 可实现限速和访问控制等功能 , 目前为企业版组件

  • vmctl : VictoriaMetrics的命令行工具 , 目前主要用于将 prometheus、opentsdb 等数据源的数据迁移到VictoriaMetrics。

架构图如下所示: 单个victoriametrics节点结构图:

prometheus-storage-8
  1. vmstorage负责数据的持久化 , 默认服务监听端口为8482(用于提供web界面) , 在配置时还需指定vminsert(默认为8400)和vmselect(默认为8401)访问vmstorage的端口 , 否则vmstorage将不允许vminsert和vmselect访问。这两个端口并不是vminsert和vmselect的服务端口 , 而是用于访问vmstorage

  2. vminsert负责接收外部的写请求 , 默认服务监听端口为8480 , 在配置时需要指定vminsert访问vmstorage的端口(默认为8400) , 该端口要和vmstorage 配置中指定的端口保持一致

  3. vmselect负责接收外部的读请求 , 默认服务监听端口为8481 , 在配置时需要指定vmselect访问vmstorage的端口(默认为8401) , 该端口要和vmstorage配置中指定的端口保持一致

  4. prometheus向victoriametrics写入数据 , 会访问vminsert , 由vminsert将数据写入vmstorage;grafana查询victoriametrics监控数据 , 会访问vmselect , 由vmselect查询数据返回给grafana

三个victoriametrics节点结构图:

prometheus-storage-9

需要注意的是 , 部署victoriametrics集群(这里为三节点一个集群)在配置vminsert和vmselect时 , 会将vmstorage的地址在vminsert和vmselect配置文件中进行指定 , 因此vminsert和vmselect可以访问三个victoriametrics node节点上的vmstorage , 可以将数据保存在集群中任意一台节点上的vmstorage中 , 也可以读取集群中任意一台节点上的监控数据。

上图中由于线条太多 , 看起来不直观 , 仅画出指向本地vmstorage的线条 , 实际上vminsert和vmselect可以访问集群中任意一台节点上的vmstorage。

另外 , 由于vminsert和vmselect都依赖于vmstorage(数据的读和写都需要访问存储) , 因此在部署集群时先部署vmstorage

2.3.2 部署集群

  1. 准备工作 集群版本的安装包和单机版安装包不一样

    image-20240705162745700

    另外 , 由于已经部署单机版的victoriametrics , 这里需要停止单机版的victoriametrics服务以及prometheus服务

  2. 下载集群版本的安装包并解压

    root@storage01:~# tar -xf victoria-metrics-linux-amd64-v1.102.0-rc2-cluster.tar.gz 
    root@storage01:~# ls
    snap             victoria-metrics-linux-amd64-v1.102.0-rc2-cluster.tar.gz  vminsert-prod  vmstorage-prod
    VictoriaMetrics  victoria-metrics-linux-amd64-v1.102.0-rc2.tar.gz          vmselect-prod
  3. 将这三个解压出来的二进制程序移到/usr/loca/bin目录下 , 便于全局执行该命令

    root@storage01:~# mv vminsert-prod vmselect-prod vmstorage-prod /usr/local/bin/

    主要参数说明 :

    -httpListenAddr string
    Address to listen for http connections (default ":8482")
    -vminsertAddr string
    TCP address to accept connections from vminsert services (default ":8400")
    -vmselectAddr string
    TCP address to accept connections from vmselect services (default ":8401")

2.3.2.1 部署vmstorage-prod组件

该组件负责数据的持久化 , 监听端口 : API 8482 , 数据写入端口 : 8400 , 数据读取端口 : 8401。 注意:由于vminsert和vmselect都依赖于vmstorage(数据的读和写都需要访问存储) , 因此先部署vmstorage

在节点192.168.71.7上执行命令

  1. 编写service文件 , 通过service文件启动

    root@storage01:~# systemctl cat vmstorage
    # /etc/systemd/system/vmstorage.service
    [Unit]
    Description=Vmstorage Server
    After=network.target
    
    [Service]
    Restart=on-failure
    WorkingDirectory=/tmp
    ExecStart=/usr/local/bin/vmstorage-prod -loggerTimezone Asia/Shanghai -storageDataPath /data/vmstorage-data -httpListenAddr :8482 -vminsertAddr :8400 -vmselectAddr :8401
    
    [Install]
    WantedBy=multi-user.target

    在service文件中需指定vminsert端口(默认为8400)和vmselect的端口(默认为8401) , 否则vmstorage将不允许vminsert和vmselect访问。这两个端口并不是vminsert和vmselect的服务端口 , 仅用于访问vmstorage

  2. 启动服务并设置为开机自启动

    root@storage01:~# systemctl enable vmstorage --now
    Created symlink /etc/systemd/system/multi-user.target.wants/vmstorage.service → /etc/systemd/system/vmstorage.service.
  3. 查看服务状态

    root@storage01:~# systemctl status vmstorage

    查看端口监听状态

    image-20240705182835969
  4. 其他两个存储节点按照上面步骤安装部署vmstorage-prod

2.3.2.2 部署vminsert-prod组件

该组件负责接收外部的写请求 , 默认端口 8480 在节点192.168.71.7上执行:

  1. 编写service文件 , 通过service文件启动服务

    root@storage01:~# systemctl cat vminsert
    # /etc/systemd/system/vminsert.service
    [Unit]
    Description=Vminsert Server
    After=network.target
    
    [Service]
    Restart=on-failure
    WorkingDirectory=/tmp
    ExecStart=/usr/local/bin/vminsert-prod -httpListenAddr :8480 -storageNode=192.168.71.7:8400,192.168.71.11:8400,192.168.71.46:8400
    
    [Install]
    WantedBy=multi-user.target
  2. 查看对应端口

    image-20240705184157637
  3. 按照上面步骤部署其他两个存储节点

2.3.2.3 部署vmselect-prod组件

该组件负责接收外部的读请求 , 默认端口 8481 在节点192.168.71.7上执行:

  1. 编写service文件 , 通过service文件启动服务

    root@storage01:~# systemctl cat vmselect
    # /etc/systemd/system/vmselect.service
    [Unit]
    Description=Vmselect Server
    After=network.target
    
    [Service]
    Restart=on-failure
    WorkingDirectory=/tmp
    ExecStart=/usr/local/bin/vmselect-prod -httpListenAddr :8481 -storageNode=192.168.71.7:8401,192.168.71.11:8401,192.168.71.46:8401
    
    [Install]
    WantedBy=multi-user.target

    service文件中需要指定vmselect访问vmstorage的端口(这里为8401) , 该端口要和vmstorage service文件中指定的端口保持一致。另外 , 还指定了集群中三台vmstorage的地址和端口 , 便于vmselect访问集群中任意一个vmstorage。

  2. 启动服务并设置为开机自启动

    root@storage01:~# systemctl enable --now vmselect
    Created symlink /etc/systemd/system/multi-user.target.wants/vmselect.service → /etc/systemd/system/vmselect.service. 
    image-20240705190206735
  3. 按照上面步骤部署其他两个存储节点

使用浏览器访问存储的三个节点192.168.71.7、192.168.71.11、192.168.71.46对应的端口页面

curl http://192.168.71.7:8480/metrics
curl http://192.168.71.7:8481/metrics
curl http://192.168.71.7:8482/metrics

curl http://192.168.71.11:8480/metrics
curl http://192.168.71.11:8481/metrics
curl http://192.168.71.11:8482/metrics

curl http://192.168.71.46:8480/metrics
curl http://192.168.71.46:8481/metrics
curl http://192.168.71.46:8482/metrics

2.3.2.4 prometheus配置远程写入

  1. 在节点192.168.71.47上修改prometheus配置

    root@prometheus01:/usr/local/src/prometheus# cat prometheus.yml
    # my global config
    global:
      scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
      evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
      # scrape_timeout is set to the global default (10s).
    #remote_write:
    #  - url: http://192.168.71.7:8428/api/v1/write  
    remote_write:
      - url: http://192.168.71.7:8480/insert/0/prometheus
      - url: http://192.168.71.11:8480/insert/0/prometheus
      - url: http://192.168.71.46:8480/insert/0/Prometheus

    注意:prometheus配置中写入victoriametrics的url路径可以自定义 , 但url中的insert后一级的目录只能指定为数字 , 不能指定为字母

  2. 重启prometheus服务

    systemctl restart Prometheus

2.3.2.5 grafana配置

  1. grafana配置数据源 , 然后保存并测试 注意: 配置数据源url时 , 路径要和prometheus配置文件中url的路径保持一致 , prometheus是向victoriametrics写入数据 , 因此url为:http://192.168.71.7:8480/insert/0/prometheus。而grafana是从victoriametrics中查询数据 , 因此只需将url路径中的insert改为select即可。更改后的url为 : http://192.168.71.7:8481/select/0/prometheus(注意端口号是8481)

    image-20240705194709186

    另外 , 由于grafana配置数据源时只能指定victoriametrics集群三个节点中其中一个节点 , 这样容易形成单点 , 我们可以在三个节点前端配置一个负载均衡 , 将grafana数据源中的地址指向负载均衡服务器的地址 , 确保victoriametrics高可用

  2. 导入模板: id-1860

    image-20240705195045623
  3. 验证数据

    image-20240705195123688

2.4 开启数据复制

官网链接:https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#replication-and-data-safety 默认情况下 , 数据被vminsert的组件基于hash算法分别将数据持久化到不同的vmstorage节点 , 整个集群只保存一份完成的数据 , 一旦某个节点故障会导致监控数据丢失。可以启用 vminsert组件支持的-replicationFactor=N复制功能 , 将数据分别在集群内各节点保存一份完整的副本以实现数据的高可用。


参考链接

十一、Prometheus存储系统 - 袁党生博客 (yuandangsheng.top)