跨地域部署
场景
两年后,业务扩展到全国。
用户分布:
- 华北:30%(北京、天津等)
- 华东:40%(上海、杭州等)
- 华南:30%(广州、深圳等)
问题:
- 南方用户访问北京服务器延迟高
- 跨运营商访问慢
- 单地域故障影响全国解决方案:多地域部署
架构设计
用户
│
▼
┌──────────────┐
│ 智能 DNS │
│ (GeoDNS) │
└──────┬───────┘
│
┌──────┼──────┬──────┐
▼ ▼ ▼ ▼
北京 上海 广州 (未来)
地域 地域 地域
每个地域包含:
- Nginx 负载均衡
- 应用服务器集群
- Redis 缓存
- MySQL 从库智能路由
GeoDNS 配置
# BIND 配置示例
$ORIGIN kuaiyizhi.cn.
; 华北用户 → 北京地域
beijing IN A 1.2.3.4
; 华东用户 → 上海地域
shanghai IN A 5.6.7.8
; 华南用户 → 广州地域
guangzhou IN A 9.10.11.12
; 使用 view 实现智能 DNS
view "north-china" {
match-clients { 1.0.0.0/8; 2.0.0.0/8; };
zone "api.kuaiyizhi.cn" {
type master;
file "beijing.zone";
};
};
view "east-china" {
match-clients { 5.0.0.0/8; 6.0.0.0/8; };
zone "api.kuaiyizhi.cn" {
type master;
file "shanghai.zone";
};
};应用层路由
def get_nearest_region():
"""获取最近的地域"""
# 根据客户端 IP 判断地域
client_ip = request.remote_addr
ip_region = get_ip_region(client_ip)
region_mapping = {
'beijing': '华北',
'shanghai': '华东',
'guangzhou': '华南'
}
return region_mapping.get(ip_region, 'beijing')数据同步
主从同步
北京(主) → 上海(从)
│
└→ 广州(从)
使用 MySQL GTID 实现自动同步缓存同步
def invalidate_cache_all_regions(key):
"""使所有地域的缓存失效"""
regions = ['beijing', 'shanghai', 'guangzhou']
for region in regions:
try:
region_redis = get_redis_connection(region)
region_redis.delete(key)
except Exception as e:
logging.error(f'Failed to invalidate cache in {region}: {e}')效果验证
优化前
全国用户访问北京服务器:
- 北京用户:20ms
- 上海用户:100ms
- 广州用户:150ms
- 平均延迟:90ms优化后
就近访问:
- 华北用户:20ms
- 华东用户:30ms
- 华南用户:25ms
- 平均延迟:25ms(提升 72%)本节小结
✅ 完成的工作:
- 实现了多地域部署
- 配置了智能 DNS
- 实现了数据同步
✅ 效果:
- 平均延迟降低 72%
- 用户体验提升
- 单地域故障不影响全国
🎯 下一步:多地数据如何保持一致?
