题干与适用场景
你需要为多租户 SaaS 设计权威 DNS 控制面。用户提交 A、AAAA、CNAME、TXT 等记录,系统要校验冲突、生成 zone 版本,通知权威节点并支持 AXFR/IXFR、DNSSEC、灰度、回滚与审计。请在规模、延迟和安全之间做出取舍。
面试官考察点
- 能否区分控制面、权威数据面和递归解析器。
- 是否以不可变 zone 版本和原子发布保证一致性。
- 是否理解 SOA serial、NOTIFY、AXFR/IXFR 的关系。
- 是否会设计租户隔离、权限、DNSSEC 密钥和防止错误发布。
- 是否能处理节点落后、部分发布、负缓存和回滚。
回答前需要澄清的问题
确认 zone 数量、记录写入速率、传播 SLO、是否需要 DNSSEC、节点地域、租户授权模型、变更是否必须审批,以及是否兼容只支持 AXFR 的旧节点。若未指定,假设全球多活权威集群和分钟级可见性。
30 秒回答框架
我会把控制面写入规范化记录库,按 zone 生成不可变版本并做静态校验,再由发布器原子替换权威节点的 zone。SOA serial 递增,NOTIFY 触发从主节点到从节点的 IXFR,无法增量时回退 AXFR。每次发布有状态、审计和回滚指针;DNSSEC 签名、租户权限和传播监控是发布门禁。
分步骤深入解答
1. 划分控制面和数据面
控制面保存租户、zone、记录和版本;权威数据面只回答已发布版本。递归解析器不属于你的写入链路,缓存与 TTL 会造成可见性延迟。版本对象应包含 canonical zone、SOA serial、校验和、签名状态和发布目标。
2. 设计写入与校验
变更以事务写入候选版本,校验 owner name、TTL、类型约束、CNAME 冲突、委派边界和租户配额。批量变更要有幂等 request id 和 optimistic version,避免两个编辑器互相覆盖。校验失败不产生可发布版本。
3. 原子生成与发布
发布器从候选版本生成 zone 文件或内存结构,运行语法、委派、循环和 DNSSEC 校验。通过后写入内容寻址对象并计算 checksum。权威节点采用版本切换或原子指针,不在半写入状态下服务新旧混合数据。
4. 传播协议与落后节点
主节点递增 SOA serial 并发送 DNS NOTIFY;从节点优先请求 IXFR,找不到增量链或校验失败时请求 AXFR。节点报告当前 serial、版本 checksum 和签名状态。落后节点在 serving 旧版本或摘除之间按可用性策略选择,不能静默返回空 zone。
5. TTL、负缓存与回滚
TTL 控制递归缓存,NXDOMAIN 也会被负缓存。发布器应先让新目标可用,再逐步调整 TTL;删除记录不能立即清除外部缓存。回滚切换到已验证旧版本并递增 serial,保留审计关联,不能复用旧 serial 让缓存误判未变更。
6. 安全与租户隔离
控制面使用细粒度 RBAC、zone 级授权、审批和双人保护;DNS UPDATE 或内部 API 需要认证与重放防护。DNSSEC 密钥放在受控 KMS/HSM,签名失败阻断发布。日志记录操作者、请求、版本、serial 和结果,不写入租户秘密内容。
7. 观测与故障演练
监控发布延迟、节点 serial 差异、IXFR/AXFR 比例、签名错误、SERVFAIL、NXDOMAIN 变化、查询成功率和区域分布。演练主节点故障、网络分区、增量链缺失、错误 zone、密钥轮换和回滚,确认旧版本仍可服务且不会扩散坏版本。
高质量示范回答
我会让控制面保存租户隔离的不可变 zone 版本,权威节点只服务一个已验证版本。写入时校验 owner、TTL、CNAME 冲突、委派和配额,批量请求带幂等 id 与乐观版本。发布器生成 canonical zone,校验语法、DNSSEC 和 checksum 后原子切换指针。
主节点递增 SOA serial,NOTIFY 从节点;从节点优先 IXFR,增量不可用或校验失败时 AXFR。节点报告 serial、checksum 和签名状态,落后节点按策略摘除或继续服务旧版本。TTL 和负缓存决定外部可见性,回滚切换到已验证旧版本并使用新 serial。RBAC、审批、KMS/HSM、审计、SERVFAIL 与 serial 差异监控,以及分区和密钥轮换演练构成上线门禁。
常见错误
- 把递归缓存延迟当作控制面发布失败。
- 直接编辑共享 zone 文件,导致半写入状态。
- 认为 NOTIFY 等于数据已经传播。
- IXFR 失败时返回空 zone 而不是回退 AXFR 或旧版本。
- 回滚复用旧 SOA serial。
- 让租户直接操作 DNSSEC 私钥。
- 没有 NXDOMAIN 负缓存和 SERVFAIL 监控。
追问及应对
追问一:为什么必须递增 SOA serial?
从节点和缓存用 serial 判断版本新旧。回滚也要使用单调更高的 serial,否则节点可能认为旧版本已经是最新。
追问二:IXFR 找不到增量怎么办?
请求 AXFR;若传输失败,保留当前已验证版本并告警,不服务空 zone。发布器应保留有限版本链供增量查询。
追问三:如何处理一个节点落后很多版本?
比较 serial 和 checksum,先摘除其流量或继续安全服务旧版本,再通过 AXFR 快速追平;追平后做查询抽样。
追问四:DNSSEC 签名失败能否先发布明文?
取决于 zone 的安全契约;若声明必须签名,应阻断发布并修复密钥或签名链,不能静默降级。