DNS 轮询负载均衡是什么?它和四层、七层负载均衡有什么区别?
简化版
DNS 轮询是给同一个域名配置多个 A 或 AAAA 记录,DNS 响应时返回多个 IP 或调整顺序,让客户端分散访问不同服务器。
它实现简单、成本低,但不是真正实时的负载均衡。客户端和递归 DNS 会缓存结果,故障 IP 可能继续被访问;也无法感知后端连接数、请求耗时、业务健康状态。
四层或七层负载均衡通常位于流量路径上,可以实时转发、健康检查、摘除故障节点和做更细粒度策略。
详细版
示例:
www.example.com. 60 IN A 192.0.2.1
www.example.com. 60 IN A 192.0.2.2
www.example.com. 60 IN A 192.0.2.3
不同客户端可能拿到不同顺序的 IP。
但一旦客户端拿到 192.0.2.2 并缓存,即使这台机器故障,也可能继续访问直到缓存过期。
DNS 轮询适合简单流量分摊或多入口引导,不适合单独承担强高可用。
真实系统常用 DNS 做全局调度,后面再接四层或七层负载均衡。
完整版教学
1. 先定义 DNS 轮询
DNS 轮询就是一个域名对应多个地址。
api.example.com. IN A 10.0.0.1
api.example.com. IN A 10.0.0.2
api.example.com. IN A 10.0.0.3
DNS 服务器可以返回多个记录,或者调整记录顺序。
客户端通常选择其中一个 IP 连接。
DNS 轮询是“解析阶段的分散”,不是“请求路径上的实时调度”。
2. 它为什么简单但粗糙
DNS 只回答“域名对应哪些 IP”。
它并不处理后续 TCP 连接和 HTTP 请求。
客户端拿到 IP 后,请求就直接打到该 IP。
如果这个 IP 后面压力很大,DNS 不一定知道。
如果这个 IP 刚刚宕机,客户端缓存未过期前也可能继续访问。
3. 和四层负载均衡对比
四层负载均衡工作在 TCP/UDP 层。
它位于流量路径上。
| 对比项 | DNS 轮询 | 四层负载均衡 |
|---|---|---|
| 调度时机 | 域名解析时 | 连接建立时 |
| 是否在流量路径 | 否 | 是 |
| 健康检查 | 能力有限 | 通常支持 |
| 故障摘除速度 | 受 TTL 和缓存影响 | 更实时 |
| 调度依据 | IP 列表和策略 | 连接、端口、健康状态 |
四层 LB 能更快把故障节点摘掉。
4. 和七层负载均衡对比
七层负载均衡能理解 HTTP。
它可以按:
- Host。
- URL 路径。
- Header。
- Cookie。
- 灰度标签。
- 请求方法。
做路由。
DNS 轮询做不到这些,因为 DNS 查询阶段还没有 HTTP 请求内容。
例如 /api 到服务 A,/static 到服务 B,就属于七层能力。
5. DNS 轮询的缓存问题
DNS 缓存是它最大的限制之一。
即使 TTL 设置为 30 秒,也不代表所有客户端都严格遵守。
可能存在:
- 操作系统缓存。
- 浏览器缓存。
- 递归 DNS 缓存。
- 运营商 DNS 策略。
- 应用连接池长连接复用。
所以故障切换不会像想象中一样瞬时。
6. 常见组合架构
更常见的架构是多层组合:
DNS 全局调度 -> 区域入口 LB -> 应用网关 -> 服务实例
DNS 做地域、线路、机房级别调度。
LB 做区域内实时负载均衡和健康检查。
应用网关做七层路由、鉴权、限流。
这样每层负责自己擅长的粒度。
7. 常见误区与追问
- 误区:DNS 轮询能精准按服务器负载分流。 它通常看不到实时连接数和业务耗时。
- 误区:TTL 设置很低就能秒级故障切换。 客户端、递归 DNS 和连接池缓存都会影响生效。
- 误区:DNS 轮询和七层负载均衡能力一样。 DNS 看不到 URL、Header、Cookie 等 HTTP 信息。
- 追问:DNS 轮询适合什么场景? 简单流量分散、多入口引导、全局粗粒度调度。
- 追问:为什么故障 IP 还会被访问? 因为旧解析结果和长连接可能仍在使用。
- 追问:大站为什么还用 DNS 调度? DNS 适合做全球流量入口和地域级调度,再配合后端 LB。
8. 加强记忆
DNS 轮询是“门口发地址”,LB 是“路上实时分车”。
前者简单粗粒度,后者实时细粒度。