VictoriaMetrics 自建监控实战:二进制安装、vmagent 远程写入与 Grafana 复用 PromQL 全流程

为什么个人站长该认真考虑 VictoriaMetrics,而不只是 Prometheus

如果你自己维护过几台 VPS,大概率听说过 Prometheus。它确实是云原生监控的事实标准,配合 node_exporter、Grafana 能画出漂亮的仪表盘。但真正在低配机器上跑过一段时间的人都知道一个残酷的现实:Prometheus 是「内存吞噬者」。我这台承载了几个小站点的 2 核 4G 机器,装完 Prometheus 之后,光它一个进程就吃掉了将近 1.8G 内存,TSDB 目录半年就涨到了 30 多个 G。对于预算有限、又不愿意为了看几条曲线就升级到 8G 内存的独立站长来说,这个代价太大了。

VictoriaMetrics(简称 VM)是一个用 Go 写的时序数据库,设计目标就是「更省内存、更省磁盘、查询更快」,而且它**完全兼容 Prometheus 的抓取协议和 PromQL 查询语言**。也就是说,你现有的 exporter、你写过的查询语句、你的 Grafana 面板,几乎不用改就能直接搬过来。这篇文章我会完整走一遍:从二进制安装单机版、配置抓取、接入 Grafana,到用 vmagent 做远程写入、最后把它接进 systemd 自启并做好数据保留策略。全程只用一台普通 VPS,不需要 Docker,不需要 Kubernetes。

先搞清楚:单机版、集群版、vmagent 到底选哪个

VM 有好几个组件,新手最容易在这里懵。先用一张表说清楚,免得你装错方向。

组件作用适用场景
victoria-metrics(单机版)采集 + 存储 + 查询三合一单台或少量服务器,个人站长首选
vmagent只负责抓取和转发,不存储多目标、需要远程写入或做数据过滤
vmalert执行告警规则需要阈值告警时配合使用
vmcluster存算分离的集群版大规模、多副本,个人站用不上

对我们来说,**单机版一条命令就够**。它默认就带抓取功能(内置 scrape 配置),可以直接替代 Prometheus 的角色。只有当你要把多台机器的数据汇总到一台中心库、或者需要 vmagent 的 relabel/去重能力时,才把它拆出来单独用。本文先把单机版跑通,再补 vmagent。

第一步:下载二进制并跑起来

VM 官方提供编译好的静态二进制,不依赖 glibc,扔到任何 Linux 上都能跑。先确定你的架构,然后下载最新稳定版。写这篇文章时的稳定版是 v1.102,你可以到 GitHub release 页把版本号换成最新的。

cd /opt
ARCH=amd64
VER=v1.102.0
curl -LO https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/${VER}/victoria-metrics-linux-${ARCH}-${VER}.tar.gz
tar xzf victoria-metrics-linux-${ARCH}-${VER}.tar.gz
mv victoria-metrics-prod victoria-metrics
./victoria-metrics --version

先用前台方式试跑一下,确认端口和目录没问题。VM 默认监听 8428 端口,数据默认存到当前目录下的 victoria-metrics-data。

mkdir -p /var/lib/victoria-metrics
./victoria-metrics \
  -storageDataPath=/var/lib/victoria-metrics \
  -retentionPeriod=6 \
  -httpListenAddr=127.0.0.1:8428

这里有几个参数值得展开说:

  • -storageDataPath:数据目录,务必放到磁盘空间大的分区,别默认丢在 /opt 里。
  • -retentionPeriod:数据保留时长,单位是月。个人站长留 3 到 6 个月完全够用,写 6 就是保留 6 个月。这个值直接决定磁盘占用,是省空间的第一杠杆。
  • -httpListenAddr:因为我打算用 Nginx 反代并加认证,所以先只监听本地回环,不直接对外暴露。

跑起来之后,浏览器访问 http://127.0.0.1:8428 能看到一个简单的 Web UI。左侧的 vmui 是它自带的可视化界面,可以直接跑 PromQL,适合临时排查。生产上你还是会想用 Grafana,但 vmui 拿来验证「数据到底进来没有」非常方便。

