智能DNS解析:地域与运营商权重策略
智能DNS解析,说白了就是让DNS学会“看人下菜碟”。
你的用户在北京,就给他解析到北京机房的IP。用户在上海,就指到上海节点。用户用的是电信,就给他电信线路的地址。这就是多活部署最基础、也最关键的流量入口策略。
我在早期做多活项目时,犯过一个低级错误。当时只做了地域策略,完全没考虑运营商。结果北方联通用户全部涌入电信机房,延迟直接飙到200ms以上……嗯,那次被运维同事念叨了整整一周。
地域权重策略
地域策略,依据的是用户IP的地理位置。DNS服务商会维护一份IP地理信息库,查询到你的用户来自哪个城市、哪个省份,然后返回对应的后端IP。
基本配置模型
常见的做法是按区域划分:
- 华北区域:北京机房(权重70%)、天津机房(权重30%)
- 华东区域:上海机房(权重50%)、杭州机房(权重50%)
- 华南区域:广州机房(权重60%)、深圳机房(权重40%)
权重的作用是什么?
举个例子。华北区域北京机房配置更强大,我们可以给它70%的流量,天津机房只承担30%。这样既能利用好硬件资源,又不会让某个机房过载。
关键点:地域策略的粒度决定了精确度。城市级比省级精确,但IP库的维护成本也更高。我个人习惯先省级部署,再逐步细化到城市级。
运营商权重策略
在国内,网络环境比较特殊。电信、联通、移动三家运营商之间的互联带宽有限,跨运营商的延迟通常是同运营商的3-5倍。
所以,你必须针对每个运营商做独立的权重分配。
运营商流量分配逻辑
| 运营商 | 主节点 | 主权重 | 备用节点 | 备用权重 |
|---|---|---|---|---|
| 电信 | 电信机房A | 80% | BGP机房B | 20% |
| 联通 | 联通机房C | 70% | BGP机房D | 30% |
| 移动 | 移动机房E | 90% | BGP机房F | 10% |
为什么移动只给BGP机房10%?因为移动用户量庞大,但QoS限制严格,最好尽量压在移动自有机房中。我遇到过一家游戏公司,移动用户被解析到BGP机房后,经常出现丢包率超过5%的情况,后来不得不重新调整权重。
地域+运营商的组合策略
只做地域或只做运营商,都不够完善。实际生产环境必须组合使用。
组合策略的处理流程是这样的:
- 接收用户的DNS查询请求
- 解析用户源IP,获取地域属性(例如:广东省)
- 解析用户源IP,获取运营商属性(例如:电信)
- 查询策略表:广东省-电信 → 广州电信机房(权重80%)、深圳电信机房(权重20%)
- 根据权重,随机选择一个IP返回
# 伪代码:组合策略匹配逻辑
def resolve_dns(user_ip):
region = get_region(user_ip) # 广东
isp = get_isp(user_ip) # 电信
# 查表:region + isp 精准匹配
target = policy_table.get(f"{region}_{isp}")
if target:
return weight_select(target)
# 降级:只匹配地域
fallback = policy_table.get(f"{region}_default")
if fallback:
return weight_select(fallback)
# 兜底:默认节点
return default_nodes[0]
你想想看,如果没有组合策略,一个广东电信用户可能被解析到北京电信节点。虽然同运营商,但物理距离太远,延迟照样很高。组合策略就是为了同时锁定“最近的”和“最快的”。
权重调整的实践经验
权重不是一成不变的。你需要根据实时容量和故障情况动态调整。
- 扩容时:新机房权重从小调大,比如从5%逐步提升到30%,观察稳不稳定
- 故障时:立即将故障机房权重降为0%,让DNS TTL过期后自动切换
- 日常巡检:每季度重新评估各节点容量,调整权重比例
小技巧:DNS缓存时间不要设得过长。我建议主要节点TTL设为60秒,故障时能快速切换。当然,如果缓存太短,DNS查询压力会变大,这个平衡需要自己把握。
避坑指南
我曾经踩过的一个坑:只配置了地域策略,忽视了运营商权重。某次电信骨干网割接,电信用户大面积故障,但因为是同运营商,DNS解析结果没变,所有流量照常涌入电信机房。用户这边,完全等不到故障切换。后来我花了一整天,给每个地域都配上了运营商降级策略。
几个必须注意的点:
- IP库的准确性:地域和运营商标识经常不准。我习惯每季度校验一次,拿真实用户IP抽样测试。
- 权重的精度:不要设100%和0%。即使你认为某个节点永远不会故障,也要留一个备用节点,哪怕权重只有1%。
- 多级降级:精准匹配失败后,必须有地域级降级、全国级兜底。否则用户可能直接“DNS解析失败”。
- TTL与权重的配合:权重变更后,老用户的DNS缓存不会立刻更新。如果要紧急切换,除了改权重,还要手动调低TTL。
最后提醒一句:不管策略多精细,一定要留一个默认兜底节点。最好是一个独立的BGP机房,能承接所有运营商的流量。这个节点平时权重可以很低,比如1%,但在极端故障时就是救命稻草。