菜单
Enterprise 开源 RSS

配置高可用性

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

High availability
高可用性

运行多个 Grafana 实例时,所有警报规则都会在所有实例上评估。您可以将警报规则的评估视为按运行的 Grafana 实例数量进行复制。Grafana Alerting 通过这种方式确保只要至少有一个 Grafana 实例正在工作,警报规则就会继续评估,并且警报通知会继续发送。

您可以在状态历史中找到这种重复,这是验证高可用性设置的好方法。

警报生成器在所有实例上评估所有警报规则,而警报接收器会尽最大努力避免重复通知。Alertmanager 使用 gossip 协议在其之间共享信息,以防止发送重复的通知。

Alertmanager 选择可用性而非一致性,这可能偶尔导致重复或乱序通知。它认为重复或乱序通知总比没有通知好。

Alertmanager 也会同步静默规则,这意味着在一个 Grafana 实例上创建的静默规则会复制到所有其他 Grafana 实例。通知和静默规则都会定期以及在优雅关机时持久化到数据库。

使用 Memberlist 启用警报高可用性

开始之前

由于通知和静默规则的同步使用了 TCP 和 UDP 端口 9094,请确保每个 Grafana 实例都能接受这些端口上的传入连接。

启用高可用性支持

  1. 在您的自定义配置文件 ($WORKING_DIR/conf/custom.ini) 中,找到 [unified_alerting] 部分。
  2. [ha_peers] 设置为集群中每个 Grafana 实例的主机数(使用 host:port 格式),例如 ha_peers=10.0.0.5:9094,10.0.0.6:9094,10.0.0.7:9094ha_peers 部分必须至少添加一个 (1) Grafana 实例。
  3. [ha_listen_address] 设置为实例的 IP 地址(使用 host:port 格式),或者在使用 Kubernetes 的情况下设置为 Pod 的 IP。默认情况下,它设置为监听所有接口(0.0.0.0)。
  4. [ha_advertise_address] 设置为实例的主机名或 IP 地址,格式为“host:port”。当实例位于 NAT(网络地址转换)后面时使用此设置,例如在 Docker Swarm 或 Kubernetes Service 中,外部地址和内部地址不同。此地址有助于其他集群实例与其通信。此设置为可选。
  5. 在 custom.ini 的 [unified_alerting] 部分设置 [ha_peer_timeout],以指定等待实例通过 Alertmanager 发送通知的时间。默认值为 15 秒,如果 Grafana 服务器位于不同的地理区域或它们之间的网络延迟很高,该值可能会增加。

有关演示,请参阅此使用 Docker Compose 的示例

使用 Redis 启用警报高可用性

作为 Memberlist 的替代方案,您可以使用 Redis 实现高可用性。如果您希望使用中央数据库进行高可用性,并且无法支持所有 Grafana 服务器的网状连接,这将非常有用。

  1. 请确保您有一个支持 pub/sub 的 Redis 服务器。如果您在 Redis 集群前面使用代理,请确保代理支持 pub/sub。
  2. 在您的自定义配置文件 ($WORKING_DIR/conf/custom.ini) 中,找到 [unified_alerting] 部分。
  3. ha_redis_address 设置为 Grafana 应连接的 Redis 服务器地址。
  4. 可选:如果 Redis 服务器上启用了认证,请使用 ha_redis_usernameha_redis_password 设置用户名和密码。
  5. 可选:如果您计划与多个 Grafana 实例共享 Redis 服务器,请将 ha_redis_prefix 设置为唯一值。
  6. 可选:将 ha_redis_tls_enabled 设置为 true,并配置相应的 ha_redis_tls_* 字段,以使用传输层安全性 (TLS) 保护 Grafana 和 Redis 之间的通信。
  7. [ha_advertise_address] 设置为 ha_advertise_address = "${POD_IP}:9094"。如果实例的 IP 地址不属于 RFC 6890 且没有默认路由,则需要此设置。

有关演示,请参阅此使用 Docker Compose 的示例

使用 Kubernetes 启用警报高可用性

  1. 您可以通过容器定义通过环境变量公开 Pod IP

    yaml
    env:
      - name: POD_IP
        valueFrom:
          fieldRef:
            fieldPath: status.podIP
  2. 将端口 9094 添加到 Grafana Deployment 中

    yaml
    ports:
      - name: grafana
        containerPort: 3000
        protocol: TCP
      - name: gossip-tcp
        containerPort: 9094
        protocol: TCP
      - name: gossip-udp
        containerPort: 9094
        protocol: UDP
  3. 将环境变量添加到 Grafana Deployment 中

    yaml
    env:
      - name: POD_IP
        valueFrom:
          fieldRef:
            fieldPath: status.podIP
  4. 创建一个无头服务,它返回 Pod IP 而非服务 IP,这是 ha_peers 所需要的

    yaml
    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
  5. 确保您的 grafana Deployment 具有与选择器匹配的标签,例如 app:grafana

  6. 添加到 grafana.ini 中

    bash
    [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=falseexecute_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_secondsPing 消息延迟的直方图。
alertmanager_cluster_pings_failures_total失败的 ping 总数。
alertmanager_peer_positionAlertmanager 实例认为自己持有的位置,它定义了其在集群中的角色。对等节点应从零开始按顺序编号。

您可以通过查询 alertmanager_cluster_membersalertmanager_peer_position 指标来确认警报高可用性设置中的 Grafana 实例数量。

请注意,这些警报高可用性指标通过 Grafana 的 /metrics 端点暴露,但不会自动收集或显示。如果您有连接到 Grafana 的 Prometheus 实例,请添加一个 scrape_config 来抓取 Grafana 指标,然后在 Explore 中查询这些指标。

yaml
- 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