【落地实践】监控的百花齐放:Grafana + VictoriaMetrics + Prometheus

在 Github 上阅读本文

技术选型:

Q&A:

Q A
为什么不使用原生的 Prometheus 生态和 TSDB? Vms 具有比 Prometheus 更好的性能和更高的数据压缩率,支持直接替代 Prometheus。而且,信奉云原生的 Prometheus 只支持从被控端远程拉取数据 (pull),但 Vms 原生配套的 vmagent 则能让 Prometheus 导出器也可以远程写入 (push) ,这会给复杂的公网监控环境带来巨大便利。
为什么不使用 Telegraf 作为采集器? Telegraf 的优势是支持远程写入 (push) 和丰富的插件选择,但劣势也是将所有插件二进制打包,当前 (v1.32.3) 版本的主程序已高达 244 MiB,并不符合我们轻量化低开销的诉求。附:自定义编译可以指定插件,待调研。
为什么不使用 Docker 部署? 对于 Agent 这种需要高可用的有状态应用,不建议使用 Docker 部署,新增一个故障点,还会产生额外的性能开销。而且面向于广大 MJJ 极其宝贵的轻量配置,二进制部署是更优解。
为什么我看不懂你写的内容? 本文提及的绝大多数代码、技术都是基本的 Linux 使用,并给出了相应文档的参考。在这个 GPT 大行其道的时代,看代码、写脚本已不再是造核武器那样高深莫测、遥不可及的学问,反而独立思考、勇于探索的极客精神在当今难能可贵。所以笔者不会贴出一键脚本,而是尽力介绍每个细节并给出推荐的实践方案。如果你无法阅读下去这样的”繁文缛节“,请选择其他解决方案。

本文将以 Debian 11/12 为蓝本,演示该监控系统的落地实践。

1 安装 VictoriaMetrics

  1. 下载并解压 VictoriaMetrics(请参阅 Releases 下载最新版本)
    curl -L https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.107.0/victoria-metrics-linux-amd64-v1.107.0.tar.gz -o /tmp/victoria-metrics.tar.gz
    tar -xvf /tmp/victoria-metrics.tar.gz -C /usr/local/bin/
    rm /tmp/victoria-metrics.tar.gz
    
    chmod  x /usr/local/bin/victoria-metrics-prod
    chown -v root:root /usr/local/bin/victoria-metrics-prod
    

    下载时,不要选择 v1.102.xv1.97.xLTS 版本,或文件名为 *-enterprise.tar.gz 的程序包,这些都是付费的企业版。

  2. 添加 metrics 服务用户以控制权限
    groupadd -r metrics
    useradd -r -s /sbin/nologin -d /var/lib/victoria-metrics -g metrics metrics
    
    mkdir -p /var/lib/victoria-metrics
    chown -v metrics:metrics /var/lib/victoria-metrics
    
  3. 写入 systemd 服务配置 (nano / vi / vim)
    vim /etc/systemd/system/victoriametrics.service
    

    配置内容:

    [Unit]
    Description=VictoriaMetrics service
    After=network.target
    
    [Service]
    Type=simple
    User=metrics
    Group=metrics
    SyslogIdentifier=metrics
    ExecStart=/usr/local/bin/victoria-metrics-prod \
        -storageDataPath=/var/lib/victoria-metrics \
        -httpListenAddr=127.0.0.1:8428 \
        -retentionPeriod=60d \
        -selfScrapeInterval=10s
    ExecStop=/bin/kill -s SIGTERM $MAINPID
    StartLimitBurst=5
    StartLimitInterval=0
    Restart=on-failure
    RestartSec=1
    LimitNOFILE=32000
    LimitNPROC=32000
    
    PrivateTmp=yes
    ProtectHome=yes
    NoNewPrivileges=yes
    ProtectSystem=full
    
    [Install]
    WantedBy=multi-user.target
    
  4. 启动服务
    sudo systemctl daemon-reload
    sudo systemctl enable --now victoriametrics
    sudo systemctl status victoriametrics
    
  5. 参考及感谢:

2 安装 Vmutils 套件

  1. 下载并解压 Vmutils 套件

    curl -L https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.107.0/vmutils-linux-amd64-v1.107.0.tar.gz -o /tmp/vmutils.tar.gz
    tar -xvf /tmp/vmutils.tar.gz -C /usr/local/bin/
    rm /tmp/vmutils.tar.gz
    
    chmod  x /usr/local/bin/vm*-prod
    chown -v root:root /usr/local/bin/vm*-prod
    

    该套件库包含以下组件:

    • vmagent: 轻量的 agent,从各种来源收集指标远程写入到 VictoriaMetrics
    • vmauth: HTTP 代理用于认证、路由、负载均衡到 VictoriaMetrics 后端
    • vmalert: 告警模块,兼容 Prometheus 告警规则
    • vmalert-tool: 告警规则的单元测试工具
    • vmctl: 从其他 TSDB 迁移数据到 VictoriaMetrics
    • vmbackup: 数据备份工具,支持自动创建增量备份
    • vmrestore: 从 vmbackup 创建的备份中恢复数据
  2. 为了更好的安全性,我们这里使用官方建议的 vmauth 套件对 VictoriaMetrics 暴露的端口进行认证。如果你只在内部网络中进行监控,则可以跳过此步骤。

    请注意:仅在 HTTP 请求头添加 HTTP Auth 认证没有任何安全性,它在公共网络上是明文传输的,TLS 加密是敏感信息公网传输的基本要求。

    由于我们的外部暴露的端口只用于收集指标,这里选择创建一个自签名证书用于 TLS 加密:

    mkdir -p /etc/victoria-metrics/ssl
    
    openssl req -x509 -days 3650 -nodes -newkey ec \
        -pkeyopt ec_paramgen_curve:prime256v1 \
        -keyout /etc/victoria-metrics/ssl/vms.key \
        -out /etc/victoria-metrics/ssl/vms.crt \
        -subj '/C=CN/ST=Shanghai/L=Shanghai/O=VictoriaMetrics Auth/CN=victoriametrics.auth' \
        -addext "subjectAltName=IP:127.0.0.1"
    

    我们使用 openssl 签发了一对 ECC 加密算法的证书,选择了广受认可的 prime256v1 椭圆曲线,你也可以使用 secp384r1 曲线。使用这条命令列出更多曲线:

    openssl ecparam -list_curves
    

    最后将证书所有者变更为 metrics:

    chown -vR metrics:metrics /etc/victoria-metrics/ssl
    

    使用自签名证书的原因是大多数支持 ACME(证书自动化管理)的 CA 都不颁发 IP 证书,你也可以选择解析一个域名与 acme.sh 等工具自动签发证书。

  3. 添加 HTTP 认证配置:SSL 仅提供了内容的安全性,为了更加一层保护,这里提供了添加 Bearer Token 认证方式的示例,首先生成一个 40 位长度的随机字符串:(你也可以使用更多位数)

    cat /dev/urandom | tr -dc 'a-zA-Z0-9-' | head -c 40 && echo
    

    然后将配置写入文件:

    vim /etc/victoria-metrics/config.yml
    

    配置内容:

    users:
    - bearer_token: 
      url_prefix: "http://127.0.0.1:8428/"
    

    尽管 bearer_token 认证在非人类交互时写法更简单,但在你想要用浏览器访问是也可以添加一组 Basic 认证(用户名密码认证):

    users:
    - bearer_token: 
      url_prefix: "http://127.0.0.1:8428/"
    - username: 
      password: 
      url_prefix: "http://127.0.0.1:8428/"
    
  4. 添加 Vmagent 服务配置

    vim /etc/systemd/system/vmauth.service
    

    配置文件内容:

    [Unit]
    Description=Vmauth service
    After=network.target
    
    [Service]
    Type=simple
    User=metrics
    Group=metrics
    ExecStart=/usr/local/bin/vmauth-prod \
        --tls=true \
        --auth.config=/etc/victoria-metrics/config.yml \
        --httpListenAddr=0.0.0.0:18428 \
        --tlsCertFile=/etc/victoria-metrics/ssl/vms.crt \
        --tlsKeyFile=/etc/victoria-metrics/ssl/vms.key
    ExecStop=/bin/kill -s SIGTERM $MAINPID
    StartLimitBurst=5
    StartLimitInterval=0
    Restart=on-failure
    RestartSec=1
    LimitNOFILE=32000
    LimitNPROC=32000
    
    [Install]
    WantedBy=multi-user.target
    

    注意这里监听的是外部地址,应该选择一个和上文中 VictoriaMetrics 服务监听的内网地址不同的端口,并且在防火墙放行该端口。

  5. 启动服务

    sudo systemctl daemon-reload
    sudo systemctl enable --now vmauth
    sudo systemctl status vmauth
    
  6. 验证配置

    curl -H 'Authorization: Bearer ' --insecure https://localhost:18428/api/v1/query -d 'query={job=~".*"}'
    
  7. 参考:

