
我在帮一位游戏客户调优跨境网络时,遇到了一件很棘手的事。他们主业务节点在香港,但大量玩家来自内地。白天延迟还行,一到晚上高峰,某些路由段 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 提供了一个简洁但强大的解决方案,尤其适合部署在香港这种地理与网络位置关键的节点,帮助我们实现稳定的跨境链路保障。
如果你也在维护跨境链路的服务,不妨试试这个方案,或许能帮你从“被动救火”转向“实时预判、自动干预”。











