在现代网络架构中,确保网站或应用的高可用性和可伸缩性至关重要,当单一服务器无法承受日益增长的流量时,负载均衡便成了首选解决方案,而在众多负载均衡技术中,DNS 轮询以其简单、低成本、易于部署的特点,成为了许多入门级和小型项目的首选,它是一种在域名系统(DNS)层面实现流量分发的机制,无需复杂的硬件或软件设备,仅通过对 DNS 记录的巧妙配置即可实现。

什么是 DNS 轮询?
想象一下,你是一家热门餐厅的前台接待员,现在有三条完全相同的电话线路(对应三台服务器),当电话(用户请求)打进来时,你不能总是把第一个电话接给第一条线路,因为这样会让第一条线路的接线员(服务器)不堪重负,一个公平的做法是,第一个电话给线路一,第二个给线路二,第三个给线路三,第四个又回到线路一,如此循环往复。
DNS 轮询的工作原理与此非常相似,传统上,一个域名(如 www.example.com)通过一条 A 记录解析到一个 IP 地址,而 DNS 轮询则是为同一个主机名创建多条 A 记录,每条记录指向一个不同服务器的 IP 地址,当用户尝试访问该域名时,他们的计算机会向 DNS 服务器发起查询,DNS 服务器在收到请求后,并不会总是返回同一个 IP 地址,而是会按照预设的顺序(通常是轮询或随机),从其 IP 地址列表中选择一个返回给用户,这样,连续的访问请求就被自然地分散到了不同的服务器上,从而实现了基础的负载分担。
DNS 轮询的优点与局限性
作为一种基础的负载均衡方案,DNS 轮询有其独特的优势,但也存在不可忽视的局限性。
主要优点:
- 实现简单、成本低廉:配置 DNS 轮询通常只需要登录域名提供商的管理后台,添加几条 A 记录即可,几乎不产生额外费用,也无需部署专门的负载均衡硬件或复杂的软件。
- 基础负载分发:能够有效地将流量大致均匀地分配到多个服务器,避免了单点过载,提升了整体系统的处理能力。
- 内置冗余性:当列表中的某一台服务器宕机时,DNS 服务器仍然会返回其他健康服务器的 IP 地址,只要不是所有服务器同时故障,服务仍能部分可用,提供了一定的容错能力。
核心局限性:
- 缺乏健康检查机制:这是 DNS 轮询最大的短板,DNS 服务器本身并不知道它返回的 IP 地址所对应的服务器是否真正在线且运行正常,如果一台服务器宕机,DNS 依然会“盲目”地将它分配给用户,直到管理员手动移除该记录。
- DNS 缓存带来的问题:为了提高网络效率,用户本地计算机、ISP(互联网服务提供商)的 DNS 服务器以及各级中间节点都会缓存 DNS 解析结果,这个缓存由一个称为“生存时间”(TTL)的值控制,如果一台服务器在 TTL 过期前宕机,所有已缓存其 IP 地址的用户在缓存期间都无法访问服务,因为他们的计算机会持续尝试连接这个已失效的 IP。
- 无法保持会话持久性:对于需要登录或包含购物车等需要保持用户状态的应用,DNS 轮询可能会带来问题,一个用户在第一次访问时被分配到服务器 A,并在其上创建了会话,但当他刷新页面或进行下一步操作时,DNS 可能会将他指向服务器 B,由于服务器 B 上没有他的会话信息,用户可能需要重新登录或丢失购物车数据。
- 分配不均:由于客户端缓存和网络环境的差异,流量的分配可能并不完全均匀,某些地区的用户可能总是被解析到同一个或少数几个 IP 上。
如何设置 DNS 轮询
设置 DNS 轮询的过程非常直观,核心步骤是在你的 DNS 托管服务商处为同一主机名添加多条 A 记录。
第一步:准备工作

