Round Robin DNS 工作原理与实践分析

一、概述

1. 背景

Round Robin DNS 是一种简单而优雅的负载均衡解决方案。通过在 DNS 记录中配置多个 IP 地址,可以让流量自动分散到不同的服务器上。这种方法无需昂贵的负载均衡设备,适用于需要全球分布式部署的服务。

2. 核心问题

虽然 Round Robin DNS 的概念简单,但实际使用中存在几个关键问题:

  • 客户端如何选择服务器
  • 如何实现就近接入(低延迟)
  • 服务器离线时如何故障转移
  • CDN 服务器的行为是否符合预期

3. 实验设计

作者在全球部署了 3 个 VPS(美国、欧洲、新加坡),分别配置了直连和 Cloudflare 代理的 A 记录,通过不同客户端测试其选择行为。

二、Round Robin DNS 基本原理

1. 传统 DNS 配置

传统的单一 A 记录配置如下:

域名                    类型    TTL    值
rr-direct.example.com   A       300    5.223.46.55

这种配置下,所有请求都指向单一服务器。

2. Round Robin DNS 配置

Round Robin DNS 配置多个 A 记录指向同一域名:

域名                    类型    TTL    值
rr-direct.example.com   A       300    5.223.46.55
rr-direct.example.com   A       300    1.2.3.4
rr-direct.example.com   A       300    9.8.7.6

3. 工作原理

graph LR
    A[客户端] -->|1. DNS 查询| B[DNS 服务器]
    B -->|2. 返回 IP 列表<br/>5.223.46.55<br/>1.2.3.4<br/>9.8.7.6| A
    A -->|3. 客户端选择| C{选择策略}
    C -->|Ping 测试| D[延迟最低]
    C -->|随机选择| E[第一个 IP]
    C -->|IP Hash| F[固定 IP]
    D --> G[连接服务器 1]
    E --> H[连接服务器 2]
    F --> I[连接服务器 3]

Round Robin DNS 工作原理

三、理论标准:RFC 8305 Happy Eyeballs

1. 标准概述

RFC 8305(Happy Eyeballs)定义了客户端在连接前应如何对地址进行排序。关键规则是:

如果客户端是有状态的,并且具有访问每个地址的路由的历史往返时间(RTT),它应该在规则 8 和 9 之间添加目标地址选择规则,优先选择具有较低 RTT 的地址。

2. 理论流程

sequenceDiagram
    participant C as 客户端
    participant D as DNS 服务器
    participant S1 as 服务器 1(近)
    participant S2 as 服务器 2(远)
    participant S3 as 服务器 3(极远)

    C->>D: DNS 查询
    D-->>C: 返回 IP 列表
    Note over C: 检查服务器在线状态
    C->>S1: Ping/连接测试
    C->>S2: Ping/连接测试
    C->>S3: Ping/连接测试
    Note over C: 按 RTT 排序
    C->>S1: 连接延迟最低的服务器

Happy Eyeballs 流程

3. 理论总结

  • 检查服务器在线/离线状态
  • 对在线服务器按 Ping 时间排序
  • 选择延迟最低的服务器

四、客户端行为实测

1. 测试环境

  • 客户端位置:欧洲
  • 服务器分布:美国(绿色)、欧洲(蓝色)、新加坡(红色)
  • 预期:应该连接到延迟最低的欧洲服务器(蓝色)

2. Chrome 浏览器

行为特征

  • 启动时随机选择一个服务器
  • 选择后会保持连接(缓存)
  • 数小时后才会重新评估
  • 可能连接到延迟最高的服务器(如新加坡)

问题:不考虑地理位置和延迟,可能导致性能极差。

3. Firefox 浏览器

行为特征

  • 与 Chrome 类似
  • 启动时随机选择
  • 重启浏览器后重新随机选择

问题:同样不考虑延迟。

4. Safari 浏览器

行为特征

  • 总是正确选择最近的欧洲服务器
  • 服务器离线后能快速恢复到正确选择
  • 表现最符合理论预期

优势:实现了智能的延迟感知选择。

5. curl 命令行工具

行为特征

  • 第一次可能不准确
  • 第二次运行时总是选择最近的服务器
  • 行为正确且可预测
