配置高可用性
Grafana Alerting 使用 Prometheus 模型,将警报规则的评估与通知的发送分开。在此模型中,警报规则的评估由警报生成器完成,通知的发送由警报接收器完成。在 Grafana Alerting 中,警报生成器是 Scheduler,接收器是 Alertmanager。

运行多个 Grafana 实例时,所有警报规则都会在所有实例上评估。您可以将警报规则的评估视为按运行的 Grafana 实例数量进行复制。Grafana Alerting 通过这种方式确保只要至少有一个 Grafana 实例正在工作,警报规则就会继续评估,并且警报通知会继续发送。
您可以在状态历史中找到这种重复,这是验证高可用性设置的好方法。
警报生成器在所有实例上评估所有警报规则,而警报接收器会尽最大努力避免重复通知。Alertmanager 使用 gossip 协议在其之间共享信息,以防止发送重复的通知。
Alertmanager 选择可用性而非一致性,这可能偶尔导致重复或乱序通知。它认为重复或乱序通知总比没有通知好。
Alertmanager 也会同步静默规则,这意味着在一个 Grafana 实例上创建的静默规则会复制到所有其他 Grafana 实例。通知和静默规则都会定期以及在优雅关机时持久化到数据库。
使用 Memberlist 启用警报高可用性
开始之前
由于通知和静默规则的同步使用了 TCP 和 UDP 端口 9094
,请确保每个 Grafana 实例都能接受这些端口上的传入连接。
启用高可用性支持
- 在您的自定义配置文件 ($WORKING_DIR/conf/custom.ini) 中,找到
[unified_alerting]
部分。 - 将
[ha_peers]
设置为集群中每个 Grafana 实例的主机数(使用host:port
格式),例如ha_peers=10.0.0.5:9094,10.0.0.6:9094,10.0.0.7:9094
。ha_peers
部分必须至少添加一个 (1) Grafana 实例。 - 将
[ha_listen_address]
设置为实例的 IP 地址(使用host:port
格式),或者在使用 Kubernetes 的情况下设置为 Pod 的 IP。默认情况下,它设置为监听所有接口(0.0.0.0
)。 - 将
[ha_advertise_address]
设置为实例的主机名或 IP 地址,格式为“host:port
”。当实例位于 NAT(网络地址转换)后面时使用此设置,例如在 Docker Swarm 或 Kubernetes Service 中,外部地址和内部地址不同。此地址有助于其他集群实例与其通信。此设置为可选。 - 在 custom.ini 的
[unified_alerting]
部分设置[ha_peer_timeout]
,以指定等待实例通过 Alertmanager 发送通知的时间。默认值为 15 秒,如果 Grafana 服务器位于不同的地理区域或它们之间的网络延迟很高,该值可能会增加。
有关演示,请参阅此使用 Docker Compose 的示例。
使用 Redis 启用警报高可用性
作为 Memberlist 的替代方案,您可以使用 Redis 实现高可用性。如果您希望使用中央数据库进行高可用性,并且无法支持所有 Grafana 服务器的网状连接,这将非常有用。
- 请确保您有一个支持 pub/sub 的 Redis 服务器。如果您在 Redis 集群前面使用代理,请确保代理支持 pub/sub。
- 在您的自定义配置文件 ($WORKING_DIR/conf/custom.ini) 中,找到
[unified_alerting]
部分。 - 将
ha_redis_address
设置为 Grafana 应连接的 Redis 服务器地址。 - 可选:如果 Redis 服务器上启用了认证,请使用
ha_redis_username
和ha_redis_password
设置用户名和密码。 - 可选:如果您计划与多个 Grafana 实例共享 Redis 服务器,请将
ha_redis_prefix
设置为唯一值。 - 可选:将
ha_redis_tls_enabled
设置为true
,并配置相应的ha_redis_tls_*
字段,以使用传输层安全性 (TLS) 保护 Grafana 和 Redis 之间的通信。 - 将
[ha_advertise_address]
设置为ha_advertise_address = "${POD_IP}:9094"
。如果实例的 IP 地址不属于 RFC 6890 且没有默认路由,则需要此设置。
有关演示,请参阅此使用 Docker Compose 的示例。
使用 Kubernetes 启用警报高可用性
您可以通过容器定义通过环境变量公开 Pod IP。
env: - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP
将端口 9094 添加到 Grafana Deployment 中
ports: - name: grafana containerPort: 3000 protocol: TCP - name: gossip-tcp containerPort: 9094 protocol: TCP - name: gossip-udp containerPort: 9094 protocol: UDP
将环境变量添加到 Grafana Deployment 中
env: - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP
创建一个无头服务,它返回 Pod IP 而非服务 IP,这是
ha_peers
所需要的apiVersion: v1 kind: Service metadata: name: grafana-alerting namespace: grafana labels: app.kubernetes.io/name: grafana-alerting app.kubernetes.io/part-of: grafana spec: type: ClusterIP clusterIP: 'None' ports: - port: 9094 selector: app: grafana
确保您的 grafana Deployment 具有与选择器匹配的标签,例如
app:grafana
添加到 grafana.ini 中
[unified_alerting] enabled = true ha_listen_address = "${POD_IP}:9094" ha_peers = "grafana-alerting.grafana:9094" ha_advertise_address = "${POD_IP}:9094" ha_peer_timeout = 15s ha_reconnect_timeout = 2m
验证您的高可用性设置
运行多个 Grafana 实例时,所有警报规则都会在每个实例上评估。警报规则的这种多次评估在状态历史中可见,并提供了一种简单的方法来验证您的高可用性配置是否正常工作。
注意
如果在高可用性节点上混合使用
execute_alerts=false
和execute_alerts=true
,由于警报状态未在 Grafana 实例之间共享,因此execute_alerts=false
的实例不会显示任何警报状态。高可用性设置(如
ha_peers
等)仅适用于 Alertmanager 之间的通信,用于同步静默规则并尝试避免重复通知,如引言中所述。
您还可以通过监控 Grafana 暴露的 Alertmanager 指标来确认您的高可用性设置。
指标 | 描述 |
---|---|
alertmanager_cluster_members | 表示集群中当前成员数量的数字。 |
alertmanager_cluster_messages_received_total | 接收到的集群消息总数。 |
alertmanager_cluster_messages_received_size_total | 接收到的集群消息总大小。 |
alertmanager_cluster_messages_sent_total | 发送的集群消息总数。 |
alertmanager_cluster_messages_publish_failures_total | 接收到的集群消息总数。 |
未能发布的消息总数。 | 发布失败消息的总数 |
alertmanager_cluster_pings_seconds | Ping 消息延迟的直方图。 |
alertmanager_cluster_pings_failures_total | 失败的 ping 总数。 |
alertmanager_peer_position | Alertmanager 实例认为自己持有的位置,它定义了其在集群中的角色。对等节点应从零开始按顺序编号。 |
您可以通过查询 alertmanager_cluster_members
和 alertmanager_peer_position
指标来确认警报高可用性设置中的 Grafana 实例数量。
请注意,这些警报高可用性指标通过 Grafana 的 /metrics
端点暴露,但不会自动收集或显示。如果您有连接到 Grafana 的 Prometheus 实例,请添加一个 scrape_config
来抓取 Grafana 指标,然后在 Explore 中查询这些指标。
- job_name: grafana
honor_timestamps: true
scrape_interval: 15s
scrape_timeout: 10s
metrics_path: /metrics
scheme: http
follow_redirects: true
static_configs:
- targets:
- grafana:3000
有关监控警报指标的更多信息,请参阅警报元监控。有关演示,请参阅使用 Docker Compose 的警报高可用性示例。
防止重复通知
在高可用性模式下,每个 Grafana 实例都运行自己的预配置 Alertmanager 来处理警报通知。
运行多个 Grafana 实例时,所有警报规则都会在每个实例上评估。默认情况下,每个实例会将触发的警报发送到各自的 Alertmanager。这导致所有运行的 Grafana 实例上重复处理通知。
处于高可用性模式下的 Alertmanager 之间相互通信以协调通知发送。然而,这种设置有时可能导致重复或乱序的通知。根据设计,高可用性优先发送重复通知,以降低丢失通知的风险。
为了避免重复通知,您可以配置一个共享的 Alertmanager 来管理所有 Grafana 实例的通知。有关更多信息,请参阅添加外部 Alertmanager。