CDN(Content Delivery Network,内容分发网络)通过在全球部署边缘节点,将网站内容缓存到离用户最近的服务器,从而加速内容传输。DNS 在 CDN 中扮演着智能调度的核心角色,决定用户访问哪个边缘节点。
CDN 的工作原理
传统访问 vs CDN 访问
传统访问:
shell用户(北京)→ 源站服务器(美国)→ 返回内容 ↓ 延迟高,速度慢
CDN 加速:
shell用户(北京)→ DNS 智能调度 → CDN 北京节点 → 返回缓存内容 ↓ 延迟低,速度快
DNS 在 CDN 中的作用
1. CNAME 接入
用户将域名指向 CDN 提供的 CNAME 地址:
dns; 用户域名配置 www.example.com. 600 IN CNAME www.example.com.cdn-provider.com.
2. 智能 DNS 解析
CDN 的 DNS 服务器根据多种因素决定返回哪个边缘节点的 IP:
shell用户查询 www.example.com ↓ CNAME 到 CDN 域名 ↓ CDN DNS 服务器 ↓ 智能调度算法 ↓ 返回最优节点 IP
CDN DNS 调度策略
1. 地理位置调度
原理:根据用户的地理位置,返回最近的 CDN 节点
shell北京用户 → 返回北京 CDN 节点 IP 上海用户 → 返回上海 CDN 节点 IP 广州用户 → 返回广州 CDN 节点 IP 美国用户 → 返回美国 CDN 节点 IP
实现方式:
- 根据用户 DNS 查询来源 IP 判断位置
- 使用 GeoIP 数据库
- 返回地理位置最近的节点
2. 运营商调度
原理:根据用户所属运营商,返回相同运营商的节点
shell电信用户 → 返回电信线路 CDN 节点 联通用户 → 返回联通线路 CDN 节点 移动用户 → 返回移动线路 CDN 节点
优势:
- 避免跨运营商访问
- 减少网络延迟
- 提高传输速度
3. 负载均衡调度
原理:根据节点负载情况,将用户分配到负载较低的节点
shell节点 A:负载 80% → 减少分配 节点 B:负载 50% → 正常分配 节点 C:负载 30% → 优先分配
监控指标:
- CPU 使用率
- 带宽使用率
- 并发连接数
- 响应时间
4. 健康检查调度
原理:自动检测节点健康状态,剔除故障节点
shell节点 A:健康 ✅ → 正常服务 节点 B:故障 ❌ → 自动剔除 节点 C:健康 ✅ → 正常服务
健康检查方式:
- HTTP 状态码检查
- TCP 端口检查
- 响应时间检查
CDN DNS 解析流程详解
完整解析过程
shell1. 用户输入 www.example.com ↓ 2. 本地 DNS 查询 ↓ 3. 返回 CNAME: www.example.com.cdn-provider.com ↓ 4. 查询 CDN DNS 服务器 ↓ 5. CDN DNS 分析用户来源 IP ↓ 6. 应用调度策略(地理位置 + 运营商 + 负载) ↓ 7. 返回最优 CDN 节点 IP(如 203.0.113.10) 8. 用户访问 CDN 节点获取内容
首次访问 vs 缓存访问
首次访问(未缓存):
shell用户 → CDN 节点 → 回源到源站 → 缓存内容 → 返回用户
缓存访问:
shell用户 → CDN 节点(直接返回缓存内容)
CDN DNS 配置示例
场景 1:全站加速
dns; 主域名 CNAME 到 CDN www.example.com. 600 IN CNAME example.cdn-provider.com. ; 静态资源域名 CNAME 到 CDN static.example.com. 600 IN CNAME static.example.cdn-provider.com. ; 图片域名 CNAME 到 CDN img.example.com. 600 IN CNAME img.example.cdn-provider.com.
场景 2:动静分离
dns; 动态内容(不经过 CDN) www.example.com. 600 IN A 192.0.2.1 ; 静态内容(使用 CDN) static.example.com. 600 IN CNAME static.example.cdn-provider.com. css.example.com. 600 IN CNAME static.example.cdn-provider.com. js.example.com. 600 IN CNAME static.example.cdn-provider.com.
场景 3:多 CDN 厂商
dns; 主 CDN www.example.com. 600 IN CNAME example.cdn1-provider.com. ; 备用 CDN(通过权重或地理位置分流) ; 部分 DNS 服务支持智能分流
CDN DNS 的 TTL 设置
TTL 对 CDN 的影响
| TTL 设置 | 优点 | 缺点 |
|---|---|---|
| 短 TTL(60-300秒) | 故障切换快,调度灵活 | DNS 查询增加,源站压力 |
| 长 TTL(3600秒+) | 减少 DNS 查询,缓存效果好 | 故障切换慢,调度不灵活 |
推荐配置
dns; 主域名 - 中等 TTL www.example.com. 600 IN CNAME example.cdn-provider.com. ; 静态资源 - 较长 TTL static.example.com. 3600 IN CNAME static.example.cdn-provider.com.
CDN DNS 常见问题
问题 1:DNS 缓存导致调度失效
现象:
- 用户被调度到故障节点
- 更换节点后部分用户仍访问旧节点
解决:
- 降低 TTL 值
- 等待缓存过期
- 使用 CDN 的强制刷新功能
问题 2:跨运营商访问慢
现象:
- 电信用户访问联通 CDN 节点
- 延迟高,速度慢
解决:
- 确保 CDN 支持运营商调度
- 检查 DNS 配置是否正确
- 联系 CDN 服务商优化
问题 3:源站 IP 暴露
现象:
- 直接 ping 源站域名获得真实 IP
- 攻击者绕过 CDN 直接攻击源站
解决:
- 源站只允许 CDN IP 段访问
- 使用防火墙限制直接访问
- 分离源站域名和访问域名
主流 CDN 服务商的 DNS 配置
Cloudflare
dns; 修改 NS 记录到 Cloudflare example.com. 86400 IN NS lara.ns.cloudflare.com. example.com. 86400 IN NS greg.ns.cloudflare.com.
特点:
- 接管整个域名的 DNS
- 自动 CDN 加速
- 支持 CNAME Flattening
阿里云 CDN
dns; CNAME 接入 www.example.com. 600 IN CNAME www.example.com.w.kunlunar.com.
特点:
- 支持智能调度(地理位置 + 运营商)
- 国内节点丰富
AWS CloudFront
dns; CNAME 接入 www.example.com. 600 IN CNAME d1234abcd5678.cloudfront.net.
特点:
- 全球节点分布
- 与 AWS 生态集成
CDN DNS 优化技巧
1. 使用 HTTP DNS
绕过本地 DNS,直接通过 HTTP 获取最优节点:
shell客户端 → HTTP DNS 服务 → 返回最优 CDN IP
优势:
- 避免 DNS 劫持
- 更精确的调度
- 实时更新
2. 预热和刷新
预热:在高峰期前将热门内容推送到 CDN 节点 刷新:主动清除 CDN 缓存,强制回源
3. 监控和分析
- 监控各节点响应时间
- 分析用户地理分布
- 优化调度策略
面试常见问题
Q: CDN 是如何知道用户位置的?
A:
- 通过用户 DNS 查询的来源 IP 地址
- 使用 GeoIP 数据库查询 IP 对应的地理位置
- 返回距离最近的 CDN 节点
Q: 为什么 CDN 的 CNAME 记录 TTL 通常设置较短?
A:
- 便于快速故障切换
- 支持动态调度策略
- 适应节点扩缩容
- 但会增加 DNS 查询量
Q: 如果 CDN 节点故障,DNS 如何切换?
A:
- CDN 的健康检查系统检测到节点故障
- 自动将该节点从 DNS 解析结果中移除
- 用户下次查询时获得健康节点 IP
- 故障恢复后自动加回
总结
| 方面 | 说明 |
|---|---|
| 核心作用 | 智能调度用户到最优 CDN 节点 |
| 调度策略 | 地理位置、运营商、负载、健康状态 |
| 接入方式 | CNAME 指向 CDN 提供的域名 |
| TTL 设置 | 平衡调度灵活性和 DNS 查询量 |
| 优化方向 | HTTP DNS、预热刷新、监控分析 |
DNS 是 CDN 的"大脑",通过智能调度算法,确保用户始终访问到最优的边缘节点,从而实现加速效果。