VictoriaMetrics 高可用(HA)集群方案 #
为了提高 VictoriaMetrics 的高可用性,我们可以:
- 部署多个
vminsert
并使用负载均衡(如 Nginx)分发写入请求。 - 使用负载均衡(如 Nginx)代理
vmselect
查询,保证查询的高可用。 - 扩展
vmstorage
,采用分片存储,提高存储能力和容灾能力。
1. 高可用(HA)架构 #
┌──────────────────────────────────┐
│ Prometheus │
└──────────────▲───────────────────┘
│ remote_write
▼
┌────────────────────────────┐
│ HAProxy/Nginx (LB) │
└──────────────▲─────────────┘
│ 负载均衡
┌───────────────┴──────────────┐
│ │
┌──────▼──────┐ ┌──────▼──────┐
│ vminsert-1 │ │ vminsert-2 │
└──────▲──────┘ └──────▲──────┘
│ 负载均衡写入
└──────────────┐
▼
┌──────────────────────────────────┐
│ 多个 vmstorage 存储实例 │
└──────────────────────────────────┘
│
┌──────────────────────────────────┐
│ 多个 vmstorage 备份实例 │
└──────────────────────────────────┘
│
┌──────────────────────────────────┐
│ HAProxy/Nginx (LB) │
└──────────────────────────────────┘
│ 负载均衡查询
┌───────────────┴──────────────┐
│ │
┌──────▼──────┐ ┌──────▼──────┐
│ vmselect-1 │ │ vmselect-2 │
└──────▲──────┘ └──────▲──────┘
│
▼
┌────────────┐
│ Grafana │
└────────────┘
2. 高可用配置 #
2.1 vminsert
负载均衡
#
我们使用 Nginx 作为 vminsert
的负载均衡器,确保 Prometheus remote_write
的高可用。
Nginx 负载均衡 vminsert
配置
#
upstream vminsert_lb {
server vminsert1:8480 max_fails=3 fail_timeout=10s;
server vminsert2:8480 max_fails=3 fail_timeout=10s;
keepalive 16;
}
server {
listen 8480;
location / {
proxy_pass http://vminsert_lb;
proxy_set_header Host $host;
}
}
- 让 Prometheus
remote_write
指向 Nginx,即http://nginx:8480/api/v1/write
。 - 负载均衡
vminsert
,如果某个vminsert
挂了,流量会自动转移到另一个。
2.2 vmselect
负载均衡
#
Grafana 查询时,需要确保 vmselect
高可用。
Nginx 负载均衡 vmselect
配置
#
upstream vmselect_lb {
server vmselect1:8481 max_fails=3 fail_timeout=10s;
server vmselect2:8481 max_fails=3 fail_timeout=10s;
keepalive 16;
}
server {
listen 8481;
location / {
proxy_pass http://vmselect_lb;
proxy_set_header Host $host;
}
}
- Grafana 指向 Nginx:
http://nginx:8481/api/v1/query
- 自动切换
vmselect
查询,提高可用性。
2.3 vmstorage
高可用
#
vmstorage
存储节点本身是 分布式存储,可以:
部署 多个
vmstorage
,均衡存储数据。采用
数据备份
,避免数据丢失:
- 快照备份(定期
rsync
复制数据)。 - 对象存储(S3/OSS)同步。
- 快照备份(定期
示例:部署多个 vmstorage
#
nohup ./vmstorage -storageDataPath=/data/vmstorage -retentionPeriod=3y > vmstorage.log 2>&1 &
nohup ./vmstorage -storageDataPath=/data/vmstorage_backup -retentionPeriod=3y > vmstorage_backup.log 2>&1 &
- 主存储:
/data/vmstorage
- 备份存储:
/data/vmstorage_backup
3. HA 集群的 Mermaid 架构图 #
graph TD;
subgraph Prometheus
A[Prometheus] -- remote_write --> LB1[HAProxy/Nginx LB]
end
subgraph VictoriaMetrics_Cluster
LB1 -- Distribute Data --> B1[vminsert-1]
LB1 -- Distribute Data --> B2[vminsert-2]
B1 & B2 -- Store Data --> C1[vmstorage-1]
B1 & B2 -- Store Data --> C2[vmstorage-2]
C1 & C2 -- Query Data --> LB2[HAProxy/Nginx LB]
LB2 -- Load Balance Query --> D1[vmselect-1]
LB2 -- Load Balance Query --> D2[vmselect-2]
end
subgraph Monitoring
D1 & D2 -- Query --> E[Grafana]
end
这张图展示了 Prometheus 和 VictoriaMetrics 高可用(HA)集群架构,并介绍了数据采集、存储、查询、可视化的流转过程。下面我详细解析图中的各个部分和它们的功能。
1. Prometheus 数据采集 #
graph TD;
subgraph Prometheus
A[Prometheus] -- remote_write --> LB1[HAProxy/Nginx LB]
end
解释 #
- Prometheus:负责采集监控数据(例如从 Kubernetes、应用、主机等来源)并通过
remote_write
将数据发送到 VictoriaMetrics 集群。 - HAProxy/Nginx LB:充当 负载均衡器,将来自 Prometheus 的写入请求分发到 多个
vminsert
实例,实现负载均衡。
2. VictoriaMetrics 数据写入和存储 #
graph TD;
subgraph VictoriaMetrics_Cluster
LB1 -- Distribute Data --> B1[vminsert-1]
LB1 -- Distribute Data --> B2[vminsert-2]
B1 & B2 -- Store Data --> C1[vmstorage-1]
B1 & B2 -- Store Data --> C2[vmstorage-2]
C1 & C2 -- Query Data --> LB2[HAProxy/Nginx LB]
LB2 -- Load Balance Query --> D1[vmselect-1]
LB2 -- Load Balance Query --> D2[vmselect-2]
end
解释 #
- vminsert-1 和 vminsert-2:
- 负责接收来自 Prometheus 的数据,并将数据写入到
vmstorage
存储组件中。 - 通过 HAProxy/Nginx LB(LB1) 实现负载均衡,保证写入请求的分发。
- 负责接收来自 Prometheus 的数据,并将数据写入到
- vmstorage-1 和 vmstorage-2:
- 是 VictoriaMetrics 的数据存储层,负责持久化存储采集到的监控数据。
- 数据存储是分布式的,通过多个存储节点提供冗余和高可用性。
- HAProxy/Nginx LB2:
- 负责将 查询请求(来自 Grafana 或其他客户端)负载均衡地分发到多个
vmselect
实例,确保查询的高可用性。
- 负责将 查询请求(来自 Grafana 或其他客户端)负载均衡地分发到多个
3. 数据查询与可视化 #
graph TD;
subgraph Monitoring
D1 & D2 -- Query --> E[Grafana]
end
解释 #
- vmselect-1 和 vmselect-2:
- 负责 查询 存储在 vmstorage 中的数据。
- 通过 HAProxy/Nginx LB2 负载均衡,多个
vmselect
实例共同处理查询请求。
- Grafana:
- Grafana 作为 可视化工具,通过 PromQL 查询数据并展示为仪表盘(Dashboard),便于用户实时查看监控数据。
4. 数据流和交互过程 #
- Prometheus 采集数据:
- Prometheus 从各种源(例如 K8s、Docker、主机等)采集监控指标。
- Prometheus 通过
remote_write
发送数据:- Prometheus 将数据通过
remote_write
推送到 HAProxy/Nginx LB1,由它将数据分发到 vminsert 实例。
- Prometheus 将数据通过
- vminsert 将数据写入存储:
- vminsert 将收到的数据存储到 多个
vmstorage
实例(vmstorage-1
和vmstorage-2
),实现数据持久化。
- vminsert 将收到的数据存储到 多个
- 查询数据:
- 用户通过 Grafana 查询数据,Grafana 将查询请求发送到 HAProxy/Nginx LB2,后者将请求负载均衡到 多个
vmselect
实例。
- 用户通过 Grafana 查询数据,Grafana 将查询请求发送到 HAProxy/Nginx LB2,后者将请求负载均衡到 多个
- 数据展示:
vmselect
从 vmstorage 查询数据并返回结果,Grafana 对这些数据进行可视化展示,供用户查看。
5. 关键组件和功能 #
功能 | 组件 | 作用 |
---|---|---|
数据采集 | Prometheus + remote_write | 采集监控数据,并远程写入 VictoriaMetrics |
数据写入 | vminsert | 将数据写入到 vmstorage 存储 |
数据存储 | vmstorage | 持久化存储监控数据,支持水平扩展 |
查询负载均衡 | HAProxy/Nginx LB2 | 将查询请求负载均衡分发到 vmselect 实例 |
查询 | vmselect | 查询存储在 vmstorage 的监控数据 |
可视化 | Grafana | 查询数据并进行可视化展示 |
6. 适用场景 #
✅ 大规模监控系统,适用于 Prometheus 集群与 VictoriaMetrics 集群的高可用方案 ✅ 高可用性:多实例、负载均衡和分布式存储,确保数据的可靠存储和查询 ✅ 长期存储:能够存储大规模时间序列数据,适用于长时间的数据保留(例如 3 年以上) ✅ 高并发查询:通过负载均衡和多查询节点分摊查询负载,提高查询性能
总结 #
这张图展示了一个 高可用的 Prometheus 和 VictoriaMetrics 架构,包括了数据采集、存储、查询和可视化的完整流转过程。架构设计中通过 HAProxy/Nginx LB 负载均衡组件确保了 写入 和 查询 流量的高可用性,同时通过 多个 vminsert
和 vmselect
实例 提供了数据存储和查询的冗余。最终,用户通过 Grafana 实现对存储数据的可视化查看。
4. 关键优化点 #
4.1 避免单点故障 #
vminsert
、vmselect
、vmstorage
均可水平扩展。vmstorage
数据多副本,防止数据丢失。
4.2 提高查询性能 #
- 负载均衡
vmselect
,多个vmselect
提供高可用查询能力。 vmstorage
使用 SSD 以提高查询速度。
4.3 提高写入性能 #
通过多个
vminsert
并行写入,提高吞吐量。Prometheus
remote_write
批量提交:
remote_write: - url: "http://nginx:8480/api/v1/write" queue_config: capacity: 5000 max_shards: 20 max_samples_per_send: 2000 batch_send_deadline: 5s
5. 方案总结 #
✅ 高可用
- 负载均衡
vminsert
,防止 Prometheus 写入失败。 - 负载均衡
vmselect
,保证查询服务可用。 vmstorage
多实例存储,数据备份防止丢失。
✅ 弹性扩展
vminsert
、vmselect
、vmstorage
均可 横向扩展,适应大规模数据量。
✅ 长期存储
vmstorage
数据保留 3 年,可扩展至 S3/OSS 存储,长期保存数据。
6. 适用场景 #
🚀 适用于大规模 Kubernetes 监控 🚀 适用于多集群 Prometheus 监控统一存储 🚀 适用于长期存储海量指标数据