3 被控端指标采集

安装 Node Exporter

  1. 下载并解压 node_exporter(请参阅 Releases 下载最新版本)

    curl -L https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz -o /tmp/node_exporter.tar.gz
    tar -xvf /tmp/node_exporter.tar.gz -C /tmp/
    mv /tmp/node_exporter-*/node_exporter /usr/local/bin/node_exporter
    rm -rfv /tmp/node_exporter*
    
  2. 验证安装

    chmod  x /usr/local/bin/node_exporter
    chown -v root:root /usr/local/bin/node_exporter
    node_exporter --version
    
  3. 创建服务用户

    groupadd -r exporter
    useradd -r -m -s /sbin/nologin -g exporter exporter
    
  4. 写入服务配置

    vim /etc/systemd/system/node_exporter.service
    

    配置内容:

    [Unit]
    Description=Node Exporter service
    
    [Service]
    Type=simple
    User=exporter
    Group=exporter
    ExecStart=/usr/local/bin/node_exporter \
        --web.listen-address=127.0.0.1:9100 \
        --collector.cpu.info
    
    [Install]
    WantedBy=multi-user.target
    

    这里打算使用 vmagent 采集后远程写入,所以只监听了本地的 127.0.0.1:9100,可以根据需要修改。如果要开放端口到公网,注意配置 TLS 和防火墙,只开放端口给可信 IP。

    如果你需要 CPU 信息,例如 Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz,则需要添加 --collector.cpu.info,该采集器默认禁用。

  5. 启动服务

    sudo systemctl daemon-reload
    sudo systemctl enable --now node_exporter
    sudo systemctl status node_exporter
    

安装 Blackbox Exporter

如果此节点无需进行 icmp / tcping 等网络探测,可以跳过此步骤。

  1. 下载并解压 blackbox_exporter(请参阅 Releases 下载最新版本)
    curl -L https://github.com/prometheus/blackbox_exporter/releases/download/v0.25.0/blackbox_exporter-0.25.0.linux-amd64.tar.gz -o /tmp/blackbox_exporter.tar.gz
    tar -xvf /tmp/blackbox_exporter.tar.gz -C /tmp/
    mv /tmp/blackbox_exporter-*/blackbox_exporter /usr/local/bin/blackbox_exporter
    rm -rfv /tmp/blackbox_exporter*
    
  2. 验证安装
    chmod  x /usr/local/bin/blackbox_exporter
    chown -v root:root /usr/local/bin/blackbox_exporter
    blackbox_exporter --version
    
  3. 写入服务配置
    vim /etc/systemd/system/blackbox_exporter.service
    

    配置内容:

    [Unit]
    Description=Blackbox Exporter service
    Wants=network-online.target
    After=network-online.target nss-lookup.target
    
    [Service]
    User=exporter
    Group=exporter
    ExecStart=/usr/local/bin/blackbox_exporter \
        --web.listen-address=127.0.0.1:9101 \
        --config.file=/home/exporter/blackbox_config.yml
    ExecReload=/bin/kill -HUP $MAINPID
    
    [Install]
    WantedBy=multi-user.target
    
  4. 创建 Blackbox 配置文件
    vim /home/exporter/blackbox_config.yml
    

    需要写入一些 module 来定义探测行为,这里给出基本配置:

    modules:
      icmp:
        prober: icmp
        timeout: 5s
      tcping:
        prober: tcp
        timeout: 5s
    
  5. 启动服务
    sudo systemctl daemon-reload
    sudo systemctl enable --now blackbox_exporter
    sudo systemctl status blackbox_exporter
    

    题外的:Blackbox 接受 reload,可以便捷的更新配置文件:

    sudo systemctl reload blackbox_exporter
    
  6. 参考:

安装 vmagent

  1. 下载并解压 vmagent 二进制包

    curl -L https://github.com/Jared-02/VictoriaMetrics/releases/download/v1.107.0/vmagent-v1.107.0-linux-amd64.tar.gz -o /tmp/vmagent.tar.gz
    tar -xvf /tmp/vmagent.tar.gz -C /usr/local/bin/
    mv /usr/local/bin/vmagent-*-prod /usr/local/bin/vmagent
    rm /tmp/vmagent.tar.gz
    
    chmod  x /usr/local/bin/vmagent
    chown -v root:root /usr/local/bin/vmagent
    vmagent -version
    

    此处使用笔者自行修改了官方 CI 的 fork,使用 Github Actions 自动构建并发布,解决了官方发布时将所有套件打包的痛点。相关的修改可以在这里查看。如果你看不懂发生了什么请使用如下方法,下载完整套件再删除不必要的组件:

    curl -L https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.107.0/vmutils-linux-amd64-v1.107.0.tar.gz -o /tmp/vmutils.tar.gz
    tar -xvf /tmp/vmutils.tar.gz -C /usr/local/bin/
    mv /usr/local/bin/vmagent-prod /usr/local/bin/vmagent
    rm /tmp/vmutils.tar.gz
    
    chmod  x /usr/local/bin/vmagent
    chown -v root:root /usr/local/bin/vmagent
    rm -rf /usr/local/bin/vm*-prod
    
  2. 创建 Prometheus 格式的抓取配置

    vim /home/exporter/prometheus.yml
    

    配置内容:

    scrape_configs:
      - job_name: node_exporter
        scrape_interval: 10s
        static_configs:
          - targets: ['localhost:9100']
            labels:
              instance: Aliyun-HKG
      - job_name: blackbox_exporter
        scrape_interval: 30s
        metrics_path: /probe
        params:
          module: [tcping]
        static_configs:
          - targets: [':443']
            labels:
              target: 'PEK-CM-v4'
          - targets: ['[]:443']
            labels:
              target: 'PEK-CM-v6'
        relabel_configs:
          - source_labels: [__address__]
            target_label: __param_target
          - target_label: instance
            replacement: Aliyun-HKG
          - target_label: __address__
            replacement: localhost:9101
    
  3. 创建 systemd 服务配置

    vim /etc/systemd/system/vmagent.service
    

    配置内容:

    [Unit]
    Description=Vmagent service
    After=network.target
    
    [Service]
    Type=simple
    User=exporter
    Group=exporter
    ExecStart=/usr/local/bin/vmagent \
        -httpListenAddr='' \
        -promscrape.config=/home/exporter/prometheus.yml \
        -remoteWrite.url=https://:18428/api/v1/write \
        -remoteWrite.bearerToken= \
        -remoteWrite.tmpDataPath=/home/exporter \
        -remoteWrite.tlsInsecureSkipVerify=true
    ExecStop=/bin/kill -s SIGTERM $MAINPID
    
    [Install]
    WantedBy=multi-user.target
    

    注意:如果你没有使用自签名证书,请删除 -remoteWrite.tlsInsecureSkipVerify=true 配置。

    本示例是在被控端不开放任何端口,远程写入到主控端的 TSDB,请注意将写入地址修改为你的 IP / 域名及正确的端口号,如果使用了 bearer token 认证,也请注意修改。

  4. 启动服务

    sudo systemctl daemon-reload
    sudo systemctl enable --now vmagent
    sudo systemctl status vmagent
    

