VictoriaMetrics集群由vmstorage、vminsert、vmselect三个独立组件构成,需分别部署并严格对齐参数、网络及租户标识,否则易出现查询为空或连接拒绝等问题。

connection refused 时卡住。
vmstorage 启动时 storageDataPath 权限和磁盘挂载点必须提前确认
vmstorage 是唯一真正落盘的组件,它的 -storageDataPath 目录必须满足两个硬性条件:一是目录属主为运行用户(如 vmuser),二是所在文件系统不能是 tmpfs 或 overlayfs(常见于 Docker 容器或某些云主机默认根盘)。CentOS 7.9 上曾遇到因 /data 挂载为 xfs 但未启用 inode64 选项,导致写入 2TB 后出现 no space left on device 错误,而 df -h 显示还有 40% 空间——本质是 inode 耗尽。
实操建议:
- 用
ls -ld /data/vmstorage确认属主和权限,推荐chown -R vmuser:vmuser /data/vmstorage - 检查挂载选项:
findmnt -D /data,xfs 文件系统务必包含inode64 - 启动命令中必须显式指定
-retentionPeriod和-memory.allowedPercent,否则默认只保留 1 个月且最多用 30% 内存,生产环境几乎不可用 - 不要把多个 vmstorage 实例跑在同一台机器上还共用一个
-storageDataPath,它不支持多进程并发写同一目录
vminsert 的一致性哈希依赖 -replicationFactor 和 -storageNode 参数顺序
vminsert 不是负载均衡器,它靠 -storageNode 列表做一致性哈希分片。如果节点列表顺序不同(比如 node-A 先写在 node-1 的配置里,却在 node-2 的配置里排第二),相同指标会被路由到不同 vmstorage,查数时就丢数据。更隐蔽的是 -replicationFactor:设为 2 并不意味着自动双写,而是要求你提供至少 2×N 个 -storageNode 地址(N 为期望分片数),vminsert 才会往其中两个节点写副本。
典型错误配置:
vminsert-prod \ -storageNode=10.10.10.11:8401 \ -storageNode=10.10.10.12:8401 \ -replicationFactor=2
这实际只构成 1 个分片+1 个副本,无法容错。正确做法是至少提供 4 个地址:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
vminsert-prod \ -storageNode=10.10.10.11:8401 \ -storageNode=10.10.10.12:8401 \ -storageNode=10.10.10.13:8401 \ -storageNode=10.10.10.14:8401 \ -replicationFactor=2
vmselect 查询失败的 3 个真实原因不是配置写错,而是端口/协议/租户没对齐
访问 http://vmselect:8481/select/0/prometheus/api/v1/query 返回空结果或 500,先别改 YAML。VictoriaMetrics 集群版所有组件通信走 HTTP,但 vmselect 默认只向 :8401(vmstorage 的 RPC 端口)发请求,而 vmstorage 实际监听的是 -httpListenAddr=:8401(HTTP 接口)和 -rpcListenAddr=:8400(RPC 接口)——这里必须用 -storageNode=ip:8400,否则 vmselect 根本连不上。
另外两个高频陷阱:
-
-dedup.minScrapeInterval在 vmselect 启动参数里默认关闭,但如果你在 PromQL 中用了rate()且原始采集间隔不一致,会触发去重逻辑导致数据消失 - 多租户场景下,
/select/{accountID}/...中的{accountID}必须与 vminsert 写入时携带的X-Victoria-Metrics-Extra-Label中的accountID完全一致,大小写敏感,且不能有 URL 编码 - vmselect 的
-search.latencyOffset如果设得太小(如 0s),在高并发查询下会因等待超时直接丢弃部分 vmstorage 响应,表现为「有时能查到,有时为空」
systemd 服务模板里 LimitNOFILE 和 MemoryLimit 容易被忽略
集群组件对文件描述符和内存波动敏感。vminsert 在每秒写入 50 万指标时,常驻连接数轻松破 2 万;vmstorage 在 compaction 阶段内存瞬时峰值可达标称值的 1.8 倍。CentOS 7.9 默认 LimitNOFILE=4096,systemd 会直接 kill 进程并记日志 Too many open files。
安全配置示例(写入 /etc/systemd/system/vmstorage.service):
[Service] User=vmuser ExecStart=/opt/vm/bin/vmstorage-prod \ -storageDataPath=/data/vmstorage \ -retentionPeriod=24 \ -memory.allowedPercent=70 LimitNOFILE=1048576 MemoryLimit=16G
注意:MemoryLimit 是 cgroup v1 限制,CentOS 7.9 默认启用,但若系统启用了 cgroup v2(如某些新版 kernel),该参数无效,需改用 MemoryMax 并确认 /proc/cgroups 中 memory 行的 enabled 字段为 1。
-storageNode 地址少写了一个端口,或者 vmselect 的 -search.maxPointsPerTimeseries 比 vmstorage 的 -maxPointsPerTimeseries 小,查询就会静默截断——这种问题不会报错,只会让你以为数据丢了。


















