跳转到内容

VL2 — 让一万台服务器像在同一台交换机上

待复核

VL2(Virtual Layer 2)是 Microsoft 2009 年提出的一套数据中心网络架构,让一整个机房上万台服务器看起来像挂在同一台巨型交换机上。

日常类比:以前的机房像多层办公楼——同一层聊天很快,跨楼层要等电梯(带宽收敛),座位号绑死部门(IP 绑位置)。VL2 改成开放式大厅:任意两工位有多条等长小路,名片(应用地址)和座位号(物理地址)解耦,搬工位不用改名片。

VL2 是后来 Azure 网络底座的重要原型,并与同期 Clos 路线共同影响了 Google Jupiter、Andromeda 等一代云数据中心网络。

不理解 VL2,下面这些事都说不清:

  • 为什么云厂商敢承诺「VM 随便迁移、IP 不变」——那是 VL2 双地址思想的延续
  • 为什么现代数据中心机房从「树形」变成了「Clos」拓扑——VL2 是把这个搬上工业舞台的关键论文
  • 为什么 VXLAN / NVGRE 这些 overlay 协议会火——VL2 先证明了「L2 语义跑在 L3 上」是可行的
  • 为什么云厂商不再追求买一台「核武器级超级交换机」——VL2 证明便宜的商用交换机堆出来更划算

VL2 解决三件事,对应三招:

  1. 任意两台服务器之间带宽相等 → Clos 拓扑(折叠胖树)+ Valiant 负载均衡
  2. 应用地址不绑物理位置 → 双地址:LA(位置地址)+ AA(应用地址)
  3. 替代 ARP 广播风暴 → 集中式 Directory System 查 AA→LA 映射

Clos 拓扑长这样(简化;ToR = Top-of-Rack,机架顶上那台接服务器的交换机):

[Intermediate 交换机] ← 中间层,多台并列
/ | \
[Aggregation 交换机] ← 汇聚层
/ | \
[ToR 交换机] ← 接服务器
/ | \
服务器 服务器 服务器

任意两台服务器之间有多条等长的路径。怎么分配流量才不堵?

Valiant 负载均衡(VLB):每条流随机挑一台中间交换机「绕一下」再去目的地。类比:不管早高峰想去哪,先随机分配你去哪个十字路口换乘,路网就不会偏堵某一条主干道。

  • LA(Locator Address):跟物理位置绑定,跑标准路由(OSPF = 交换机之间互相通告「我能到哪些地址」的协议)
  • AA(Application Address):应用看到的扁平地址,不绑位置,VM 搬家也不变

通信走 IP-in-IP 封装(外层再套一层 IP 信封):外层 LA 给路由用,内层 AA 给应用看。

像公司前台查工位号:应用要给某个 AA 发包,先问 Directory「这个 AA 现在在哪台 LA?」Directory 用复制状态机(RSM = 多台机器投票保持同一份通讯录)保证一致,替代 ARP 泛洪。

案例 1:从流量画像推出设计约束

Section titled “案例 1:从流量画像推出设计约束”

论文测量了 Microsoft 生产数据中心(不是普适定律)。用伪代码读这组数:

traffic = measure_dc() # 约 75% 机房内,25% 出机房
matrix = sample_every(minutes) # 流量矩阵几分钟就变
flows = classify(traffic) # elephant 少但体积大;mice 多
assert needs_any_to_any(traffic) and not static_vlan_ok(matrix)

逐部分解释

  1. 机房内流量占大头 → 必须把「任意服务器对」带宽做平,不能只优化出入口
  2. 矩阵常变 → 静态 VLAN / 手工调优跟不上,要靠拓扑 + 随机分流
  3. elephant/mice 并存 → 随机 hash 多数够用,偶发撞车要另治(见踩坑)

完整 VLB:先随机挑一台 Intermediate 绕一下,再在等价路径上用 ECMP(五元组哈希)转发。伪代码:

