Skip to content
Charles Shao
Go back

数据中心选型:全球枢纽、云区域与广告流量部署

views

全球化业务选数据中心,本质上是一次可用性决策,而不只是「哪家云便宜」:机房选在哪,直接决定了用户离服务有多远、机房级故障发生时有没有邻近节点能接住流量。它是广告服务上云实战的自然延伸——把竞价服务送上云之后,下一个问题就是「云该开在哪几个区域」;也和冗余与容灾依赖韧性讨论的是同一类问题:如何让系统在故障和流量波动下仍然可用,只是这里的变量换成了地理覆盖范围、网络枢纽层级、海底电缆登陆点与云区域可用性。本篇面向广告类全球化业务,系统梳理地区划分、Tier 枢纽、云区域能力与实际请求分布,最终给出新加坡 + 弗吉尼亚为主、法兰克福为辅的部署建议,并附双活同步架构示意;落地时机房布局还要与冗余与容灾中的同城/异地多活选型一起看,才是完整的可用性方案。

TL;DR

Table of contents

Open Table of contents

1. 全球主要地区(关键市场速览)

全球地区划分是数据中心选型的地理坐标系。以下只列出后文流量分析与部署建议会直接用到的关键市场;其余国家可按 ISO 3166-1 标准查询,不逐一列出,以免表格喧宾夺主。

1.1 美洲(Americas)

国家/地区英文名称ISO代码子地区
美国United StatesUS北美
加拿大CanadaCA北美
墨西哥MexicoMX北美/中美
巴西BrazilBR南美

中美洲与加勒比(哥斯达黎加、巴拿马等)、南美其余国家(阿根廷、智利、哥伦比亚等)广告流量占比均个位数,多依赖美国或巴西节点中转,选型时按整体区域看待即可。

1.2 欧洲(Europe)

国家/地区英文名称ISO代码子地区
英国United KingdomGB西欧
德国GermanyDE西欧
法国FranceFR西欧
俄罗斯RussiaRU东欧

北欧(瑞典、挪威、芬兰)、南欧(意大利、西班牙、葡萄牙)与东欧其余国家(波兰、乌克兰、保加利亚等),流量规模较小,一般靠法兰克福/阿姆斯特丹枢纽统一覆盖,不需要单独设点。

1.3 亚太(Asia-Pacific)

国家/地区英文名称ISO代码子地区
中国ChinaCN东亚
日本JapanJP东亚
新加坡SingaporeSG东南亚
印度IndiaIN南亚
印度尼西亚IndonesiaID东南亚
澳大利亚AustraliaAU大洋洲

韩国、马来西亚、泰国、菲律宾、越南、巴基斯坦、孟加拉国等东南亚/南亚市场,及新西兰,多依赖新加坡或孟买节点覆盖,具体流量占比见 §4。

1.4 中东与非洲(MEA)

国家/地区英文名称ISO代码
沙特阿拉伯Saudi ArabiaSA
阿联酋United Arab EmiratesAE
南非South AfricaZA
尼日利亚NigeriaNG

以色列、土耳其、埃及、肯尼亚等中东/非洲其余国家流量占比小,通常依赖迪拜或南非开普敦节点中转。中国香港作为国际互联网出口枢纽在 §2.1 单独讨论;其余地区(澳门、台湾等)可按 ISO 3166-1 查询。

:ISO 国家代码遵循国际标准化组织(ISO 3166-1)标准;台湾地区的政治地位存在争议,此处不代表政治立场。

2. 全球网络枢纽

全球网络枢纽分层:Tier 1 顶级枢纽、Tier 2 新兴市场、Tier 3 边缘与 CDN 覆盖 Tier 1 顶级枢纽、Tier 2 新兴市场、Tier 3 边缘与 CDN 覆盖。

2.1 Tier 1:顶级枢纽

北美

城市国家核心优势主要数据中心/交换点
硅谷(San Jose)美国(US)全球科技中心,AWS/GCP核心节点Equinix SV1, Digital Realty
弗吉尼亚(Ashburn)美国(US)AWS东部核心,全球最大数据中心集群AWS us-east-1, LINX NoVA
洛杉矶(Los Angeles)美国(US)跨太平洋电缆主要登陆点One Wilshire, CoreSite LA

欧洲

城市国家核心优势主要数据中心/交换点
法兰克福(Frankfurt)德国(DE)欧洲最大互联网交换点(DE-CIX)AWS eu-central-1, Interxion
伦敦(London)英国(GB)金融科技中心,AWS/Azure节点LINX London, Telehouse
阿姆斯特丹(Amsterdam)荷兰(NL)AMS-IX(全球最大IXP之一)AMS-IX, Equinix AM3

亚太

