技术选型:
- 生态:Prometheus(已成为 Metrics 的事实标准)
- 前端 UI:Grafana
- 时序数据库 (TSDB):VictoriaMetrics (Vms)
- 指标采集:Node exporter, Blackbox exporter
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
- 下载并解压 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.x、v1.97.x等 LTS 版本,或文件名为*-enterprise.tar.gz的程序包,这些都是付费的企业版。 - 添加 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 - 写入 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 - 启动服务
sudo systemctl daemon-reload sudo systemctl enable --now victoriametrics sudo systemctl status victoriametrics - 参考及感谢:
2 安装 Vmutils 套件
-
下载并解压 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 创建的备份中恢复数据
-
为了更好的安全性,我们这里使用官方建议的 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 等工具自动签发证书。
-
添加 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/" -
添加 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 服务监听的内网地址不同的端口,并且在防火墙放行该端口。
-
启动服务
sudo systemctl daemon-reload sudo systemctl enable --now vmauth sudo systemctl status vmauth -
验证配置
curl -H 'Authorization: Bearer ' --insecure https://localhost:18428/api/v1/query -d 'query={job=~".*"}' -
参考:
3 被控端指标采集
安装 Node Exporter
-
下载并解压 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* -
验证安装
chmod x /usr/local/bin/node_exporter chown -v root:root /usr/local/bin/node_exporter node_exporter --version -
创建服务用户
groupadd -r exporter useradd -r -m -s /sbin/nologin -g exporter exporter -
写入服务配置
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,该采集器默认禁用。 -
启动服务
sudo systemctl daemon-reload sudo systemctl enable --now node_exporter sudo systemctl status node_exporter
安装 Blackbox Exporter
如果此节点无需进行 icmp / tcping 等网络探测,可以跳过此步骤。
- 下载并解压 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* - 验证安装
chmod x /usr/local/bin/blackbox_exporter chown -v root:root /usr/local/bin/blackbox_exporter blackbox_exporter --version - 写入服务配置
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 - 创建 Blackbox 配置文件:
vim /home/exporter/blackbox_config.yml需要写入一些 module 来定义探测行为,这里给出基本配置:
modules: icmp: prober: icmp timeout: 5s tcping: prober: tcp timeout: 5s - 启动服务
sudo systemctl daemon-reload sudo systemctl enable --now blackbox_exporter sudo systemctl status blackbox_exporter题外的:Blackbox 接受 reload,可以便捷的更新配置文件:
sudo systemctl reload blackbox_exporter - 参考:
安装 vmagent
-
下载并解压 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 -
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 -
创建 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 认证,也请注意修改。
-
启动服务
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
-
安装基础依赖
sudo apt install gnupg2 curl apt-transport-https software-properties-common -
导入 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 -
添加 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 -
安装 Grafana OSS(开源版)
sudo apt install grafana sudo systemctl daemon-reload sudo systemctl enable grafana-server --now sudo systemctl status grafana-server -
此时应该可以看到 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 -
接下来你应该使用你喜欢的方法,添加 TLS 配置并反向代理到
127.0.0.1:3000,当然 Grafana 也支持进行 TLS 配置,可以在这里查看。 -
参考:
结语
本文旨在抛砖引玉,简单介绍了 Prometheus 生态下,使用 VictoriaMetrics 作为 TSDB 长期存储,尽量少开放端口、使用裸机部署 (Standalone) 的落地实践。很多成熟且拥有较好的稳定性、已进行生产环境验证的开源监控项目,因为缺少中文文档而并不在 MJJ 社区流行,希望这些文字给读者一些启发。文笔疏漏,还有很多不完善的地方,还请不吝斧正。
推荐阅读:

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