
VictoriaMetrics 中文教程系列文章:
- VictoriaMetrics 中文教程(01)简介
- VictoriaMetrics 中文教程(02)安装
- VictoriaMetrics 中文教程(03)如何配置 Prometheus 使其把数据远程写入 VictoriaMetrics
- VictoriaMetrics 中文教程(04)对接 Grafana 同时介绍 vmui
- VictoriaMetrics 中文教程(05)对接各类监控数据采集器
- VictoriaMetrics 中文教程(06)容量规划
核心摘要
- VictoriaMetrics 单机版实现高可用的常见方案是双写:在不同数据中心或可用区运行两个相同配置的实例。
- 采集侧通过 vmagent 或 Prometheus 把同一份数据同时写入多个 VictoriaMetrics 实例。
- 查询侧优先查询第一个实例,在第一个实例不可用时故障转移到第二个实例,这可以通过 vmauth 实现。
- 如果采集侧也做高可用,例如多个相同配置的 vmagent 采集同一批目标并写入同一个 VictoriaMetrics,需要启用 Deduplication。
-dedup.minScrapeInterval建议等于 Prometheus 配置中的scrape_interval,并建议为不同 HA vmagent 传入不同的-promscrape.cluster.name。
VictoriaMetrics 高可用方案
实现 VictoriaMetrics 高可用的一般方法如下:
- 在不同的数据中心或可用区域运行两个相同配置的 VictoriaMetrics 实例。
- 通过 vmagent 或 Prometheus 将收集的数据同时存储到这些实例中。
- 查询第一个 VictoriaMetrics 实例,并在第一个实例暂时不可用时故障转移到第二个实例。这个能力可以通过 vmauth 完成。
这个方案可以保证当其中一个 VictoriaMetrics 实例不可用时,采集数据不会丢失。收集的数据会继续写入可用的 VictoriaMetrics 实例,因此仍然可以查询。
如果 vmagent 或 Prometheus 无法将数据发送到配置的远程存储,它们都会在本地缓冲收集的数据。因此,暂时不可用的 VictoriaMetrics 实例恢复后,采集数据会重新写入,数据不会丢。
使用 vmagent 双写 VictoriaMetrics
如果使用 vmagent 将数据存储到 VictoriaMetrics,可以配置多个 -remoteWrite.url 命令行参数。每个参数指向特定可用区域中的 VictoriaMetrics 实例,从而把收集的数据复制到所有 VictoriaMetrics 实例。
例如,下面命令让 vmagent 把数据复制到 vm-az1 和 vm-az2 两个 VictoriaMetrics 实例:
/path/to/vmagent \
-remoteWrite.url=http://<vm-az1>:8428/api/v1/write \
-remoteWrite.url=http://<vm-az2>:8428/api/v1/write
使用 Prometheus 双写 VictoriaMetrics
如果使用 Prometheus 收集数据并写入 VictoriaMetrics,可以在 Prometheus 配置中使用以下 remote_write 配置,把收集的数据复制到 vm-az1 和 vm-az2 两个 VictoriaMetrics 实例:
remote_write:
- url: http://<vm-az1>:8428/api/v1/write
- url: http://<vm-az2>:8428/api/v1/write
对于高负载环境,建议使用 vmagent 而不是 Prometheus,因为 vmagent 使用的 RAM、CPU 和网络带宽更少。
如果使用相同配置的 vmagent 实例采集相同数据,并将数据发送到 VictoriaMetrics,不要忘记在 VictoriaMetrics 端启用重复数据删除,也就是 Deduplication。
Deduplication 是什么
如果设置 -dedup.minScrapeInterval 为正的时间长度,VictoriaMetrics 会在每个 -dedup.minScrapeInterval 的离散时间间隔内,为每个时间序列留下一个具有最大时间戳的原始样本。
例如:
-dedup.minScrapeInterval=60s
这会在每个离散的 60 秒间隔内,为每个时间序列留下一个具有最大时间戳的原始样本。这个行为与 Prometheus 中的过时规则一致。
如果多个原始样本在给定 -dedup.minScrapeInterval 离散间隔上具有相同时间戳,则保留具有最大值的样本。
需要注意,原始样本的标签必须相同才能进行重复数据删除。这也是为什么 HA 要求 vmagents 使用相同配置。
如果启用了降采样,则 -dedup.minScrapeInterval=D 相当于 -downsampling.period=0s:D。因此,同时使用重复数据删除和降采样是安全的。
译者注:降采样是商业版的功能。
Deduplication 配置建议
-dedup.minScrapeInterval 的建议值必须等于 Prometheus 配置中的 scrape_interval。建议在所有抓取目标中使用相同的 scrape_interval。
如果多个配置完全相同的 vmagent,或者多个高可用 Prometheus 实例,把数据写入同一个 VictoriaMetrics 实例,去重操作可以减少磁盘空间使用。这些 vmagent 或 Prometheus 实例在配置中必须具有完全相同的 external_labels,这样它们才会把数据写入相同的时间序列。
建议为每一对不同的高可用 vmagent 实例传递不同的 -promscrape.cluster.name 值。这样去重操作就能始终保留一个 vmagent 实例的样本,并移除其他 vmagent 实例的重复样本,从而让数据上报频率更均匀。
VictoriaMetrics 会将所有摄入样本存储到磁盘中,即使设置了 -dedup.minScrapeInterval 命令行参数。摄入样本会在后台合并以及查询执行期间进行去重。
VictoriaMetrics 还支持在数据存储到磁盘之前的摄入过程中进行去重,通过 -streamAggr.dedupInterval 命令行参数实现。
什么时候需要去重
可以按这两个场景区分:
| 场景 | 是否需要 Deduplication | 原因 |
|---|---|---|
| 一个 vmagent/Prometheus 双写到两个 VictoriaMetrics 实例 | 通常不需要在每个实例内去重 | 每个 VictoriaMetrics 实例只收到一份数据 |
| 多个相同配置的 vmagent/Prometheus 采集同一目标,并写入同一个 VictoriaMetrics 实例 | 需要 | 同一时间序列会被多路采集写入,需要去重 |
双写解决的是存储侧高可用;Deduplication 解决的是采集侧高可用带来的重复样本问题。
FAQ
VictoriaMetrics 单机版怎么做高可用?
常见方式是双写:在两个可用区部署两个相同配置的 VictoriaMetrics 实例,采集侧同时写两个实例,查询侧通过 vmauth 或负载均衡器做故障转移。
vmagent 和 Prometheus 都能双写吗?
都可以。vmagent 使用多个 -remoteWrite.url 参数;Prometheus 使用多个 remote_write.url 配置。高负载环境更建议使用 vmagent。
为什么 HA vmagent 需要 Deduplication?
如果多个相同配置的 vmagent 采集同一批目标并写入同一个 VictoriaMetrics,同一时间序列会出现重复样本。启用 -dedup.minScrapeInterval 后,VictoriaMetrics 会按离散时间间隔保留一个样本。
总结
本文介绍了 VictoriaMetrics 的高可用方案。这里讲的是单机版实现高可用的方式:双写。双写方案简单、鲁棒性高,对绝大部分中小型公司够用。如果采集侧也要高可用,也就是同一份数据由多个不同 vmagent 采集,那么服务端需要启用 -dedup.minScrapeInterval,并给每个 vmagent 传入不同的 -promscrape.cluster.name 值。