城市国家核心优势主要数据中心/交换点
新加坡(Singapore)新加坡(SG)东南亚网络中心,AWS/Azure/阿里云区域Equinix SG1, Digital Realty
香港(Hong Kong)中国(HK)中国国际互联网主要出口HKIX, AWS ap-east-1
东京(Tokyo)日本(JP)亚洲金融科技中心,NTT/KDDI骨干网AWS ap-northeast-1, Equinix TY2

2.2 Tier 2:新兴枢纽

东南亚

城市国家核心优势主要数据中心/交换点
雅加达(Jakarta)印尼(ID)东南亚增长最快的市场Google Cloud Jakarta, Biznet
曼谷(Bangkok)泰国(TH)连接中南半岛的关键节点AWS Local Zone
吉隆坡(Kuala Lumpur)马来西亚(MY)新加坡的备用枢纽AIMS Data Centre

南亚

城市国家核心优势主要数据中心/交换点
孟买(Mumbai)印度(IN)AWS/Azure印度核心节点AWS ap-south-1, GPX Mumbai
海得拉巴(Hyderabad)印度(IN)微软Azure印度南部节点Microsoft Azure数据中心

南美

城市国家核心优势主要数据中心/交换点
圣保罗(São Paulo)巴西(BR)AWS南美唯一区域AWS sa-east-1, Equinix SP2

中东

城市国家核心优势主要数据中心/交换点
迪拜(Dubai)阿联酋(AE)AWS中东核心AWS me-south-1, Khazna Data Centers

2.3 Tier 3:边缘与 CDN 覆盖

区域代表城市主要用途
非洲约翰内斯堡(ZA)AWS非洲唯一区域
大洋洲悉尼(AU)AWS亚太(悉尼)
东欧华沙(PL)Azure东欧节点

2.4 全球海底电缆

海底电缆承载了全球 99% 的国际互联网流量,是连接各大洲的核心基础设施。以下列出主要电缆节点及其对延迟与业务部署的影响。

2.4.1 核心海底电缆节点

跨太平洋(美↔亚)关键节点

电缆名称连接路径延迟(典型值)业务影响
NCP(新跨太平洋)美国洛杉矶(US)→日本千叶(JP)60-70ms(美西→东京)中美日低延迟主干道
PLCN(太平洋光缆)洛杉矶(US)→香港(HK)110-120ms(美西→香港)亚洲金融数据主要通道
FASTER美国俄勒冈(US)→日本千叶(JP)→台湾(TW)85ms(美西→东京)Google、Facebook 主力电缆

跨大西洋(美↔欧)关键节点

电缆名称连接路径延迟(典型值)业务影响
MAREA美国弗吉尼亚(US)→西班牙毕尔巴鄂(ES)60ms(美东→欧洲)全球最低延迟美欧直连
AEC-2(大西洋快线)纽约(US)→英国伦敦(GB)65ms(美东→伦敦)金融交易关键路径
Dunant美国弗吉尼亚(US)→法国圣纳泽尔(FR)55ms(Google专用)云服务优化

亚欧(新↔欧)关键节点

电缆名称连接路径延迟(典型值)业务影响
SEA-ME-WE 6新加坡(SG)→法国马赛(FR)150ms(新→法)东南亚→欧洲主通道
Asia-Africa-Europe-1 (AAE-1)香港(HK)→新加坡(SG)→埃及(EG)→法国(FR)180ms(香港→巴黎)亚非欧三洲互联
FLAG Europe-Asia (FEA)英国(GB)→印度(IN)→新加坡(SG)120ms(伦敦→新加坡)欧洲→南亚关键路径

2.4.2 新兴区域海底电缆

东南亚区域互联

电缆名称连接路径延迟(典型值)业务影响
APG(亚太网关)中国大陆(CN)→香港(HK)→新加坡(SG)→马来西亚(MY)25ms(香港→新加坡)中国出海主要通道
SJC2日本(JP)→新加坡(SG)→泰国(TH)→越南(VN)40ms(东京→新加坡)日韩企业东南亚业务

南美互联

电缆名称连接路径延迟(典型值)业务影响
SACS(南大西洋电缆)巴西(BR)→安哥拉(AO)→葡萄牙(PT)160ms(圣保罗→里斯本)南美→欧洲新通道
Monet美国佛罗里达(US)→巴西(BR)100ms(迈阿密→圣保罗)美国→南美低延迟

非洲互联

电缆名称连接路径延迟(典型值)业务影响
2Africa南非(ZA)→肯尼亚(KE)→尼日利亚(NG)→欧洲(FR)120ms(约翰内斯堡→马赛)非洲最长海底电缆
WACS(西非电缆系统)英国(GB)→南非(ZA)→尼日利亚(NG)140ms(伦敦→拉各斯)非洲互联网主要入口

3. 主流云厂商区域布局

:本节所有「区域数 / 可用区数」均为参考值,云厂商持续新建区域,数字会随时间变化——选型时应以厂商官方的 Global Infrastructure 页面为准,这里只用来做量级对比,不作为精确依据。