第二步:安装 node_exporter 采集主机指标

VM 单机版内置了 Prometheus 兼容的抓取器,所以我们需要一个 exporter 来产出指标。最通用的就是 node_exporter,它把 CPU、内存、磁盘、网络、文件系统这些主机指标全部暴露成一个 HTTP 端点。

cd /opt
NODE_VER=1.8.2
curl -LO https://github.com/prometheus/node_exporter/releases/download/v${NODE_VER}/node_exporter-${NODE_VER}.linux-amd64.tar.gz
tar xzf node_exporter-${NODE_VER}.linux-amd64.tar.gz
mv node_exporter-${NODE_VER}.linux-amd64/node_exporter .
./node_exporter --version

默认监听 :9100。同样建议只绑本地:--web.listen-address=127.0.0.1:9100。装好之后访问 http://127.0.0.1:9100/metrics,能看到一大堆以 node_ 开头的指标就对了。

第三步:配置 VM 抓取 node_exporter

VM 的抓取配置既可以用命令行参数,也可以用文件。强烈推荐用文件,因为将来加监控目标时,只要改文件然后 kill -HUP 重载即可,不用重启进程。

# /etc/victoria-metrics/scrape.yml
scrape_configs:
  - job_name: 'node'
    scrape_interval: 30s
    static_configs:
      - targets: ['127.0.0.1:9100']
        labels:
          instance: 'web-01'
          role: 'frontend'

几个要点:scrape_interval 我这里设成 30 秒,对个人站足够,比 Prometheus 默认的 15 秒省一半写入量;labels 里的 instance 是你在 Grafana 里区分不同机器用的,一定要起个有意义的名字(比如 web-01、db-01),别用 IP,否则将来换机器全乱套。

然后重启 VM,并加上 -promscrape.config 指向这个文件:

./victoria-metrics \
  -storageDataPath=/var/lib/victoria-metrics \
  -retentionPeriod=6 \
  -httpListenAddr=127.0.0.1:8428 \
  -promscrape.config=/etc/victoria-metrics/scrape.yml

验证抓取是否成功,最直接的办法是查 VM 自带的抓取目标页面:http://127.0.0.1:8428/targets。如果看到 job=node 且 state=up,说明数据正在入库。你也可以直接在 vmui 里跑一句:

up{job="node"}

返回 1 就代表目标健康。这一步跑通,说明整条链路(exporter 暴露 → VM 抓取 → 存储 → 查询)已经通了。

第四步:把数据接到 Grafana

Grafana 加数据源非常直接。Add data source 里选 Prometheus(不是专门找 VictoriaMetrics 插件,官方的 Prometheus 数据源就能连,因为协议兼容),URL 填 http://127.0.0.1:8428,其他保持默认,点 Save & test,显示 "Data source is working" 即可。

接下来导入一个现成的 node_exporter 面板,省去自己画图的时间。Grafana 里 Import → 输入面板 ID 1860(Node Exporter Full),选择你刚加的 VM 数据源,导入后就能看到经典的 CPU、内存、磁盘、网络全景图。这套面板原本是给 Prometheus 做的,接 VM 一样用,这正是 VM 兼容 PromQL 的价值。

第五步:多机场景用 vmagent 做远程写入

当你有三四台机器,有两种部署方式。第一种是每台机器都跑一个完整的 VM,但那太浪费。更合理的做法是:中心机跑一个 VM 作为存储,各被监控机上只跑一个轻量 vmagent,把指标远程写到中心。

vmagent 的用法和 Prometheus 抓取几乎一模一样,只是多了一个 -remoteWrite.url:

./vmagent \
  -promscrape.config=/etc/vmagent/scrape.yml \
  -remoteWrite.url=http://中心机IP:8428/api/v1/write

被监控机上的 scrape.yml 只抓本机的 node_exporter,label 里标好自己是哪台。这样中心机不需要能 SSH 到各机器,只要各机器能主动把数据推上来即可——对于 NAT 后面的机器特别友好。

