Prometheus Blackbox Exporter 如何在香港服务器监控跨境链路并自动触发流量切换?

Prometheus Blackbox Exporter 如何在香港服务器监控跨境链路并自动触发流量切换?

我在帮一位游戏客户调优跨境网络时,遇到了一件很棘手的事。他们主业务节点在香港,但大量玩家来自内地。白天延迟还行,一到晚上高峰,某些路由段 RTT 飙升到 300ms 以上,甚至偶尔丢包。但由于链路质量波动不可预知,传统 BGP 权重切换根本不够用。于是我开始思考:有没有办法用应用层监控实时掌握链路健康,并在关键时刻自动触发流量切换?

这个项目最终我们选用了 Prometheus + Blackbox Exporter + 自定义脚本方案,效果非常理想。这篇文章,我就复盘下完整落地过程,尤其是如何在香港服务器中精确监控多条跨境链路的质量,并实现基于告警的自动流量切换。

一、监控目标与场景背景

我们部署在香港的数据中心对接了三条链路:

链路名称 上联线路提供商 特点
ChinaNet 中国电信直连 稳定但晚高峰拥塞严重
CN2 电信 CN2 GIA 延迟低,但带宽较小
BGP MIX 混合运营商 BGP 性能波动较大,成本低

需求是:

  • 7×24 小时主动探测内地几个探测点(例如广州、上海、北京);
  • 探测维度包括 TCP 建连、HTTP 状态码、ICMP RTT;

一旦某条链路延迟或可达率不达标,需触发自动切换 default route 或更新上层 Anycast 策略。

二、部署 Prometheus + Blackbox Exporter 实现链路质量探测

2.1 Blackbox Exporter 安装

在香港的监控节点上,我们部署了 Blackbox Exporter 作为 HTTP/TCP/ICMP 多协议探测器:

docker run -d --name blackbox \
  -p 9115:9115 \
  -v /opt/blackbox/config.yml:/config/blackbox.yml \
  prom/blackbox-exporter:latest \
  --config.file=/config/blackbox.yml

示例配置 /opt/blackbox/config.yml

modules:
  http_2xx:
    prober: http
    timeout: 5s
    http:
      valid_http_versions: ["HTTP/1.1", "HTTP/2"]
      method: GET
      fail_if_ssl: false

  tcp_connect:
    prober: tcp
    timeout: 3s
    tcp:
      preferred_ip_protocol: "ip4"

  icmp_ping:
    prober: icmp
    timeout: 3s
    icmp:
      preferred_ip_protocol: "ip4"

2.2 Prometheus 配置探测任务

Prometheus 通过 blackbox 模块定时探测目标:

scrape_configs:
  - job_name: 'blackbox_icmp'
    metrics_path: /probe
    params:
      module: [icmp_ping]
    static_configs:
      - targets:
          - 1.1.1.1  # 内地测试点 1
          - 8.8.8.8  # 内地测试点 2
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - target_label: instance
        replacement: icmp-monitor
      - target_label: __address__
        replacement: 127.0.0.1:9115

  - job_name: 'blackbox_tcp'
    metrics_path: /probe
    params:
      module: [tcp_connect]
    static_configs:
      - targets:
          - my-cn2-probe.com:443
          - my-chinanet-probe.com:443

我们还设置了 Prometheus Alertmanager 联动,在探测失败时触发告警通知和自动切换逻辑。

三、链路切换的自动化脚本

关键在于“怎么让告警不是只发个通知,而是直接切换 default route”。

我采用了 Alertmanager webhook + Python 脚本 + ip route 命令组合完成流量自动切换。

3.1 告警规则

Prometheus 规则举例:

groups:
- name: link_quality_alerts
  rules:
    - alert: HighLatency_CN2
      expr: probe_duration_seconds{instance="icmp-monitor", target="my-cn2-probe.com"} > 0.3
      for: 1m
      labels:
        severity: critical
      annotations:
        summary: "CN2 延迟异常"

3.2 Alertmanager 配置 webhook 通知

receivers:
  - name: 'flow-switcher'
    webhook_configs:
      - url: 'http://127.0.0.1:9001/alert'

3.3 自动路由切换脚本(Python)

from flask import Flask, request
import subprocess

app = Flask(__name__)

@app.route('/alert', methods=['POST'])
def alertmanager_webhook():
    data = request.json
    alerts = data.get('alerts', [])
    for alert in alerts:
        if alert['labels']['alertname'] == "HighLatency_CN2":
            print("CN2 延迟高,切换到 ChinaNet")
            subprocess.call(["ip", "route", "replace", "default", "via", "192.168.1.1", "dev", "eth0"])  # ChinaNet 网关
    return 'ok'

app.run(port=9001)

实际部署中我们加了锁机制与状态反转检测,避免频繁抖动。

四、Grafana 可视化与运维效果

我们在 Grafana 上配置了跨境 RTT、TCP 探测成功率、HTTP 状态码比率等面板,可一目了然地看到各链路质量:

  • ICMP 丢包趋势图(分线路)
  • TCP 建连时间图(高峰期 spike 分析)
  • 链路切换历史记录(通过 Prometheus event log)

五、最终效果与优化建议

经过上线验证,方案具备以下优势:

  • 延迟可视化:提前预警高延迟链路,运维不再“靠感觉”;
  • 自动化切换:无需人工介入,5s 内自动切换上游,用户体验显著提升;
  • 模块灵活扩展:可扩展探测 POST 接口、TLS 握手耗时、指定源 IP 探测等高级用法;
  • 与 BGP 融合:后续我们计划与 BIRD 实现 BGP localpref 动态调整,实现更智能的路由重分布。

这次项目让我更深刻体会到:链路优化不仅仅是配置路由表那么简单,更需要将观测与控制闭环打通。Prometheus + Blackbox Exporter 提供了一个简洁但强大的解决方案,尤其适合部署在香港这种地理与网络位置关键的节点,帮助我们实现稳定的跨境链路保障。

如果你也在维护跨境链路的服务,不妨试试这个方案,或许能帮你从“被动救火”转向“实时预判、自动干预”。

未经允许不得转载:A5数据 » Prometheus Blackbox Exporter 如何在香港服务器监控跨境链路并自动触发流量切换?

相关文章

contact