3.1 AWS

全球覆盖最广,区域遍布六大洲

3.1.1 核心区域

区域名称覆盖国家/城市关键优势
us-east-1美国弗吉尼亚(Ashburn)AWS全球核心,服务最全,延迟最低
ap-southeast-1新加坡东南亚流量枢纽,合规性支持完善
eu-central-1德国法兰克福欧洲最大节点,GDPR合规

3.1.2 新兴市场

区域名称覆盖国家/城市特点
ap-south-1印度孟买本地化政策支持,成本比新加坡低约30%
me-south-1阿联酋迪拜覆盖中东核心市场
af-south-1南非开普敦覆盖非洲市场

3.1.3 扩展计划

3.2 阿里云

30 个区域,89 个可用区

3.2.1 核心区域

区域名称覆盖国家/城市关键优势
cn-hangzhou中国杭州阿里云总部,服务最全
ap-southeast-1新加坡亚太国际业务核心
eu-central-1德国法兰克福欧洲主要节点,GDPR合规

3.2.2 新兴市场

区域名称覆盖国家/城市特点
ap-south-1印度孟买中国出海企业常见选择
me-east-1阿联酋迪拜中东唯一节点
us-west-1美国硅谷中美间低延迟(依赖 PLCN 电缆)

3.2.3 中国区特殊性

3.3 华为云

全球覆盖:30+ 区域,70+ 可用区

区域类型代表区域核心优势适用场景
Tier 1中国-北京/上海中国本土合规(等保2.0/GDPR)政府、金融、国企项目
新加坡东南亚低延迟,支持多语言服务出海中国企业
德国-法兰克福欧洲GDPR合规,华为5G网络集成汽车制造、工业物联网
Tier 2泰国-曼谷本地化数据中心(与TrueIDC合作)游戏、电商
墨西哥-墨西哥城拉美节点制造业数据本地化
沙特-利雅得中东合规性支持石油能源行业

特点

3.4 Linode

全球覆盖:11 个区域(聚焦欧美)

区域城市/国家核心优势适用场景
北美纽约、达拉斯低价SSD VPS个人开发者、初创公司
欧洲伦敦、法兰克福欧洲用户低延迟中小型Web应用
亚太新加坡、东京仅2个亚洲节点,覆盖有限轻量级亚太业务

特点

3.5 云厂商横向对比

厂商区域数量定价策略最佳场景主要短板
AWS24区域按需付费(复杂)全球化企业、高可用架构新兴市场成本高
Azure60+区域企业协议折扣Windows生态、混合云非Windows服务体验一般
GCP39区域持续使用折扣AI/大数据分析文档和支持响应慢
阿里云30区域中国区低价出海中国企业、伊斯兰合规国际网络抖动频繁
腾讯云27区域游戏/社交专项优惠游戏、直播、社交应用非中国区生态弱
华为云30区域政府/大客户定制价5G+工业互联网、中国合规美国市场不可用
Linode11区域固定低价VPS个人项目、测试环境无容灾、无企业级功能

4. 广告流量的国家与地区分布

示例日流量请求总数:300 亿。

国家(中文)ISO所属地区广告请求数(亿)请求占比人口(亿)枢纽等级理由
印度IN南亚87.4727.74%14.28T2本地化需求强,但依赖孟买节点
美国US北美52.0916.52%3.39T1全球核心枢纽(硅谷/弗吉尼亚)
印度尼西亚ID东南亚25.838.19%2.78T2雅加达节点覆盖
巴西BR南美17.065.41%2.15T2南美唯一AWS区域(圣保罗)
菲律宾PH东南亚15.654.96%1.16T3依赖新加坡节点
俄罗斯RU东欧13.514.28%1.43T3国际云服务受限,本地IDC为主
英国GB西欧9.853.12%0.68T1伦敦枢纽(AWS eu-west-2)
泰国TH东南亚9.453.00%0.70T2曼谷边缘节点覆盖
马来西亚MY东南亚7.902.51%0.34T2吉隆坡次级枢纽
巴基斯坦PK南亚7.482.37%2.41T3无本地节点,依赖印度孟买
越南VN东南亚7.232.29%0.99T3依赖新加坡/香港节点
墨西哥MX北美6.131.94%1.28T2美国德州节点覆盖
沙特阿拉伯SA中东5.401.71%0.36T2迪拜节点覆盖
加拿大CA北美4.701.49%0.38T1蒙特利尔AWS区域
韩国KR东亚3.581.14%0.52T1首尔核心枢纽(AWS ap-northeast-2)
法国FR西欧1.780.56%0.68T1巴黎AWS区域(eu-west-3)
新加坡SG东南亚1.690.54%0.06T1亚太核心枢纽——本地流量占比极低,入选靠的是网络拓扑而非本地人口
德国DE西欧1.300.41%0.84T1法兰克福核心枢纽(AWS eu-central-1)