⚠️ 需要注意的是,远程写入端点 /api/v1/write 默认没有认证。如果你把 8428 暴露在公网,任何人都能往你库里灌垃圾数据,甚至把磁盘写爆。解决办法有两个:一是走内网或 WireGuard 私网,二是在前面用 Nginx 加一层 Basic Auth,并给 VM 加 -httpAuth.username/-httpAuth.password 参数。别偷懒。

第六步:用 systemd 托管,让它开机自启

前台跑着好玩,生产必须托管。写一个最简的 unit 文件即可:

[Unit]
Description=VictoriaMetrics
After=network.target

[Service]
Type=simple
User=victoria
WorkingDirectory=/opt
ExecStart=/opt/victoria-metrics \
  -storageDataPath=/var/lib/victoria-metrics \
  -retentionPeriod=6 \
  -httpListenAddr=127.0.0.1:8428 \
  -promscrape.config=/etc/victoria-metrics/scrape.yml
Restart=always
RestartSec=3
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

先 useradd -r -s /sbin/nologin victoria 建个专用用户,再把数据目录 chown -R victoria:victoria /var/lib/victoria-metrics,然后 systemctl daemon-reload && systemctl enable --now victoria-metrics。LimitNOFILE 调大是必须的,VM 会开很多文件句柄,不改的话高负载下会报 too many open files。

第七步:磁盘占用与保留策略的真相

大家最关心的就是「到底省不省」。实际经验:同样的指标规模下,VM 的磁盘占用大约是 Prometheus 的三分之一到十分之一,内存占用更是小一个数量级。原因在于它用了更激进的压缩算法,而且按时间分块独立压缩,不像 Prometheus 的 block 需要频繁 compaction。

控制磁盘的三个手段,按效果排序:

  1. 调大 scrape_interval。从 15 秒放到 30 秒甚至 60 秒,采集量直接减半。主机监控 30 秒完全够,除非你在做秒级压测。
  2. 缩短 -retentionPeriod。留 3 个月和留 12 个月,磁盘差 4 倍。
  3. 删除不需要的指标。node_exporter 默认导出几百个指标,很多你用不上。可以用 VM 的 relabel 或 -promscrape.dropOriginalLabels 之类做裁剪。

常见坑与排错清单

坑一:目标是 up=0 但 exporter 明明在跑。 八成是防火墙或监听地址问题。VM 抓的是它配置里的 targets,如果 exporter 只绑了 127.0.0.1,而 VM 在另一台机器,自然抓不到。检查 curl http://目标:9100/metrics 能否在你 VM 所在机器上成功。

坑二:Grafana 查不到数据但 vmui 能查。 通常是时间范围或时区问题。Grafana 面板默认可能查的是别的时间窗,或者数据源 URL 写的是 https 而 VM 只开了 http。先在 vmui 用同一个查询确认数据存在,再到 Grafana 里对比查询参数。

坑三:磁盘涨得比预期快。 先 du -sh /var/lib/victoria-metrics/* 看是哪个分区在涨。如果是有标签爆炸(比如某个指标带了请求 URL 之类的超基数字段),数据量会失控。这时候要回过头审查采集配置,把高基数的 label drop 掉。

坑四:远程写入后中心机没有数据。 检查中心机 -httpListenAddr 是不是只绑了 127.0.0.1,以及各机器的 -remoteWrite.url 端口对不对。另外 vmagent 有本地缓冲,网络短暂中断它会重试,不用慌。

总结:一次迁移的性价比

从 Prometheus 换到 VictoriaMetrics,本质上是「协议不变、资源减半」。对个人站长来说,最实在的收益不是查询快了多少毫秒,而是**你能用一台更便宜的机器、一块更小的盘,长期稳定地跑着监控**。安装是单个二进制,配置沿用 Prometheus 那套,Grafana 面板直接复用,唯一的适应成本就是记住几个新的命令行参数。

如果你现在正被 Prometheus 的内存和磁盘困扰,花半小时按上面的步骤跑一遍单机版,用 vmui 对比一下数据量,你大概率会和我一样,把它留在生产上不再换回去。

Last modification:October 10th, 2026 at 01:24 pm

Leave a Comment