躬行致知

DNS 协议全详解

DNS 协议部分知识详解

DNS 是什么

DNS 全称为 Domain Name System,即域名解析系统。它是一种将 IP 地址转换成对应的主机名(或将主机名转换成与之相对应的 IP 地址)的系统。可以抽象类比为互联网的电话簿,它记录着域名和 IP 地址的映射关系,能够方便我们快速地访问某个网站。

核心概念

系统角色

DNS 系统主要由两种服务器构成,它们各司其职,共同完成域名解析任务:

角色作用
递归服务器代表用户去查找域名对应 IP 地址。接受用户的查询,并一步步向上迭代查询,直到拿到 IP 地址为止
权威服务器负责管理某个域名的权威解析,只负责回答自己负责的域名查询

查询流程

对于你在浏览器输入一个网址:www.example.com,DNS 查询的工作流程如下:

流程详解:

  1. 递归查询:你的电脑问递归解析器,www.example.com 的 IP 地址是多少?(这是唯一的递归查询,其他的都是迭代查询)

  2. 迭代查询:递归解析器开始“问路”:

    问根服务器:.com 的权威服务器在哪里?

    .com 服务器:example.com 的权威服务器在哪里?

    example.com 的权威服务器:www.example.com 的 IP 地址是多少?

  3. 返回结果:权威服务器返回 IP 地址 1.2.3.4,递归解析器将其缓存并返回你的电脑

记录类型

由 DNS 构建起的域名与 IP 地址之间的对应关系,称为“DNS 记录”。通过设置不同的解析记录,可以实现对主机名不同的解析效果,从而满足不同场景下的域名解析需求。而域名解析记录,主要有以下几种类型:

记录类型作用
A将域名指向一个 IPv4 地址
AAAA将域名指向一个 IPv6 地址
CNAME将域名指向另一个域名
MX邮件交换记录,指定负责接收邮件的服务器地址
TXT文本记录,常用于验证域名所有权,SPF 反垃圾邮件等
NS指定该域名由哪台权威服务器来解析

而在解析记录中,有一列为 TTL,其全称为:Time To Live,即存活时间,用于告诉递归解析器,该条记录在缓存中可以存活多久。当 TTL 过期后,递归解析器会重新向权威服务器查询该条记录。

TTL 实践

IP 预热

在运维实践中,一个至关重要的实践是:变更 IP 前的“预热”:

场景:需要将 www.example.com 的 IP 解析从 1.2.3.4 变更为 5.6.7.8,当前的 TTL 是 24h

错误做法:直接在权威服务器上把 IP 变为 5.6.7.8,那么在接下来的 24h 内,全球会有大量的用户因为缓存了旧 IP 而无法访问您的网站

正确做法

提前一段时间(例如:提前 48h),将 www.example.com 的 TTL 变为与i给很短的值,例如:300s

等待 48h(远远大于旧的 TTL 值的时间),以确保全球所有递归服务器的旧缓存都已过期,并获取了短的 TTL

执行 IP 地址的变更

因为现在 TTL 缓存只有 5min,所以很快就会刷新,全球用户可以很快地获取到新的 IP 地址

等待变更稳定后,再将 TTL 恢复为原来较长的值,以提升性能

生产规范

生产环境中的 TTL 设置是一门艺术,也是平衡之术,对于不同的场景需求,需要不同的 TTL 设置:

服务类型TTL 设置生产实践理由
静态官网/宣传页12h ~ 24h内容稳定,IP 几乎不变,长 TTL 带来极佳的访问速度和用户体验
API 服务/核心业务300s甜点区。平衡性和灵活性,发生故障时,5min 内可以切换流量
CDN/CNAME 记录300s ~ 1800sCDN 节点可能调整,需要一定的灵活性,但也不能太短,否则失去了缓存的意义
MX 记录12h 以上MX 记录极其稳定,长 TTL 可以避免外域邮件服务器因找不到目标而退信
NS 记录24h ~ 48h域名服务器的地址是根基,必须超级稳定。长 TTL 确保解析本身不出问题
临时活动/灰度发布60s ~ 120s需要快速切换、回滚。允许运维人员在 1min ~ 2min 内控制全部用户流量
  • 分级设置:不要所有记录都使用同一个 TTL。核心 API 使用中等 TTL,基础设施(MX,NS)使用长 TTL
  • 默认设置:如果不知道如何设置的业务,300s 的 TTL 是一个安全、通用的起点
  • 变更前置:变更 IP 前,必须先调低 TTL
  • 监控警告:对 DNS 解析结果进行监控,必须确保变更后解析正确