其余尼日利亚、秘鲁、孟加拉国、西班牙、意大利、日本、哥伦比亚、保加利亚、匈牙利、荷兰、奥地利、捷克等约 12 个国家,合计约占 7% 的请求量,均为 T2/T3 市场,请求量分散、单国占比不足 1.1%,通过所属地区最近的枢纽或 CDN 边缘节点覆盖即可,不必单独设点,故不再逐一列出。

广告请求国家分布 Top 5:印度 27.7%、美国 16.5%、印尼 8.2%、巴西 5.4%、菲律宾 5.0% 广告请求高度集中:印度、美国等 Top 国家占大头。

5. 部署选型:新加坡 + 弗吉尼亚

广告业务数据中心选型:弗吉尼亚为主、新加坡为亚太枢纽、法兰克福为欧洲备选,SG+VA 覆盖约 46% 请求 VA 主美洲、SG 亚太枢纽、法兰克福欧洲备选;SG+VA 约覆盖一半请求。

一句话:广告全球化部署优先 弗吉尼亚 + 新加坡,欧洲流量起来再加重 法兰克福

根据全球广告请求分布、网络延迟优化、成本效益及云服务商区域覆盖能力,最适合部署的两个主节点为

5.1 新加坡(Singapore)

AWS ap-southeast-1 / Azure Southeast Asia

核心优势

适用场景

5.2 美国弗吉尼亚(Virginia)

AWS us-east-1 / Azure East US

核心优势

适用场景

5.3 备选:法兰克福(Frankfurt)

AWS eu-central-1

核心优势

适用场景

5.4 为什么选 SG + VA

  1. 流量覆盖最大化:新加坡 + 弗吉尼亚可覆盖超 46% 的全球广告请求(亚太 + 美洲核心市场);剩余地区(如欧洲、非洲)可通过 CDN 或边缘节点补充。
  2. 延迟与成本最优:新加坡亚太延迟最低、成本低于欧美;弗吉尼亚美洲延迟最低、资源定价最优。
  3. 架构互补:新加坡专注高增长新兴市场,弗吉尼亚服务成熟高价值市场;两者通过跨洋电缆(MAREA、PLCN 等)互联,延迟可控(约 150–200ms)。

5.5 备选调整方案

5.6 部署策略

此组合在性能、成本、覆盖率三个维度上达到最佳平衡,适合 90% 以上的全球化广告业务需求。

5.7 最终建议

数据中心核心覆盖扩展覆盖关键能力
新加坡东南亚、南亚、中东澳大利亚低延迟、新兴市场合规
弗吉尼亚北美、南美欧洲(备份)全球最低成本、高可用性
法兰克福欧洲、中东、非洲俄罗斯(边缘)GDPR合规、金融级稳定性

此组合实现全球覆盖、低延迟、成本可控三重目标,适合广告、电商、游戏等全球化业务。

6. 分配表示例:新加坡 + 硅谷(US-West 变体)

一句话:主推方案是 §5 的 SG + VA(弗吉尼亚,US-East / us-east-1);本节的「新加坡 + 硅谷」是同一双活骨架的 US-West 变体,仅换了美洲落点,用来演示逐国路由分配。

先把两个容易混淆的美国落点讲清楚——它们都是 Tier 1,但覆盖侧重不同:

美洲落点云区域覆盖侧重相对成本选择理由
弗吉尼亚(US-East)AWS us-east-1美东 + 南美 + 跨大西洋到欧洲(MAREA/Dunant)基准(最低)服务最全、到欧洲/南美延迟最优,默认主节点
硅谷 / 俄勒冈(US-West)AWS us-west-1(硅谷)/ us-west-2(俄勒冈)美西 + 跨太平洋到亚洲(NCP/PLCN/FASTER)us-west-2 比 us-east-1 略低业务重心在美西、或需与新加坡走更短的太平洋链路时

取舍规则:默认选弗吉尼亚(覆盖面和到欧洲/南美的延迟都更优);只有当美洲流量集中在西海岸、或希望缩短「美洲 ↔ 新加坡」跨太平洋同步延迟时,才把美洲落点换成硅谷/俄勒冈。俄勒冈(us-west-2)比硅谷(us-west-1)价格更低、可用区更多,成本敏感时优先俄勒冈。下表以硅谷为例演示逐国路由(换成弗吉尼亚时,美西 10–30ms 对应改为美东,欧洲/南美延迟更低):