la = directory.lookup("10.1.1.5") # AA → LA
mid = random_pick(intermediate_switches) # VLB 的「随机换乘」
pkt = encapsulate(outer=la, via=mid, inner=original)
path = ecmp_hash(pkt.5tuple) % num_paths
forward(pkt, path)

逐部分解释

  1. Directory 查出目的 LA;随机选 Intermediate 才是 VLB 本体
  2. IP-in-IP 外套 LA,内层仍是应用看到的 AA
  3. ECMP 只在等价路径里挑路——单独一次 hash ≠ 完整 VLB
# 迁移前:AA=10.1.1.5 → LA=192.168.1.20(机架 A)
directory.update("10.1.1.5", "192.168.5.7") # 迁到机架 B
la = directory.lookup("10.1.1.5") # → 192.168.5.7
send(encapsulate(outer=la, inner=original)) # 新包走新 LA

逐部分解释

  1. AA 不变,只改 Directory 里的 AA→LA 映射
  2. 后续封装用新 LA,流量自动跟到新机架
  3. 保活连接还依赖 hypervisor/迁移协议;VL2 只保证「地址语义不断」
  1. ECMP hash collision:两条 elephant 撞同一链路就堵;同一 ToR 上两条大流吞吐突然腰斩时,先查是否撞路径。后续 Hedera、CONGA 专门治这个。
  2. Directory 首包延迟:第一次查 AA 加几十微秒;短连接占多数的场景敏感。
  3. 没考虑多租户隔离:VL2 假设单租户;多租户云要靠 VXLAN / NVGRE 加租户标识。
  4. 要求重投资 Clos:不能在老树形拓扑上「软件升级」,必须重新布线。

适用

  • 大型数据中心(万台服务器级),机房内部流量占大头(论文画像约 75%)
  • 流量矩阵动态变化、需要 VM 迁移而不改 IP
  • 多路径冗余 + 等价带宽是硬要求

不适用

  • 小机房(几十台),简单 L2 就够;跨机架流量 <20%、机架内为主时 Clos 重布线 ROI 低
  • 跨机房 / 跨地域——VL2 只管机房内;跨机房要用 WAN / 专线 / SDN-WAN
  • 严格多租户隔离——需要 VXLAN / NVGRE 等 overlay 补充
  • 2008 年前:数据中心普遍用三层树形拓扑,越往上越收敛,跨机架带宽极不对等。
  • 2008 年同期:UCSD 的 Al-Fares 等人发表 A Scalable, Commodity Data Center Network Architecture(Fat-Tree),同样主张商用交换机 + Clos。
  • 2009 年 SIGCOMM:Microsoft Research 发表 VL2,把 Fat-Tree 思想 + Valiant + 双地址 + Directory 凑齐,落到生产数据中心。
  • 之后:Azure、Google Jupiter / Andromeda 都走上 Clos + overlay 这条路。VXLAN(2014 RFC)把双地址思想标准化成跨厂商协议。
  1. 测量先于设计:VL2 有说服力,是因为它先公布了 Microsoft 生产流量画像。
  2. 商用胜于专用:便宜商用交换机 + 软件智能(VLB / ECMP / Directory)代替昂贵超级交换机。
  3. 解耦是万能解药:LA/AA 解耦才能迁 VM;控制面(Directory)和数据面解耦,控制面坏了数据面还能跑。
  4. Valiant 是个老想法:VLB 来自 1980 年代并行计算机互联网络,老论文常常是新工程的金矿
  • clos-1953 —— Clos 拓扑的数学起源,VL2 是它在数据中心的工业落地
  • fat-tree-2008 —— 同期的 Fat-Tree 论文,主张相同但更偏学术
  • vxlan-2014 —— 把 VL2 的双地址思想标准化成跨厂商 overlay
  • ecmp-equal-cost —— VL2 用 ECMP 在商用交换机上实现 Valiant 负载均衡
  • google-jupiter —— Google 把 VL2 思想跑十年的工业续集
  • andromeda-2018 —— Andromeda — Google Cloud 网络虚拟化的高速通道
  • b4-2013 —— B4 — Google 用 SDN 把跨数据中心 WAN 利用率拉到 95%+