CDN 与负载均衡
概念
CDN(Content Delivery Network)和负载均衡是优化网络架构的两大核心技术。CDN 让用户就近获取内容,负载均衡将请求分发到多个后端服务器。两者经常配合使用。
CDN 原理
什么是 CDN
CDN 是一组分布在各地的缓存服务器(边缘节点),将网站内容缓存到离用户最近的节点,减少延迟和源站压力。
CDN 访问流程
用户请求 www.example.com/image.png
↓
1. DNS 解析:www.example.com CNAME → cdn.example.com
↓
2. CDN 智能 DNS:根据用户 IP 返回最近的边缘节点 IP
↓
3. 用户访问边缘节点
↓
4. 边缘节点有缓存?
├── 有(缓存命中)→ 直接返回内容
└── 没有(缓存未命中)→ 回源请求 → 从源站获取 → 缓存到节点 → 返回给用户回源
当边缘节点没有缓存或缓存过期时,需要从源站获取最新内容:
| 场景 | 说明 |
|---|---|
| 首次访问 | 边缘节点还没有该资源的缓存 |
| 缓存过期 | TTL 到期,需要重新验证或获取 |
| 缓存被淘汰 | 节点存储空间不足,LRU 淘汰旧缓存 |
| 主动刷新 | 手动清除 CDN 缓存(发布新版本时) |
回源率是衡量 CDN 效果的关键指标 — 越低越好。
CDN 缓存策略
| 内容类型 | 缓存策略 | TTL |
|---|---|---|
| 静态资源(JS/CSS/图片) | ✅ 长期缓存 | 天到月(配合文件名哈希) |
| HTML 页面 | 短缓存或不缓存 | 秒到分钟 |
| API 响应 | 一般不缓存 | 不缓存或极短 |
最佳实践: 静态资源文件名加哈希(app.a1b2c3.js),设长 TTL。更新时文件名变了,自然获取新版本。
CDN 适用场景
| 场景 | 原因 |
|---|---|
| 静态资源加速 | 图片、视频、CSS/JS 就近获取 |
| 全站加速 | 动态请求也通过 CDN 优化路由 |
| 安全防护 | DDoS 防御、WAF |
| 直播/点播 | 视频流分发 |
负载均衡
三层负载均衡
| 层级 | 实现 | 工作层 | 性能 |
|---|---|---|---|
| DNS 负载均衡 | DNS 返回不同 IP | 应用层 | 高(无额外设备) |
| 四层负载均衡 | LVS / F5 | 传输层(TCP/UDP) | ✅ 极高 |
| 七层负载均衡 | Nginx / HAProxy | 应用层(HTTP) | 中高 |
实际架构常用组合: DNS 负载均衡 → LVS(四层)→ Nginx(七层)→ 后端服务器
DNS 负载均衡
同一域名配置多个 A 记录,DNS 轮询返回不同 IP:
example.com A 192.168.1.1
example.com A 192.168.1.2
example.com A 192.168.1.3优点: 简单,无需额外设备 缺点: DNS 缓存导致不够实时,无法感知服务器健康状态
四层负载均衡(LVS)
基于 IP 和端口转发,不解析 HTTP 内容,性能极高:
| 模式 | 原理 | 性能 |
|---|---|---|
| NAT | 修改目标 IP(请求和响应都经过 LVS) | 一般 |
| DR(Direct Routing) | 修改 MAC 地址(响应直接返回客户端) | ✅ 最高 |
| TUN(IP Tunneling) | IP 隧道封装 | 高 |
DR 模式最常用 — 请求经过 LVS,响应直接从后端返回客户端,LVS 不成为瓶颈。
七层负载均衡(Nginx)
解析 HTTP 内容,可以根据 URL、Header 等做更精细的路由:
upstream backend {
server 192.168.1.1:8080 weight=3; # 权重 3
server 192.168.1.2:8080 weight=1; # 权重 1
server 192.168.1.3:8080 backup; # 备用节点
}
server {
location /api/ {
proxy_pass http://backend;
}
location /static/ {
root /var/www/html; # 静态资源直接返回
}
}七层的优势: 可以根据 URL 路由到不同后端、可以做 SSL 终端、可以修改 Header、可以做缓存。
负载均衡算法
| 算法 | 说明 | 适用场景 |
|---|---|---|
| 轮询(Round Robin) | 依次分配 | 服务器性能相同 |
| 加权轮询(Weighted RR) | 按权重分配 | 服务器性能不同 |
| 最少连接(Least Connections) | 分配给连接数最少的 | 请求处理时间差异大 |
| 加权最少连接 | 结合权重和连接数 | 综合考虑 |
| IP 哈希 | 根据客户端 IP 哈希选择 | 需要会话保持 |
| 一致性哈希 | 环形哈希空间 | 缓存场景(加减节点影响小) |
| 随机 | 随机选择 | 简单场景 |
一致性哈希
为什么需要一致性哈希? 普通哈希(key % N)在增减节点时,几乎所有 key 都要重新映射。一致性哈希将节点和 key 映射到同一个环上,增减节点只影响相邻区间。
普通哈希:3 台变 4 台 → ~75% 的 key 需要重新映射
一致性哈希:3 台变 4 台 → ~25% 的 key 需要重新映射虚拟节点: 为了解决节点在环上分布不均的问题,每个物理节点映射多个虚拟节点,使负载更均匀。
健康检查
负载均衡器需要检测后端服务器的健康状态:
| 方式 | 说明 |
|---|---|
| TCP 检查 | 尝试建立 TCP 连接 |
| HTTP 检查 | 发送 HTTP 请求检查响应状态码(如 /health 返回 200) |
| 自定义脚本 | 执行自定义检查逻辑 |
upstream backend {
server 192.168.1.1:8080 max_fails=3 fail_timeout=30s;
# 30 秒内失败 3 次则标记为不可用,30 秒后重新尝试
}CDN + 负载均衡的典型架构
用户 → CDN(边缘节点,缓存静态资源)
↓ 回源(动态请求)
DNS 负载均衡(多机房)
↓
LVS(四层负载均衡,高性能转发)
↓
Nginx(七层负载均衡,URL 路由、SSL 终端)
↓
后端服务集群(Spring Boot 应用)面试常问 & 怎么答
Q1: CDN 的工作原理?
CDN 在全球各地部署边缘节点缓存内容。用户请求时,DNS 将域名解析到最近的节点。节点有缓存直接返回(缓存命中),没有则回源获取并缓存。核心价值是减少延迟和源站压力。
Q2: 四层和七层负载均衡的区别?
四层(LVS)基于 IP 和端口转发,不解析 HTTP 内容,性能极高;七层(Nginx)解析 HTTP 内容,可以根据 URL、Header 做精细路由,还能做 SSL 终端和缓存。实际架构常组合使用:LVS 在前做高性能转发,Nginx 在后做精细路由。
Q3: 一致性哈希是什么?解决什么问题?
普通哈希(key % N)在增减节点时大量 key 需要重新映射。一致性哈希将节点和 key 映射到环上,增减节点只影响相邻区间,大大减少数据迁移量。虚拟节点解决环上分布不均的问题。常用于分布式缓存。
Q4: 常见的负载均衡算法?
轮询(平等分配)、加权轮询(按性能分配)、最少连接(分给最闲的)、IP 哈希(会话保持)、一致性哈希(缓存场景)。选择取决于场景:性能相同用轮询,需要会话保持用 IP 哈希,缓存场景用一致性哈希。
看到什么就先想到这类
- 出现 CDN、边缘节点、回源。
- 出现负载均衡、LVS、Nginx 反向代理。
- 出现轮询、加权轮询、最少连接。
- 出现一致性哈希、虚拟节点。
- 出现健康检查、故障转移。