国家/地区(中文)国家/地区(英文)ISO地区分配数据中心平均延迟(ms)关键说明
印度IndiaIN南亚新加坡60-80孟买→新加坡直连(SEA-ME-WE电缆)
美国United StatesUS北美硅谷10-30(西海岸)本土超低延迟
印度尼西亚IndonesiaID东南亚新加坡40-60雅加达→新加坡(APG电缆)
马来西亚MalaysiaMY东南亚新加坡5-15吉隆坡与新加坡同属骨干网,区域内延迟最低
巴西BrazilBR南美硅谷160-180圣保罗→硅谷(经洛杉矶)
英国United KingdomGB西欧硅谷120-140伦敦→硅谷(跨大西洋+北美骨干网)
沙特阿拉伯Saudi ArabiaSA中东新加坡120-150迪拜→新加坡(优于迪拜→硅谷)
日本JapanJP东亚硅谷60-80东京→硅谷(NCP/FASTER电缆),比就近接入新加坡更优
尼日利亚NigeriaNG西非硅谷220-250拉各斯→硅谷(经欧洲或南非迂回),双活覆盖不到的典型盲区

菲律宾、泰国、巴基斯坦、越南等东南亚/南亚国家的路由模式与印尼/马来西亚一致——就近接入新加坡;墨西哥、加拿大与美国同属一组,就近接入硅谷;法国、德国、俄罗斯、韩国的路由模式与英国/日本类似(跨洋 + 骨干网接入硅谷),延迟量级相近,不再逐条列出。

graph TD
    A[用户请求-亚洲] -->|写入| B[新加坡主库]
    A -->|读取| C[新加坡缓存]
    D[用户请求-美洲] -->|写入| E[硅谷主库]
    D -->|读取| F[硅谷缓存]
    B -->|实时同步| E
    C -->|异步同步| F
    G[监控系统] -->|校验| B
    G -->|校验| E

下图与上方 Mermaid 对应,展示亚洲读写新加坡、美洲读写硅谷及双活同步关系:

新加坡 + 硅谷双活同步:亚洲写入/读取新加坡,美洲写入/读取硅谷,主库实时同步、缓存异步同步 亚洲读写新加坡、美洲读写硅谷;主库实时同步,缓存可异步。

7. 区域延迟 → 竞价业务映射(RTT vs tmax)

前几节的延迟都是「网络指标」;对广告业务,真正要回答的是这个延迟能不能在竞价窗口内完成一次出价。RTB 里,交易所(SSP/Exchange)给每个竞价请求一个 tmax(典型 100–120ms),DSP 必须在这个时间内返回出价,否则被判超时、当作 no-bid 丢弃。

关键换算:

DSP 有效计算预算 = tmax − 2 × RTT(Exchange ↔ DSP 节点) − 序列化/排队开销

也就是说,区域 RTT 会先从 tmax 里扣掉往返两趟,剩下的才是留给特征查询 + 模型打分的时间。RTT 越大,计算窗口越窄;一旦 2 × RTT 逼近甚至超过 tmax,出价在发出的那一刻就注定超时——这本质上就是依赖韧性里「调用链超时预算」的地理版:每一跳的 RTT 都在消耗全局 deadline,剩余预算不足就该主动放弃(no-bid),而不是发一个注定被丢的请求白烧 QPS。

tmax = 120ms、DSP 计算约需 30ms 为例:

Exchange 所在区DSP 最近节点单程 RTT往返占用 (2×RTT)剩余计算窗口决策
美东弗吉尼亚5–10ms10–20ms~100ms就近可竞价,预算充裕
印尼/菲律宾新加坡40–60ms80–120ms0–40ms勉强,需压缩处理耗时或就近边缘
印度新加坡60–80ms120–160ms≤0ms(已超 tmax)远程必超时 → 就近部署或 no-bid
巴西弗吉尼亚100–120ms200–240ms远超 tmax就近圣保罗节点,否则 no-bid

竞价延迟预算:tmax=120ms 下,2×RTT 先扣预算,剩余才是计算窗口;印度/巴西远程接入会把窗口吃穿 2×RTT 越过 tmax 红线,出价发出即注定超时——就近部署或 no-bid。

一句话:延迟不是「越低越好」的美观指标,而是竞价可达性的硬门槛——RTT 把 tmax 吃穿,就近部署或 no-bid,二选一。

7.1 印度:孟买何时从「就近边缘」升级为「主竞价节点」

印度贡献 27.74% 的请求,是全篇最大的单一市场,但 §5 把它放在「通过新加坡覆盖」的位置。上面的换算解释了为什么这不能一直成立:印度用户/交易所到新加坡的单程 RTT 约 60–80ms,往返就吃掉 120–160ms,在 tmax=100~120ms竞价窗口已经归零。当满足以下任一条件时,孟买(AWS ap-south-1)就应从「就近 CDN 边缘 / 日志回传点」升级为主竞价节点

升级后印度请求就近落 ap-south-1,RTT 降到个位数~20ms,竞价窗口恢复;孟买到新加坡再走区域内低延迟链路做状态同步。判断准则和 §7 一致:先看 RTT 是否吃穿 tmax,再看合规是否强制本地——两者任一成立即升级,不要等超时率恶化才被动扩区。

8. 跨区部署的成本模型

