假设我正在使用卷来保存我的 Prometheus 数据,我想知道是否可以运行多个实例以实现高可用性。
我相信只有一个 Prometheus 实例必须负责写入 tsdb 系列,并且拥有多个实例可能会导致竞争条件并损坏数据(我认为它的 tsdb 具有锁文件的原因一定就是这样)。
因此,问题是,我可以运行多个 Prometheus 实例,并且都指向相同的数据并将其用作高可用性选项吗?或者,是否有其他方法可以在配置更改导致的滚动重启期间保持 Prometheus 始终可用?
答案1
您还可以并行运行 Prometheus 的两个实例/副本,分别抓取目标并独立保存数据,然后使用另一个服务Thanos 查询在它们前面进行查询并对结果进行重复数据删除。
此设置涉及更多活动部件,但为您提供了更大的灵活性来实现数据可用性和服务可靠性目标。
答案2
回答您的问题,拥有多个指向相同数据并使用它的非高可用性 Prometheus 实例并不是一个高可用性选项。在 pod/节点重新启动期间,其他实例无法获得数据,这是没用的。如果您正在考虑拥有多个 Prometheus 实例并使其具有高可用性。我建议您使用 Prometheus 联合。这也是一种简单扩展的解决方案,其中一个主服务器从不同数据中心的不同服务器收集指标。
设置此架构非常简单。主服务器部署了“目标”,其中包含从属 Prometheus 服务器 URL 列表,如下所示:
scrape_configs:
- job_name: federated_prometheus
honor_labels: true
metrics_path: /federate
params:
match[]:
- '{job="the-prom-job"}'
static_configs:
- targets:
- prometheus-slave1:9090
- prometheus-slave2:9090
配置中的 match[] 参数指示 Prometheus 累积并存储特定作业的所有从属指标。您也可以将其设置为正则表达式:{__name__=~”^job:.*”}
。这将从与表达式定义匹配的几个不同作业中收集指标。
Prometheus 从属服务器应具有以下配置:
global:
external_labels:
slave: 1
relabel_configs:
- source_labels: [_prometheus_slave]
action: keep
regex: slave1
当数据量不断增长时,存储驱动程序应该能够处理增长,以提供可靠的历史数据。对此的简单解决方案是使用云弹性存储服务(例如 AWS S3 或 Google Storage)作为存储后端。这些服务为需要维护大量数据的 Prometheus 服务器(例如连接到大型 Kubernetes 集群或具有一个监控端点的多个集群的服务器)提供无限容量。
Prometheus 本身提供了一种高级存储管理解决方案 - 通过快照实现存储可扩展性。通过对 Prometheus 数据进行快照并使用存储保留配置删除数据,用户可以实时获取超过 X 天或 X 个月的数据,或大于特定大小的数据。然后,他们还可以将旧数据存储在单独的磁盘上并按需提供。