简易排障指南

  • 端口是否占用?
    sudo apt install net-tools
    netstat -tulpn
    
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address    Foreign Address  State    PID/Program name
    tcp        0      0 127.0.0.1:9101   0.0.0.0:*        LISTEN   51212/blackbox_expo
    tcp        0      0 127.0.0.1:9100   0.0.0.0:*        LISTEN   51313/node_exporter
    

    本示例分配 node_exporter 监听 9100,blackbox_exporter 监听 9101,请检查是否被其他程序占用,你也可以修改为其他未被占用的端口。

  • 检查错误的程序日志
    journalctl -u  -n 
    

    比如查看 node_exporter 最近 20 行日志:

    journalctl -u node_exporter -n 20
    

    你就可以在其中看到失败原因,如果查看的行数较多,可以使用 方向键滚动,按 q 退出。

4 安装 Grafana

  1. 安装基础依赖

    sudo apt install gnupg2 curl apt-transport-https software-properties-common
    
  2. 导入 Grafana 官方仓库 GPG 密钥

    curl -L https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/grafana-archive-keyring.gpg >/dev/null
    gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/grafana-archive-keyring.gpg
    
  3. 添加 Grafana Deb 仓库(这里添加的是稳定版)

    echo "deb [signed-by=/usr/share/keyrings/grafana-archive-keyring.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
    sudo apt update
    
  4. 安装 Grafana OSS(开源版)

    sudo apt install grafana
    sudo systemctl daemon-reload
    sudo systemctl enable grafana-server --now
    sudo systemctl status grafana-server
    
  5. 此时应该可以看到 Grafana 正常运行的日志,并在 http://:3000 访问到 Grafana,默认的登录名和密码是 admin

    强烈不建议直接使用 HTTP 管理,笔者习惯统一使用 nginx 反向代理到 443 端口,所以应该到 Grafana 修改为只进行内网监听:(如果使用官方 deb 仓库安装,则配置文件位置在此,其他安装方法可能有出入)

    vim /etc/grafana/grafana.ini
    

    server 字段可以看到以下配置,取消注释并修改:

    [server]
    http_addr = 127.0.0.1
    http_port = 3000
    

    重启 Grafana:

    sudo systemctl restart grafana-server
    
  6. 接下来你应该使用你喜欢的方法,添加 TLS 配置并反向代理到 127.0.0.1:3000,当然 Grafana 也支持进行 TLS 配置,可以在这里查看。

  7. 参考:

结语

本文旨在抛砖引玉,简单介绍了 Prometheus 生态下,使用 VictoriaMetrics 作为 TSDB 长期存储,尽量少开放端口、使用裸机部署 (Standalone) 的落地实践。很多成熟且拥有较好的稳定性、已进行生产环境验证的开源监控项目,因为缺少中文文档而并不在 MJJ 社区流行,希望这些文字给读者一些启发。文笔疏漏,还有很多不完善的地方,还请不吝斧正。

推荐阅读:

点赞
  1. Jared说道:

    @ichen #9
    根据配置不同,资源占用可能有出入,而且内存管理机制非常复杂(比如共享内存、保留内存),无法给出准确答案。在 2C1G 被控端上,使用 systemctl status 得到如下数据:

    • node_exporter: 10.4M
    • blackbox_exporter: 10.8M
    • vmagent: 10.0M
    • nezha-agent: 32.8M

发表回复

电子邮件地址不会被公开。必填项已用 * 标注