多活不是「多开几个区域」这么简单——每加一个活跃区,成本沿复制 egress、双活带宽、存储冗余、区域实例价差四条线同时增长。选型时要把「覆盖率」和「成本」放在同一张表上看,而不是只追覆盖。

8.1 成本构成粗算

假设双活各承载一半流量,跨区需要持续复制的是状态流(预算计数、频控计数、用户画像增量),而非原始曝光日志(原始日志就近落盘、就近计算,不跨区搬)。设状态流约 2 TB/天 ≈ 60 TB/月:

成本项计算口径双活(SG + VA)月粗算说明
跨区复制 egress60 TB × ~$0.06/GB~$3,600云厂商跨区出流量按 GB 计费,亚太↔美东单价偏高;只复制状态流
双活同步带宽/专线Direct Connect 端口 + 流量~$2,000稳定同步链路优于走公网,延迟抖动更小
存储冗余热状态 ×2 副本基准 ×2每多一个活跃区,热状态存储近似线性增长
区域实例价差SG ≈ VA × 1.2新加坡侧 +~20%ap-southeast-1 EC2 比 us-east-1 贵约 20%;us-west-2 ≈ us-east-1;ap-south-1 更低

一句话:跨区成本的大头不是多买的实例,而是持续的复制 egress 和被 ×N 的冗余存储——原始日志就近处理、只跨区复制「必须一致的状态」,是控成本的第一原则。

8.2 覆盖率 vs 成本的取舍

覆盖率的边际收益是递减的,而复制成本往往是超线性的:

因此除非欧洲流量显著上涨GDPR 要求 EU 数据必须落欧洲区(见 §9),否则不轻易上第三活——多数广告业务在「两点覆盖 46% + CDN 边缘补齐长尾」的组合下,性价比明显优于强行三活/四活。这与冗余与容灾的结论一致:多活层级要按 RPO/RTO 目标和成本约束来定,不是越多越好。

9. 数据驻留与隐私合规

前面所有选型都是延迟/成本驱动的;但在越来越多的市场,合规是先于延迟的硬约束——法律规定某类数据必须留在境内,就算隔壁区延迟更低、成本更省,也不能把数据搬过去。合规因此会反向约束机房/区域选型。

法规 / 市场核心要求对选型的约束
GDPR(欧盟)个人数据跨境传输需「充分性认定」或 SCC;用户画像需合法依据EU 用户 PII 不能随手复制到 VA/SG;须在法兰克福等欧盟境内区处理与存储
印度 DPDP Act 2023敏感个人数据本地化倾向,跨境受限印度用户数据倾向落 ap-south-1(孟买),强化 §7.1 的孟买升级理由
俄罗斯 242-FZ俄罗斯公民个人数据必须存储在境内服务器国际云在俄受限(见 §4 RU 占 4.28%)→ 只能走本地 IDC,无法并入 SG/VA 双活
中国 PIPL / 网络安全法数据本地化 + 出境安全评估国内业务走独立备案的中国区,与国际区隔离(见 §3.2.3)

consent(同意)分区是 AdTech 特有的一层:在 GDPR 区,用户未通过 CMP(如 IAB TCF v2.2)授予个性化广告同意时,请求不能进入画像/定向/频控画像管道,只能走非个性化(contextual)链路。工程上意味着:

一句话:延迟决定「最好放哪」,合规决定「不许放哪」——两者冲突时,合规优先,这也是「延迟最低点」未必是「合法落点」的根本原因。

10. GSLB / DNS 地理路由与区域路由(配置与伪代码)

把 §7(延迟)和 §9(合规)落到工程上,靠的是几层配合:入口的 GSLB/DNS 路由决定请求进哪个区(§10.1),区域路由决定用户读写落哪个区(§10.2),跨区数据库复制 + 状态一致性策略决定数据怎么放、怎么同步(§10.3–10.5),健康检查 + failover在机房级故障时把流量切走(§10.6)。以下均以 SG + VA 双活为例给出可直接参照的配置与伪代码。

10.1 DNS:延迟路由(性能) + 地理路由(合规兜底)

以 AWS Route 53 为例。默认用 latency-based routing 把用户解析到延迟最低的节点:

{
  "Comment": "latency-based routing for bid.example-dsp.com",
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "bid.example-dsp.com",
        "Type": "A",
        "SetIdentifier": "sg",
        "Region": "ap-southeast-1",
        "AliasTarget": {
          "HostedZoneId": "Z_SG_NLB",
          "DNSName": "sg-nlb.ap-southeast-1.elb.amazonaws.com",
          "EvaluateTargetHealth": true
        }
      }
    },
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "bid.example-dsp.com",
        "Type": "A",
        "SetIdentifier": "va",
        "Region": "us-east-1",
        "AliasTarget": {
          "HostedZoneId": "Z_VA_NLB",
          "DNSName": "va-nlb.us-east-1.elb.amazonaws.com",
          "EvaluateTargetHealth": true
        }
      }
    }
  ]
}

