VictoriaMetrics 中文教程(07)高可用(High availability)方案
VictoriaMetrics 中文教程系列文章:
- VictoriaMetrics 中文教程(01)简介
- VictoriaMetrics 中文教程(02)安装
- VictoriaMetrics 中文教程(03)如何配置 Prometheus 使其把数据远程写入 VictoriaMetrics
- VictoriaMetrics 中文教程(04)对接 Grafana 同时介绍 vmui
- VictoriaMetrics 中文教程(05)对接各类监控数据采集器
- VictoriaMetrics 中文教程(06)容量规划
VictoriaMetrics 高可用方案
实现高可用性的一般方法如下:
- 在不同的数据中心(可用区域)运行两个相同配置的 VictoriaMetrics 实例;
- 通过 vmagent 或 Prometheus 将收集的数据同时存储到这些实例中。
- 查询第一个 VictoriaMetrics 实例,并在第一个实例暂时不可用时故障转移到第二个实例。这可以通过 vmauth 完成。
这样的方案可以保证当其中一个 VictoriaMetrics 实例不可用时,收集的数据不会丢失。收集的数据将继续写入可用的 VictoriaMetrics 实例,因此可供查询。如果 vmagent 和 Prometheus 无法将收集的数据发送到配置的远程存储,它们都会在本地缓冲收集的数据。因此,在暂时不可用的 VictoriaMetrics 实例可用后,收集的数据将重新写入,数据不会丢。
如果您使用 vmagent 将数据存储到 VictoriaMetrics,则可以为其配置多个 -remoteWrite.url
命令行标志(VictoriaMetrics 的进程启动参数),其中每个标志指向特定可用区域中的 VictoriaMetrics 实例,以便将收集的数据复制到所有 VictoriaMetrics 实例。例如,以下命令指示 vmagent 将数据复制到 VictoriaMetrics 的 vm-az1 和 vm-az2 实例:
/path/to/vmagent \
-remoteWrite.url=http://<vm-az1>:8428/api/v1/write \
-remoteWrite.url=http://<vm-az2>:8428/api/v1/write
如果您使用 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,因为它比 Prometheus 使用的 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
。因此,同时使用重复数据删除和降采样是安全的。
译者注:降采样是商业版的功能。
-dedup.minScrapeInterval
的建议值必须等于 Prometheus 配置中的 scrape_interval
配置。建议在所有抓取目标中使用相同的 scrape_interval
。
如果多个配置完全相同的 vmagent 或多个高可用的 Prometheus 实例将数据写入同一个 VictoriaMetrics 实例,去重操作可以减少磁盘空间的使用。这些 vmagent 或 Prometheus 实例在其配置中必须具有完全相同的 external_labels
部分,以便它们将数据写入相同的时间序列。
建议为每一对不同的高可用(HA)的 vmagent 实例传递不同的 -promscrape.cluster.name
值,这样去重操作就能始终保留一个 vmagent 实例的样本,并移除来自其他 vmagent 实例的重复样本。这样会让数据的上报频率更均匀。
VictoriaMetrics 会将所有摄入的样本存储到磁盘中,即使设置了 -dedup.minScrapeInterval
命令行标志。摄入的样本在后台合并以及查询执行期间进行去重。VictoriaMetrics 还支持在数据存储到磁盘之前的摄入过程中进行去重,通过 -streamAggr.dedupInterval
命令行标志实现。
总结
本文介绍了 VictoriaMetrics 的高可用方案,这里介绍的是单机版实现的高可用方案,即:双写。双写的鲁棒性非常高,对于绝大部分中小型公司够用了。另外采集侧如果也想实现高可用,即相同的一份数据应用多个不同的 vmagent 去采集,那就需要在服务端启用 -dedup.minScrapeInterval
的配置,并给每个 vmagent 传入不同的 -promscrape.cluster.name
值。