DNS:不只是「域名查 IP」
DNS 的教科书定义是「域名到 IP 的映射」——但对后端工程师,DNS 是一个流量调度的杠杆:同一域名对不同地区返回不同 IP(GeoDNS 的智能调度)、故障时切换流量的开关(改 DNS 指向新机房)、负载分流的简单手段(DNS 轮询)。
DNS 的工程价值在于它的三个特性:分布式的缓存体系(解析结果层层缓存——「缓存的杠杆效应」:改一次 DNS、全网的缓存逐层生效或过期)、协议的古老与稳定(1983 年的设计沿用至今——「稳定」的代价是「慢」(DNS 的变更生效依赖 TTL)、用户的不可控(客户端的 DNS 行为不可控(「客户端的缓存」不受你管。
DNS 解析的过程:递归与迭代
解析的完整链路:用户输入 example.com → 本地缓存(操作系统的 DNS 缓存——「本机缓存」)→ 递归解析器(运营商 DNS 或公共 DNS(8.8.8.8、114.114.114.114——「递归解析器」的缓存(TTL 内直接返回——缓存未命中 → 递归查询:根服务器(.)→ 顶级域服务器(.com)→ 权威服务器(example.com 的 NS)——「逐级迭代」:递归解析器替你逐级问——根服务器返回 .com 的地址 → .com 返回权威服务器地址 → 权威服务器返回最终 IP——「递归与迭代的区别」:递归是「替你问到底」,迭代是「告诉你下一个该问谁」——客户端对解析器是递归、解析器对上游是迭代。「权威服务器」的角色:「权威服务器的类型」:自建(BIND、PowerDNS)、云 DNS(「云 DNS 的能力」(Route53、阿里云解析、Cloudflare——「云 DNS 的功能」:GeoDNS(按地域返回)、健康检查与故障切换(「健康检查+DNS」的容灾切换——「云 DNS」是流量调度的入口工具。
TTL 与缓存的权衡:TTL(Time To Live)——解析结果的缓存时间——「TTL 的权衡」:TTL 长(缓存命中高、解析快——变更生效慢(改 DNS 后全网最长要等旧 TTL 过期——「TTL 短」的反面(解析请求激增(解析器的压力、解析延迟的增加——「TTL 的经验值」:需要快速切换的服务用 60-300 秒、稳定服务用 3600 秒——「切换前降 TTL」的技巧(「提前降 TTL」(计划切换前 24-48 小时先把 TTL 降到 60 秒——变更快速生效后再升回来——「降 TTL」是 DNS 切换的标准操作。「DNS 变更的生效时间」:「理论 vs 实际」(理论上 TTL 过期即生效——实际上「递归解析器的无视 TTL」(部分运营商 DNS 无视你的 TTL、用自己的缓存策略——「运营商 DNS 的任性」——「生效时间」要按最长 TTL+运营商行为估算——「DNS 变更的生效」永远是「预计」不是「精确」**——这是 DNS 调度的一个工程现实。
智能调度:GeoDNS 与流量调度
GeoDNS 的实现:「按地域返回不同 IP」——解析器的视角(GeoDNS 根据「递归解析器的 IP」判断用户位置——「解析器 IP ≠ 用户 IP」(用户用公共 DNS 时——GeoDNS 看到的是 DNS 服务器的位置——「EDNS Client Subnet(ECS)」(客户端子网扩展(把用户的网段传给权威服务器——「ECS 的精度」(网段级的位置——「ECS 的隐私争议」(用户位置的泄露——「ECS」的启用与关闭。「GeoDNS 的调度场景」:就近接入(「就近接入」(用户连最近的机房——延迟的优化)、「故障切换」(机房故障——GeoDNS 健康检查失败——自动把流量切到健康机房——「DNS 故障切换」的特点(简单但慢(依赖 TTL 的过期——「分钟级的切换」——比 LB 的秒级切换慢——「DNS 切换」适合机房级故障、LB 切换适合实例级故障——「两层切换」的组合(DNS 管机房级、LB 管实例级。「权重调度」:「按权重分流」(灰度、压测(新机房 10% 流量——「DNS 权重」的灰度(机房级灰度的简单实现——与金丝雀发布的配合(「机房灰度」+「实例灰度」的两级灰度。
DNS 的攻防与现代化
DNS 劫持与污染:「DNS 劫持」的形态(运营商的 DNS 劫持(广告注入——「劫持」的防御(DoH/DoT 的加密解析——「DNS over HTTPS」(DNS 查询走 HTTPS 加密——「DoH 的普及」(浏览器的 DoH 默认开启(「DoH」绕过运营商劫持——「DoH 的副作用」(企业网络的 DNS 管控失效——「企业 vs 隐私」的博弈。「DNS 的安全加固」:DNSSEC(DNS 的签名验证——「DNSSEC」的部署率(不高——「DNSSEC」的复杂性——「DoH vs DNSSEC」(DoH 保传输、DNSSEC 验内容——「两层」的互补。「DNS 的现代运维」:「DNS 监控」(解析的监控(「解析正确性」的拨测(从多个地区拨测解析结果——「解析延迟」的监控(「DNS 的 SLO」(解析成功率与延迟的 SLA——「DNS 故障」的案例(大厂的 DNS 故障导致全站不可用的案例——「DNS 是单点」的风险认知(DNS 挂了比应用挂了更彻底——「DNS 的高可用」(多 DNS 提供商(「多 DNS 提供商」的冗余(两家 DNS 服务商的 NS——「DNS 的冗余架构」。「DNS 的优化」:「解析延迟的优化」(预解析(dns-prefetch、HTTP/3 的内置连接复用——「预解析」的前端优化——「TTL 与缓存的精细管理」——「DNS 的性能账」(一次解析的延迟(百毫秒级——缓存命中后忽略——「首次解析」的成本(冷启动的延迟——**「连接复用」减少解析次数。
DNS 的进阶:DNS 的安全运维与「解析故障的排查」
DNS 的进阶:DNS 的安全运维体系与解析故障的排查手册。「DNS 的安全运维」:「权威 DNS 的安全」:DDoS 的防护(「DNS DDoS」(DNS 放大攻击——「反射攻击」的原理(「ANY 查询」的禁止——「rate limit」(DNS 的响应限速——「DNS 的 Anycast」(anycast 的分布式防御——「Anycast」的架构。「DNSSEC 的部署」:DNSSEC 的签名链(「签名链的验证」——「DNSSEC 的部署成本」(签名管理、密钥轮换——「DNSSEC 的故障案例」(签名过期导致的解析失败——「KSK 的轮换」的运维——「DNSSEC」的适用评估。「解析故障的排查手册」:「排查的分层」:本机缓存 → 递归解析器 → 权威 DNS——「dig 的使用」(dig 的参数(@指定解析器、+trace 全链路——「dig +trace」的排查——「排查的常见发现」:TTL 未过期(旧缓存——运营商缓存(「运营商的缓存」的绕过(DoH、换解析器——「权威配置错误」(NS 记录、SOA 的问题——「排查的工具箱」(dig、nslookup、在线工具——「多地区拨测」(全球解析的验证(「拨测平台」的使用。「DNS 的容量与性能」:「权威 DNS 的容量」:QPS 的承载(「解析 QPS」的量级(热门域名的解析量——「权威的扩展」(DNS 的水平扩展——「缓存层」的部署(「递归的缓存」自建。「DNS 的成本」:「云 DNS 的成本」:按查询计费(「查询量」的成本——「成本优化的方向」(提高 TTL、减少记录——「TTL」的成本杠杆。DNS 的进阶总结:安全运维(DDoS 防护、DNSSEC、Anycast)+排查手册(dig 分层排查、多地区拨测)+容量与成本(解析 QPS、TTL 的成本杠杆)——「DNS 的故障」是「全站级」的故障——DNS 的运维优先级应该高于多数应用——「多提供商、多地区拨测、DoH 备援」的 DNS 冗余体系**,是每个中大型系统的标配。
DNS 高频问答
收尾前回答三个高频问题。「把 TTL 设成 0 行吗?」——不行的原因:「TTL=0 的后果」:解析请求的激增(每次都要递归解析——「递归解析器的压力」——解析延迟的增加(「每次解析都慢」——「TTL=0」被忽略(递归解析器的最小 TTL 强制——「被无视的 TTL」——「TTL 的下限」(60-300 秒是实际下限——「快速切换」的正确姿势(提前降 TTL——「TTL 的管理」是 DNS 变更的预置动作。「智能 DNS 调度准不准?」——精度的现实:「调度的精度」:解析器位置≠用户位置——「ECS 的精度提升」——「ECS 的普及率」(公共 DNS 的 ECS 支持——「无 ECS 时」的粗调度(解析器 IP 的位置——「粗调度」的偏差(跨区域的解析器——「精度的业务容忍」——「调度不准」的兜底(应用层的就近重试(「应用层的调度」兜底——「DNS 粗调+应用细调」的两级调度。「DNS 服务商挂了怎么办?」——冗余的架构:「多 DNS 提供商」:两家的 NS 记录(「NS 的多服务商」——主从同步(「主从的同步」(主厂商管理、自动同步从厂商——「同步的方式」(API 的自动同步——「故障的切换」(主故障的 NS 切换——「切换的生效」(NS 变更的生效慢(NS 的 TTL 长——「NS 切换」不现实——「双 NS 并行」才是正解——「两家并行、双活解析」的架构。DNS 的问答收束:DNS 工程的三个心智模型——「TTL 是保质期(越长越省越难改)、解析器是中间商(不一定听你的)、多厂商是保险(一家挂了另一家顶)」——「DNS 的变更永远有不确定性」——提前降 TTL、多地区验证、双厂商冗余——「把 DNS 当成「又老又倔的关键基础设施」来运维**。
小结
DNS 的工程学:解析的链路(本机缓存→递归解析器→根→顶级域→权威——递归替你问到底);TTL 的权衡(缓存命中与变更生效的跷跷板——「提前降 TTL」是切换的标准操作——运营商 DNS 的「任性」让生效时间永远只是「预计」);智能调度(GeoDNS 的就近接入与故障切换——「DNS 切机房级、LB 切实例级」的两层组合——ECS 的精度与隐私);攻防与现代化(DoH 对劫持的防御、DNSSEC 的内容验证、「多 DNS 提供商」的冗余——DNS 是比应用更底层的单点)。给架构师的 DNS 认知:DNS 是流量调度的「第一层」,也是最慢恢复的一层——LB 的切换是秒级、DNS 的切换是分钟到小时级——「变更速度」决定了 DNS 适合「机房级」的粗粒度调度——细粒度的调度交给 LB 与网关——「各层的调度粒度」要匹配「各层的变更速度」——这是 DNS 工程学的核心决策逻辑。
DNS 是互联网最古老的系统,也是流量架构的第一层地基——地基的变更慢如大陆漂移,但每次漂移都改变流量的版图。
读者留言
COMMENTS 暂无还没有留言,来说第一句?