建议方案:双机房 Active-Active,两套独立 VictoriaMetrics Cluster,前端 vmagent 双写,查询侧用全局 vmselect 或 vmauth 做容灾入口。不要把同一个 VM 集群的 vmstorage/vminsert/vmselect 跨机房拉伸,官方也明确建议单集群组件放在同一低延迟网络内;多机房应跑独立集群,再由 vmagent 复制写入、由上层查询组件汇总。(docs.victoriametrics.com)
总体拓扑
| |
每个机房内部
VictoriaMetrics Cluster 由 vmstorage、vminsert、vmselect 三类服务组成,三者可独立扩容。(docs.victoriametrics.com) 每个机房建议:
| 组件 | 数量 | 说明 |
|---|---|---|
vmstorage | 3 起 | 推荐多小节点;如果本机房内启用 -replicationFactor=2,至少 3 个 storage,满足 2*N-1 规则。(docs.victoriametrics.com) |
vminsert | 2 起 | 无状态,前面放本机房 write LB 或 vmauth。 |
vmselect | 2 起 | 无状态,前面放 read LB 或 vmauth。 |
vmauth/LB | 2 起 | /insert 路由到 vminsert:8480,/select 路由到 vmselect:8481。(docs.victoriametrics.com) |
vmagent | 每采集域 2 起 | 使用本地持久盘队列,双写到两个机房。 |
写入路径
vmagent 配两个 -remoteWrite.url,分别写两个机房的 vminsert 入口。官方多区域方案也是这个思路:每个 region/机房保留一份完整数据,任意一个机房离线仍可服务,但流量和存储会翻倍。(docs.victoriametrics.com)
示例:
| |
vmagent 对每个 remote write 目标有独立队列;某个机房不可用时会在本地落盘缓存,恢复后补发,避免影响另一个机房。(docs.victoriametrics.com) 队列大小按“写入字节率 × 可接受断链时长”估,例如要扛 12 小时跨机房中断,就按每个 URL 至少 12 小时数据量预留。
存储复制策略
我建议分两档:
成本均衡版:每个机房
vminsert -replicationFactor=1,依靠双机房完整副本做灾备。总数据副本约 2 份。适合主要目标是“任一机房不可用仍可查写”。强 HA 版:每个机房
vminsert -replicationFactor=2,每机房至少 3 个vmstorage。总数据副本约 4 份。适合还要覆盖“单机房内任一vmstorage故障/维护时,本机房查询也不缺数据”。
强 HA 版示例:
| |
对应 vmselect 也设置同样的 replication factor,并开启去重:
| |
如果只有 VM 自身复制导致的完全同 timestamp 副本,-dedup.minScrapeInterval=1ms 就够;如果两个 vmagent 同时抓同一批 targets,建议设成实际 scrape_interval,比如 15s。官方也建议有重复写入时按 scrape interval 配 dedup。(docs.victoriametrics.com)
查询路径
推荐默认用 全局 vmselect:每个机房的本地 vmselect 开 -clusternativeListenAddr=:8401,全局 vmselect 查询两个机房的下级 vmselect,并设置 -globalReplicationFactor=2 和 dedup。官方文档支持这种 multi-level vmselect。(docs.victoriametrics.com)
| |
这条路径优先保证数据完整性;缺点是跨机房查询延迟更高。低延迟大盘可以用 vmauth first_available 或 GSLB 优先读本地机房,故障时切到另一个机房,但要监控 vmagent backlog,避免读到一个“可用但落后”的机房。官方拓扑文档也把这两种读路径作为取舍:全局 vmselect 更完整,vmauth first_available 更快但可能有新鲜度风险。(docs.victoriametrics.com)
告警和备份
vmalert 建议两机房都部署,规则一致,查询本地或全局入口;告警发到双机房 Alertmanager 集群做去重。官方多区域指南也推荐每个区域跑 vmalert,Alertmanager 负责告警去重。(docs.victoriametrics.com)
另外,复制不等于备份。建议每个机房 vmstorage 做周期性 vmbackup/vmbackupmanager 到对象存储,最好对象存储再跨区域复制。
故障表现
- 单个
vminsert/vmselect挂:LB 摘除,业务无感。 - 单个
vmstorage挂:强 HA 版本机房完整;成本版可能本地查询 partial,但全局读可从另一机房补齐。 - 单机房故障:
vmagent继续写另一个机房;全局读切到健康机房,RPO 取决于vmagent队列是否足够。 - 跨机房链路断:本地写入继续,远端写入排队;链路恢复后补发,期间跨机房全局视图可能有延迟。
一句话落地:不要跨机房组一个大 VM 集群;做两个完整小集群,用 vmagent 双写,用全局查询层合并/故障切换。