导航菜单

跨地域部署

场景

两年后,业务扩展到全国。

用户分布:
- 华北: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%
  • 用户体验提升
  • 单地域故障不影响全国

🎯 下一步:多地数据如何保持一致?

搜索