
我们的主业务节点因电力故障导致的完全不可达,原本应当自动切换至香港备用节点的流量却依然打向已失联的主节点,直接造成了约26分钟的服务中断。这让我痛下决心,彻底重构了整套跨区域容灾切换机制。最终,我们选用了 BGP + Keepalived 的异地热备方案,并以香港高可用服务器作为切流锚点,实现了秒级内网健康探测与分钟级公网流量切换的闭环架构。本文将复盘我在该项目中的全流程部署细节,供读者实战参考。
一、问题背景:为什么传统BGP容灾不生效?
很多跨区域部署都会借助运营商支持的Anycast + BGP宣告策略,配合多地节点提高可用性。然而我们最初部署时犯了几个关键错误:
- 健康探测机制仅部署在本地(大陆)主节点;
- 香港备用节点虽然上线,但BGP宣告为被动模式,依赖人工干预;
- 缺少Keepalived这类轻量级的主备状态检测机制。
因此一旦主节点彻底宕机(而非服务异常),香港节点不会自动拉起 BGP,导致公网仍将流量导向失败节点。
二、解决方案架构概述
目标是:主节点不可达后,香港节点能自动接管流量,并在主节点恢复后自动回切。核心组件如下:
- BIRD / FRR:BGP 路由守护进程,香港与大陆节点分别维护对等BGP配置;
- Keepalived:利用 LVS Keepalived 对主节点可达性做周期性检测,结合 vrrp_script 控制路由宣告开关;
- 香港BGP服务器:向 ISP 宣告同一个 /24 的业务前缀;
- GRE隧道回源或分布式缓存:实现业务实际处理逻辑的不中断。
三、实操部署流程
1. 香港服务器网络基础配置
我们在香港裸金属服务器上使用以下环境:
- 系统版本:Debian 12
- 网络接口:ens3 对公网
- ISP已开通BGP会话权限
- 配置 BIRD 路由器:
apt install bird2 -y
编辑 /etc/bird/bird.conf:
router id 203.0.113.2;
protocol device {
scan time 10;
}
protocol kernel {
persist;
scan time 20;
import all;
export all;
}
protocol static {
route 198.51.100.0/24 via "lo";
}
protocol bgp isp_upstream {
local as 64501;
neighbor 203.0.113.1 as 64500;
import all;
export where proto = "static";
graceful restart on;
}
注意:static路由通过 Keepalived 控制是否添加,进而控制是否对 ISP 宣告业务前缀。
2. Keepalived 控制BGP宣告触发
安装 Keepalived:
apt install keepalived -y
配置 keepalived.conf:
vrrp_script chk_mainland {
script "/usr/local/bin/check_mainland.sh"
interval 5
timeout 2
fall 3
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface lo
virtual_router_id 51
priority 100
nopreempt
track_script {
chk_mainland
}
notify_master "/usr/local/bin/add_route.sh"
notify_backup "/usr/local/bin/del_route.sh"
}
check_mainland.sh 示例脚本(判断主节点是否可达):
#!/bin/bash
ping -c 1 -W 1 198.18.0.1 > /dev/null
if [ $? -eq 0 ]; then
exit 1
else
exit 0
fi
add_route.sh(上报BGP路由):
#!/bin/bash
ip route add 198.51.100.0/24 dev lo
del_route.sh(撤销BGP路由):
#!/bin/bash
ip route del 198.51.100.0/24 dev lo
3. 大陆节点的配套逻辑
大陆主节点仍保持BGP宣告和业务主处理逻辑,同时它也运行 Keepalived 检测自身健康并保持 BGP 宣告活跃。关键是在香港节点的 chk_mainland.sh 中指定大陆主节点公网 IP 是否可达作为切换标准。
四、跨境GRE回源与数据同步建议
在业务后端仍集中于大陆IDC的场景下,我们建议香港节点搭建 GRE/IPIP 隧道,将流量转发至实际后端。同时启用本地 Redis/NGINX 缓存,可缓解网络抖动影响。
例如:
ip tunnel add gre1 mode gre remote 198.18.0.1 local 203.0.113.2 ttl 255
ip link set gre1 up
ip addr add 10.10.10.2/30 dev gre1
ip route add 192.168.0.0/16 dev gre1
五、测试与验证流程
业务全量走大陆主节点,确认正常;
- 断开主节点电源或BGP会话;
- Keepalived自动触发香港节点添加lo路由,BIRD宣告生效;
- 运营商收敛时间内(约20~45秒)切流至香港节点;
- 恢复主节点电源后,香港节点检测到可达,撤销宣告;
- 主节点重新接管业务流量。
六、故障演练与建议
- BGP宣告配置建议使用Graceful Restart与Hold Timer精调,防止抖动;
- Keepalived检测建议基于ping + curl双重确认,提升判断准确性;
- 宣告的业务前缀应为 /24,避免路由器忽略;
- 多香港节点建议引入 BGP Community 分权策略,防止同时宣告。
通过在香港节点部署 Keepalived + BIRD,并结合大陆主节点健康探测机制,我们构建了一套低依赖、成本可控、宣告可收敛的异地容灾方案。它既可实现秒级主备检测,又能与公网BGP宣告机制融合,确保业务在公网范围内具备真正意义上的可用性切换能力。对于依赖大陆IDC服务的互联网企业而言,这是目前较为可行的一种半自动化BGP容灾链路优化方案。











