核心目标
在讨论具体方案前,首先要明确多机房域名实现要解决什么问题:

- 高可用性:当一个机房(或其中的服务器)出现故障时,用户仍然可以通过域名访问到其他正常机房的业务,避免单点故障。
- 就近访问:根据用户的地理位置,将用户请求调度到距离最近的机房,降低网络延迟,提升访问速度和用户体验。
- 负载均衡:将流量合理地分发到多个机房的多个服务器上,防止单个服务器或机房过载。
- 灾备能力:在发生区域性灾难(如地震、断电)时,能够快速切换流量到备用机房,保障业务连续性。
核心原理:DNS 是关键
实现上述目标的核心技术是 DNS,DNS 是互联网的“电话簿”,负责将域名(如 www.example.com)解析为 IP 地址,我们正是利用 DNS 的解析过程来实现智能调度。
用户访问 www.example.com 的流程如下:
- 用户在浏览器输入
www.example.com。 - 操作系统向本地 DNS 服务器发起递归查询。
- 本地 DNS 服务器向权威 DNS 服务器发起查询。
- 这里是关键:权威 DNS 服务器根据预设的策略(如地理位置、负载、健康状况等),返回一个或多个 IP 地址。
- 本地 DNS 服务器将 IP 地址返回给用户的操作系统。
- 浏览器使用该 IP 地址访问服务器。
多机房域名的实现,本质上是配置权威 DNS 服务器的解析策略。
主要实现方案
根据业务需求的不同,主要有以下几种 DNS 解析方案,通常可以组合使用。

全局负载均衡
这是最常用、最核心的方案,它工作在 DNS 层面,根据不同的策略来返回不同机房的 IP 地址。
基于地理位置的调度
- 原理:权威 DNS 服务器能识别发起查询的本地 DNS 服务器的 IP 地址,从而大致判断出用户的地理位置,然后返回离用户最近机房的 IP 地址。
- 示例:
- 用户在北京,本地 DNS IP 属于北京,GSLB 解析到北京机房的 IP
2.3.4。 - 用户在上海,本地 DNS IP 属于上海,GSLB 解析到上海机房的 IP
6.7.8。
- 用户在北京,本地 DNS IP 属于北京,GSLB 解析到北京机房的 IP
- 优点:延迟最低,用户体验最好。
- 缺点:
- 缓存问题:DNS 解析结果会被本地 DNS 和用户浏览器缓存,缓存期间用户即使换了个地方,也会访问到同一个机房。
- 判断不准:IP 地址库可能不准确,或用户通过 VPN 访问,会导致调度不准。
- 适用场景:绝大多数对延迟敏感的业务,如网站、App、API 等。
基于延迟的调度
- 原理:GSLB 会向多个机房的“健康检查节点”发送 ICMP (ping) 或其他探测包,测量到每个机房的实时网络延迟,然后将用户请求调度到延迟最低的机房。
- 优点:比纯地理位置更精准,能实时反映网络状况变化。
- 缺点:会增加权威 DNS 服务器的探测开销,对网络抖动敏感。
- 适用场景:对延迟要求极高,且网络状况复杂的场景。
基于负载的调度