但纯延迟路由会违反 §9 的合规约束,所以欧盟等数据驻留区要用 geolocation routing 做更高优先级的兜底——EU 用户无论离哪个区近,都强制解析到欧盟境内节点:

{
  "Action": "UPSERT",
  "ResourceRecordSet": {
    "Name": "bid.example-dsp.com",
    "Type": "A",
    "SetIdentifier": "eu-geo",
    "GeoLocation": { "ContinentCode": "EU" },
    "AliasTarget": {
      "HostedZoneId": "Z_FRA_NLB",
      "DNSName": "fra-nlb.eu-central-1.elb.amazonaws.com",
      "EvaluateTargetHealth": true
    }
  }
}

EvaluateTargetHealth: true 让 Route 53 在某区健康检查失败时自动把解析摘到其余健康区——这是 DNS 层的故障切换,配合冗余与容灾的多活切换一起构成机房级容灾。

10.2 区域路由:合规优先,其次就近

进入区域后,用区域路由决定用户的读写落点。规则的顺序很关键:合规硬约束先判,其次才按延迟就近;同一用户尽量稳定落到同一区,避免跨区往返与写冲突。

# 区域路由:合规优先于延迟,同一用户稳定落一个区、避免跨区往返
EU = {"DE", "FR", "GB", "NL", "AT", ...}

def route_region(user):
    if user.country in EU:            # GDPR:EU PII 必须留在欧盟区
        return "eu-central-1"
    if user.country == "RU":          # 242-FZ:俄罗斯数据本地化
        return "ru-local-idc"
    if user.country == "IN" and india_upgraded():   # 见 §7.1
        return "ap-south-1"
    return nearest_by_latency(user)   # 其余按 RTT 就近(SG / VA)

10.3 跨区状态复制:带 lag 保护的预算/频控读取

预算和频控是双活里最容易出错的状态(见 §11)。核心原则是本地快照做实时判断、跨区复制值只做校正,并对复制滞后留安全余量:

# 预算判断:本地快照(毫秒级)+ 跨区复制值(可能滞后),取保守侧
def can_bid(campaign, region):
    local_spent  = local_budget_cache.get(campaign)       # 本区实时快照
    global_spent = replicated_budget.get(campaign)         # 跨区复制值,可能滞后

    # 复制滞后期间,两区各自只看本地会双双超投;用较大值 + 安全余量收敛
    effective = max(local_spent, global_spent) + safety_margin(campaign, region)
    return effective < campaign.daily_budget

safety_margin 应随当前跨区复制 lag 动态调整:lag 越大,余量越保守(宁可少投也不超投)。这需要把复制 lag 当作一等监控指标——即「把关键滞后量做成 SLI 并告警」的做法。

10.4 跨区数据库复制配置

主数据(campaign、定向规则等读多写少的元数据)用单主 + 跨区只读副本:VA 写、SG 就近读,故障时把副本提升为主。以 AWS Aurora Global Database(Terraform)为例:

# Aurora Global Database:us-east-1 主写,ap-southeast-1 跨区只读副本
resource "aws_rds_global_cluster" "adx" {
  global_cluster_identifier = "adx-global"
  engine                    = "aurora-postgresql"
  engine_version            = "15.4"
}

resource "aws_rds_cluster" "primary" {
  provider                  = aws.us_east_1          # 主库:弗吉尼亚
  cluster_identifier        = "adx-primary"
  global_cluster_identifier = aws_rds_global_cluster.adx.id
  engine                    = aws_rds_global_cluster.adx.engine
  engine_version            = aws_rds_global_cluster.adx.engine_version
  master_username           = var.db_user
  master_password           = var.db_password
}

resource "aws_rds_cluster" "secondary" {
  provider                  = aws.ap_southeast_1     # 只读副本:新加坡
  cluster_identifier        = "adx-secondary"
  global_cluster_identifier = aws_rds_global_cluster.adx.id
  engine                    = aws_rds_global_cluster.adx.engine
  engine_version            = aws_rds_global_cluster.adx.engine_version
  # 物理复制,典型跨区 lag < 1s;主库故障时可提升为主(见 §10.6)
  depends_on                = [aws_rds_cluster.primary]
}

要点:只读就近能吃掉大部分读延迟;但复制是异步的,强一致的实时状态(预算/频控)绝不能靠它跨区读——那类状态另走 §10.5 的方案。计费等最终一致数据用 DynamoDB Global Tables 这类多主复制也可,但要接受写冲突后按 last-writer 收敛 + 对账。

10.5 频控 / 预算:region-local 计数 + 异步汇总

预算/频控是写多、要求实时的状态,不适合跨区强一致读。做法是本区 Redis 就近计数(毫秒级判断)+ 异步汇总把各区增量聚合后回写,全局只做最终一致的校正:

# 频控:本区 Redis 实时计数;跨区差异靠异步汇总回写的 :remote 计数校正
# 同一 identity 就近固定路由到一个区(见 §11),正常只落一个区,跨区计数只是兜底
def check_and_incr_freq(user_id, campaign, region, cap):
    r = redis_local[region]
    key = f"freq:{{{user_id}}}:{campaign}"          # hash-tag 保证同槽,本地原子操作
    local  = int(r.get(key) or 0)                   # 本区实时计数
    remote = int(r.get(key + ":remote") or 0)       # 其他区汇总值(异步,可能滞后)
    if local + remote >= cap:
        return False                                # 已达 cap,走非个性化或不曝光
    r.eval(INCR_WITH_TTL, 1, key, ttl_until_midnight())  # incr + 当日过期,原子
    return True

# 异步汇总 worker:消费各区增量事件流 → 中心聚合 → 回写各区 :remote(最终一致)
def rollup_worker():
    central = FreqStore()
    for region in REGIONS:
        central.merge(consume_freq_deltas(region))   # 消费本区 Kafka 增量
    snapshot = central.snapshot()
    for region in REGIONS:
        write_remote_counts(region, snapshot)        # 回写其他区计数,周期性收敛

预算同理:不共享单池实时扣减,而是按区域预分配子配额(如 VA 60%、SG 40%),各区在子配额内自治判断,汇总任务周期性再平衡剩余额度——这正是 §11 的核心设计方向。

10.6 健康检查与区域 failover 脚本

DNS 层的 EvaluateTargetHealth(§10.1)依赖健康检查结果;关键是健康检查要覆盖竞价关键路径的下游依赖(缓存/DB/模型服务),而不是只回一个静态 200。连续失败达阈值时,把该区从 GSLB 摘除,并在必要时提升数据库副本为主:

#!/usr/bin/env bash
# 区域健康检查 + failover:连续失败则把该区从 GSLB 摘除,必要时提升 DB 副本
set -euo pipefail

REGION="$1"                                    # e.g. us-east-1
ENDPOINT="https://bid-${REGION}.example-dsp.com/healthz"
FAILS=0; THRESHOLD=3

while true; do
  # 健康检查须校验下游依赖(缓存/DB/模型),而非仅 HTTP 200
  if curl -fsS --max-time 1 "$ENDPOINT" | grep -q '"deps":"ok"'; then
    FAILS=0
  else
    FAILS=$((FAILS + 1))
    echo "$(date -u) ${REGION} unhealthy (${FAILS}/${THRESHOLD})"
    if [ "$FAILS" -ge "$THRESHOLD" ]; then
      # 1) 把该区权重置 0,Route 53 将解析摘到其余健康区(配合 §10.1)
      aws route53 change-resource-record-sets \
        --hosted-zone-id "$ZONE_ID" --change-batch "file://drain-${REGION}.json"
      # 2) 若故障区是数据库主库,提升其余区的 Aurora 副本为主
      if [ "$REGION" = "us-east-1" ]; then
        aws rds failover-global-cluster \
          --global-cluster-identifier adx-global \
          --target-db-cluster-identifier "$SECONDARY_CLUSTER_ARN"
      fi
      alert "region ${REGION} drained + failed over"   # 通知值班
      exit 1
    fi
  fi
  sleep 2
done

切走之后,剩余健康区要能扛住被转移过来的流量——这要求容量规划时预留 failover 余量(N+1),否则一区故障把流量全压到另一区,会引发二次雪崩(与依赖韧性冗余与容灾呼应)。

11. 跨区状态一致性:预算与频控

双活下,预算与频控若依赖跨区异步复制,lag 一拉大就会出现「两区各看本地状态、全局超投 / 频控双计」——异步复制的状态绝不能当强一致用

设计原则

这与异步与削峰里反复强调的一点同源:跨区/异步链路只能保证最终一致,不能在关键路径上当强一致用。

一句话:双活的坑几乎都出在「拿异步复制的状态做强一致判断」——预算和频控要么按区域预分配配额自治,要么接受最终一致 + 对账,绝不能假设跨区能实时一致。

12. 反模式与落地清单

12.1 反模式

12.2 落地清单

多活机房选型与部署上线前逐项确认:

小结

数据中心选型把服务化与部署的最后一环收在了地理维度上:广告服务上云实战解决了「服务怎么跑在云上」,本篇接着回答「云该开在哪几个区域」;再往上,则回到高可用系统设计反复强调的原则——先量化可用性目标,再按需叠加手段。地理选型同样如此,不必一步到位铺满全球,先把核心市场的两三个节点做扎实,再随流量增长逐步扩展。


views
Share this post on:

Previous Post
负载均衡:四层与七层、算法选型与生产实践
Next Post
混沌工程:故障注入、稳态假设与演练常态化