
我们团队在为一家大型直播平台提供跨境服务时遇到了严重的中断事故。昨天晚上,中国大陆源站所在 IDC 出现长时间断网,导致北美和东南亚观众无法加载直播内容。虽然香港节点早已部署 CDN,但由于缺乏智能回源策略,仍然绑定在大陆主源站,完全失去了备份作用。这次事故让我痛定思痛,决定设计一套具备断网自感知能力和自动源切换机制的架构,让香港 CDN 节点在大陆断网时秒级切换回源路径,最大程度保障直播可用性。
以下是我实操落地的完整方案。
一、架构目标与总体设计
目标
主源站设在中国大陆
- 香港部署边缘 CDN 节点,并可作为主备双向回源网关
- 一旦海外与大陆连接断网,香港 CDN 自动切换至香港本地备份源
- 切换过程不依赖人工介入,需具备健康探测 + 回源优先级策略
架构概览图:
海外观众
│
全球CDN
│
香港边缘节点
┌───────────────┐
│ 主源:大陆源站 │ ← 默认优先
│ 备源:香港备份 │ ← 异常切换
└───────────────┘
│
内容回源
二、核心组件选型
| 组件 | 作用 | 部署位置 |
|---|---|---|
| Nginx + Lua模块 | 回源调度逻辑(基于探测) | 香港CDN边缘节点 |
| Keepalived(非必须) | 可用于内部IP漂移,但非关键 | 香港节点间 |
| 主/备源静态同步工具(rsync 或 Rclone) | 将大陆主源内容同步至香港 | 大陆源站 & 香港备份源 |
| 健康检查模块 | 周期性检查大陆源的连通性 | 集成于Nginx或独立探针 |
三、实现步骤详解
步骤一:构建主备源结构
大陆主源站:通过公网或专线暴露RTMP/HLS/FLV接口,设为香港CDN的默认回源目标。
香港备份源:使用rsync每日或每分钟同步主源内容,并缓存热播内容,确保接近实时。
# 每分钟增量同步(示例)
rsync -az --delete /data/hls/ user@hk-backup:/data/hls/
步骤二:实现自定义健康探测机制
我们没有采用传统的TCP端口探测,而是使用内容级探测判断大陆源是否可用:
# Nginx Lua 健康探测示例配置(简化)
init_by_lua_block {
upstream_status = "ok"
}
location /probe {
content_by_lua_block {
local res = ngx.location.capture("/__origin_check")
if res.status ~= 200 then
upstream_status = "fail"
else
upstream_status = "ok"
end
ngx.say("status: ", upstream_status)
}
}
location /__origin_check {
internal;
proxy_pass http://mainland_origin/healthcheck.ts;
proxy_connect_timeout 1s;
proxy_read_timeout 1s;
}
并结合定时任务,每5秒进行探测更新状态。
步骤三:实现动态回源切换逻辑
基于探测结果,在CDN回源逻辑中自动选择主/备源:
upstream origin_pool {
server mainland.origin.com:80 max_fails=1 fail_timeout=2s;
server hk-backup.origin.com:80 backup;
}
location /hls/ {
set $target_origin "";
access_by_lua_block {
if upstream_status == "ok" then
ngx.var.target_origin = "mainland.origin.com"
else
ngx.var.target_origin = "hk-backup.origin.com"
end
}
proxy_pass http://$target_origin;
}
如果Lua动态变量不支持动态proxy_pass,可通过rewrite跳转或借助OpenResty + consistent_hash + Lua模块处理。
步骤四:加速静态内容预热与缓存
为保障切换后首帧加载速度,香港备源需保持对热点直播切片的预热机制,可结合以下方式:
定时抓取主源 m3u8 并触发 .ts 下载
缓存到本地并由CDN提供服务
使用 curl + cron 脚本:
curl -s http://mainland.origin.com/live/room1.m3u8 | \
grep .ts | xargs -n1 -I{} curl -s -o /dev/null http://mainland.origin.com/live/{}
四、测试与验证
我通过以下手段确保方案的稳定性:
- 人为断开大陆出口,验证海外是否成功切回香港源
- 多地测速 HLS 播放首帧时延是否维持稳定
- 香港节点监控自动切回大陆主源后的冷却恢复机制
冷却恢复策略示例:
upstream origin_pool {
server mainland.origin.com:80 max_fails=1 fail_timeout=2s;
server hk-backup.origin.com:80 backup;
}
location /hls/ {
set $target_origin "";
access_by_lua_block {
if upstream_status == "ok" then
ngx.var.target_origin = "mainland.origin.com"
else
ngx.var.target_origin = "hk-backup.origin.com"
end
}
proxy_pass http://$target_origin;
}
五、扩展建议与容灾优化
- 双香港节点热备:如香港有多个节点,可加入Keepalived实现备节点故障漂移。
- 支持RTMP回源切换:若为RTMP直播流,可结合Nginx-RTMP模块的pull配置动态切源。
- 跨境BGP优化:避免切换时仍走回大陆公网丢包链路,可利用多ISP + BGP智能路由。
通过在香港CDN节点实现主备回源结构、健康探测、智能切换和内容预热,我们有效解决了大陆源站断网后海外直播“黑屏”的问题。整个方案的关键在于边缘节点自治能力,不依赖中心指令即可判断并切换最优回源路径,适合部署在高度可用性要求的跨境直播架构中。
这次实践也让我意识到,高可用不是用昂贵设备堆砌出来的,而是每一个细节机制上主动设计出来的。