- 原理:GSLB 需要实时获取每个机房的负载信息(如 CPU 使用率、内存使用率、当前连接数、请求数等),然后根据预设的算法(如轮询、加权轮询、最少连接)将请求调度到负载最轻的机房。
- 优点:实现了流量的智能分配,避免了部分机房过载而另一些机房空闲的情况。
- 缺点:需要在每个机房部署代理(如 Agent)来收集负载信息,增加了系统复杂度。
- 适用场景:流量波动大,需要精细化流量控制的业务。
基于故障的调度
- 原理:GSLB 会持续对每个机房的特定业务接口进行健康检查(如 HTTP 请求
/health接口),如果某个机房的连续检查失败,GSLB 会将其 IP 地址从解析池中临时移除,不再向用户返回该机房的 IP。 - 优点:实现了自动化的故障隔离和切换,是高可用的基石。
- 缺点:健康检查的粒度和准确性至关重要,误判可能导致正常机房被下线。
- 适用场景:所有对可用性有要求的业务。
实践建议:通常会将以上策略组合使用,形成一个“健康检查优先,地理位置为主,负载为辅”的复杂调度策略。
- 首先检查机房是否健康,不健康的机房直接排除。
- 在健康的机房中,选择离用户地理位置最近的几个机房。
- 在这几个候选机房中,选择当前负载最低的一个返回 IP。
Anycast (任播)
Anycast 是一种更高级、更优雅的网络架构,常与 CDN 结合使用。
- 原理:在多个不同的物理位置(机房)的服务器上,配置完全相同的 IP 地址,通过 BGP (边界网关协议) 将这个 IP 地址宣告到全球互联网,互联网的路由系统会自动将用户的请求路由到“拓扑最近”的、拥有该 IP 地址的服务器。
- 示例:
- 北京机房和上海机房的服务器都使用 IP
0.113.1。 - 北京的用户访问
0.113.1,BGP 路由会把流量导向北京机房。 - 上海的用户访问
0.113.1,BGP 路由会把流量导向上海机房。
- 北京机房和上海机房的服务器都使用 IP
- 优点:
- 极致的就近性:路由自动选择最优路径,延迟最低。
- 天然的故障转移:如果上海机房的服务器宕机,BGP 会自动撤销该 IP 的宣告,用户流量会自动被路由到下一个最近的机房(如北京),切换速度极快(秒级)。
- 负载均衡:流量被自然地分散到多个节点。
- 缺点:
- 配置复杂:需要与 ISP 合作进行 BGP 配置,成本和技术门槛较高。
- 会话保持困难:由于 IP 地址是共享的,来自不同客户端的请求可能会到达不同的服务器,对于需要会话粘性的应用(如购物车)需要额外处理(如使用 Cookie)。
- 适用场景:大型 CDN、DNS 服务(如 Google Public DNS)、大型分布式服务。
关键技术点和最佳实践
DNS 缓存问题
这是多机房域名最大的挑战之一,为了缓解缓存带来的问题:
- 设置合理的 TTL (Time To Live):TTL 值越短,DNS 记录更新越快,但会增加 DNS 服务器的解析压力,对于高可用业务,TTL 设置在 60秒到300秒 之间是一个平衡点。
- DNS 预解析:在 HTML 的
<head>中加入<link rel="dns-prefetch" href="//www.example.com">>,让浏览器提前解析域名,减少用户首次访问的延迟。
会话粘性
如果用户在访问过程中,因为 DNS 缓存过期或重连,被调度到了另一个机房,可能会导致登录状态丢失、购物车清空等问题。
- 解决方案:
- 统一后端存储:将用户 Session、购物车等数据存储在外部的、共享的存储中,如 Redis、Memcached、MySQL 数据库,这样无论用户访问哪个机房,都能读取到同一份数据。
- 应用层路由:在应用内部实现一套路由机制,根据用户 ID 等信息,将同一用户的请求始终固定在同一个机房(或服务器)上。
数据同步与一致性
多机房架构下,数据同步是一个核心难题,北京机房的用户注册了一个新账户,上海机房的数据库如何立即知道?
- 解决方案:
- 最终一致性:采用消息队列(如 Kafka、RabbitMQ)或数据库同步工具(如 Canal),将数据变更事件异步地广播到其他机房,这是最常用的方案,性能好,但会有短暂延迟。
- 强一致性:使用分布式数据库(如 TiDB, CockroachDB)或分布式事务(如 Seata),但性能和复杂度会大大增加。
监控与告警
必须建立一个完善的监控体系来感知机房的健康状况。
- :每个机房的入口流量、出口流量、服务器负载、网络延迟、关键服务的健康状态(HTTP 状态码、响应时间)。
- 告警机制:当某个指标异常(如机房整体不可用、延迟飙升)时,能立即触发告警,通知运维人员介入。
架构示例
一个典型的多机房网站架构如下:
+-----------------+
| 用户 (全球) |
+--------+--------+
| (1. 用户请求域名)
v
+----------------+ +----------------+ +----------------+
| 本地 DNS | | 本地 DNS | | 本地 DNS | (不同运营商/地区)
+-------+--------+ +-------+--------+ +-------+--------+
| | |
v v v
+----------------------------------------------+
| 权威 DNS 服务器 (GSLB) |
| |
| [策略: 健康检查 -> 地理位置 -> 延迟/负载] |
| |
| +----------------+ +----------------+ |
| | 返回北京机房IP | | 返回上海机房IP | |
| | (e.g., 1.2.3.4)| | (e.g., 5.6.7.8)| |
| +----------------+ +----------------+ |
+----------------------+-----------------------+
|
| (2. 返回最优IP)
v
+------------------+ +------------------+
| 用户浏览器 | | 用户浏览器 |
+--------+---------+ +--------+---------+
| (3. 访问IP) | (3. 访问IP)
v v
+------------------+ +------------------+
| 北京机房 | | 上海机房 |
| +-------------+ | +-------------+ |
| | L4/L7 负载均衡 | | | L4/L7 负载均衡 | |
| +------+------+ | +------+------+ |
| | | | |
| v | v |
| +-------------+ | +-------------+ |
| | Web服务器集群| | | Web服务器集群| |
| +------+------+ | +------+------+ |
| | | | |
| v | v |
| +-------------+ | +-------------+ |
| | 数据库/缓存 | | | 数据库/缓存 | |
| | (主/从/读写)| | | (主/从/读写)| |
| +-------------+ | +-------------+ |
+------------------+ +------------------+
| |
| (4. 异步数据同步) |
+---------------------+
|
v
+-------------+
| 共享存储层 |
| (Redis, MQ) |
+-------------+
实现多机房域名,是一个系统工程,它不仅仅是 DNS 的事情,而是涉及到网络、应用、数据、运维等多个层面的协同工作。
- 入门方案:使用云厂商提供的 GSLB 服务(如阿里云 DNS, 腾讯云 DNSPod, AWS Route 53),它们已经内置了地理位置、延迟、负载、健康检查等丰富的策略,开箱即用。
- 进阶方案:对于有更高性能和控制力要求的场景,可以研究并实施 Anycast + CDN 的组合方案。
- 核心原则:始终围绕高可用和用户体验这两个目标,在智能调度、数据一致性、会话处理和监控告警这几个方面做好设计和实践。