graph LR
    A[curl 第一次请求] --> B{DNS 结果顺序}
    B --> C[使用第一个 IP]
    C --> D[测量 RTT]
    D --> E[curl 第二次请求]
    E --> F[选择最低 RTT 的 IP]

curl 行为流程

五、Cloudflare 行为分析

1. 行为特征

正常情况

  • 根据客户端 IP 哈希选择服务器
  • 一旦选择后保持固定(类似 client_ip_hash modulo server_num)
  • 每个客户端 IP 总是连接到同一个服务器
  • 不考虑延迟和地理位置

问题示例

  • 家庭 IP 固定连接到美国服务器
  • 使用移动热点后固定连接到欧洲服务器
  • 全球各地的 VPS 连接到随机位置的服务器

2. 故障转移问题

严重缺陷:Cloudflare 不会检测服务器离线状态。

  • 服务器离线后,Cloudflare 继续将请求发送到该服务器
  • 返回 521 错误(Web Server Is Down)
  • 不会自动切换到其他在线服务器
sequenceDiagram
    participant C as 客户端
    participant CF as Cloudflare
    participant S1 as 服务器 1(离线)
    participant S2 as 服务器 2(在线)

    C->>CF: 请求
    Note over CF: 根据 IP Hash<br/>选择服务器 1
    CF->>S1: 转发请求
    S1-->>CF: 连接失败/超时
    CF-->>C: 521 错误
    Note over CF: 不尝试服务器 2

Cloudflare 故障转移问题

3. 与标准对比

根据 Cloudflare 官方文档,理论上应该支持零宕机故障转移,但实际测试显示 Round Robin DNS 配置下无法正常工作。

六、故障转移能力对比

1. 服务器离线场景

当美国服务器被关闭后,各客户端表现:

客户端故障检测自动切换切换速度
Chrome支持支持< 1 秒
Firefox支持支持< 1 秒
Safari支持支持< 1 秒
curl支持支持立即
Cloudflare不支持不支持N/A

2. 浏览器故障转移能力

所有浏览器都能在服务器离线时快速切换到其他服务器。作者测试发现,即使在加载过程中关闭服务器,Safari 也能在 1 秒内完成切换。

3. Cloudflare 的不足

  • 无法检测后端服务器状态
  • 固定的路由策略导致单点故障
  • 与官方文档描述的零宕机故障转移不符

七、实践建议

1. 直连 Round Robin DNS

优点

  • 免费,任何 DNS 提供商都支持
  • 浏览器和 curl 都能正确处理故障转移
  • Safari 能实现智能的延迟优化

缺点

  • Chrome 和 Firefox 的随机选择可能导致性能问题
  • 依赖客户端实现

2. 使用 Cloudflare 代理

优点

  • 提供 CDN 加速和安全防护
  • 全球边缘节点

缺点

  • 不支持 Round Robin DNS 的故障转移
  • 固定路由不考虑延迟
  • 可能比直连更慢

3. 最佳实践建议

  • 如果需要故障转移:使用直连 Round Robin DNS
  • 如果延迟敏感:不依赖 Chrome/Firefox 的自动选择
  • 如果使用 Cloudflare:需要额外的负载均衡解决方案(非 Round Robin DNS)

八、技术细节总结

1. DNS 解析流程

  1. 客户端发起 DNS 查询
  2. DNS 服务器返回所有 A 记录
  3. 客户端根据内部策略选择一个 IP
  4. 建立连接

2. 客户端策略差异

  • Safari/curl:智能选择,基于 RTT 优化
  • Chrome/Firefox:随机选择,缓存结果
  • Cloudflare:IP 哈希,固定路由

3. 故障检测机制

浏览器通过连接超时和重试机制实现故障检测。Cloudflare 在 Round Robin DNS 模式下似乎未实现健康检查。


参考资料

  1. Understanding Round Robin DNS - by Zsolt Ero
  2. RFC 8305 - Happy Eyeballs
  3. RFC 6724 - Default Address Selection
  4. Cloudflare 零宕机故障转移文档
最后修改:2026 年 01 月 16 日
如果觉得我的文章对你有用,请随意赞赏