- 确保你拥有至少两台拥有独立公网 IP 地址的服务器,并且这些服务器上都已部署好相同的应用。
- 确保你可以登录管理你的域名 DNS 记录的控制面板(阿里云 DNS、腾讯云 DNSPod、Cloudflare、GoDaddy 等)。
第二步:配置 A 记录
- 登录到你的域名管理控制面板,找到 DNS 解析或域名服务器管理部分。
- 选择你要配置的域名。
- 添加或修改 A 记录,对于主机名(如
www),你需要创建多条记录。
假设你有三台服务器,IP 地址分别为 0.2.10、0.2.11 和 0.2.12,你的配置应该如下表所示:
| 主机名 | 记录类型 | 记录值 (IP 地址) | TTL (秒) |
|---|---|---|---|
| www | A | 0.2.10 | 300 |
| www | A | 0.2.11 | 300 |
| www | A | 0.2.12 | 300 |
第三步:设置合理的 TTL
TTL 值的设置至关重要。
- 较低 TTL (如 60-300 秒):优点是当某台服务器故障时,可以很快地在全网范围内更新解析记录,将流量切换到健康服务器,缺点是会增加 DNS 服务器的查询负载。
- 较高 TTL (如 3600 秒或更长):优点是减少了 DNS 查询次数,降低了服务器压力,缺点是故障切换会很慢,因为即使你删除了故障服务器的记录,已被缓存的用户仍会长时间无法访问。
对于使用 DNS 轮询的场景,通常建议设置一个较低的 TTL(5 分钟,即 300 秒),以便在发生故障时能更快地响应。
超越基础:更智能的 DNS 方案
鉴于标准 DNS 轮询的局限性,许多先进的 DNS 服务商提供了增强功能,使其变得更加强大:
- 健康检查:这是弥补标准 DNS 轮询最大缺陷的关键功能,DNS 提供商会定期从其全球监测节点对你的服务器进行探测(发送 HTTP 请求或 Ping),只有当服务器响应正常时,其 IP 地址才会被返回给用户,一旦检测到服务器故障,该 IP 会自动从轮询列表中移除,从而实现了自动化的故障转移。
- 加权轮询:允许你为不同的服务器分配权重,你有一台高性能服务器和两台普通服务器,你可以将高性能服务器的权重设为 2,普通服务器的权重设为 1,这样,DNS 返回高性能服务器 IP 的概率会是普通服务器的两倍,实现了基于服务器性能的智能流量分配。
- 基于地理位置的路由:根据用户的地理位置,将其解析到距离最近的服务器 IP,显著降低访问延迟,提升用户体验。
DNS 轮询设置是一种实现基础负载均衡的有效、快捷且经济的方法,它非常适合资源有限、对会话持久性要求不高的个人项目或初创企业,在生产环境中,必须清醒地认识到其固有的局限性,特别是健康检查和缓存问题,通过选择支持高级功能的 DNS 提供商,可以极大地增强其可靠性和智能性,使其从一个简单的流量分配工具,演变为一个强大而灵活的全球流量管理系统,在选择方案时,务必根据自身的业务需求、预算和技术能力,做出最合适的决策。

相关问答FAQs
问题 1:DNS 轮询设置和 Nginx 这类软件负载均衡有什么本质区别?我应该选择哪种?
解答: 它们的主要区别在于工作层面和功能丰富度。
- 工作层面:DNS 轮询工作在 应用层之外,它只负责将用户的访问请求引导到某个入口服务器,而 Nginx 这类软件负载均衡器工作在 应用层(第 7 层),它接收所有流量,然后根据内部策略(如轮询、IP Hash、最少连接数等)再将请求转发给后端的具体应用服务器,Nginx 掌握着所有进入的流量细节。
- 功能:Nginx 功能远比 DNS 轮询强大,它可以进行精细的健康检查,实时感知后端服务器状态;可以轻松实现会话保持;可以管理 SSL 证书,实现 HTTPS 卸载;还能进行缓存、访问控制等,DNS 轮询只能做简单的 IP 地址分发。
选择建议:
- 选择 DNS 轮询:如果你需要一个非常简单、低成本的方案来分散流量,且应用对会话保持不敏感,或者它只是你整体架构的第一层(结合 Nginx 使用,DNS 先将流量分散到几个 Nginx 集群)。
- 选择 Nginx:如果你的应用需要会话保持、需要对后端服务器进行实时的健康监控、或者需要统一的 SSL 证书管理和更复杂的负载均衡策略,对于大多数生产级应用,Nginx 通常是一个更健壮、更可靠的选择。
问题 2:我按照文章设置了 DNS 轮询,但发现一台服务器宕机后,还是有大量用户无法访问,为什么?
解答: 这个问题的根源正是 DNS 缓存 和 缺乏健康检查。 当你服务器宕机后,即使你立刻登录 DNS 后台删除了对应 IP 的 A 记录,这个变更也无法立即生效,原因如下:
- 本地缓存:访问过你网站的用户电脑上,可能缓存了那个故障的 IP 地址,在 TTL 时间过期之前,他们的浏览器会一直尝试连接这个无效 IP。
- ISP 缓存:用户的网络运营商(如电信、联通)的 DNS 递归服务器也缓存了你的解析记录,这意味着该运营商网络下的所有用户,在缓存刷新前都会被导向故障服务器,大型运营商的 DNS 缓存刷新可能非常慢,不一定会严格遵守你设置的 TTL。
解决方案:
- 降低 TTL:这是治标不治本但必须做的事,将 TTL 设置为尽可能短(如 60-300 秒),能最大限度地缩短缓存生效时间,减少故障影响范围。
- 启用 DNS 提供商的健康检查功能:这是最根本的解决方案,如果你使用的是 Cloudflare、AWS Route 53 或阿里云 DNS 等高级服务,请务必启用健康检查,这样,当服务器宕机时,DNS 系统会自动停止返回其 IP 地址,从而实现自动的故障转移,无需人工干预,也无需等待缓存过期,对于生产环境,强烈推荐使用带健康检查的 DNS 服务。