出租窝

内网 DNS 平台(8):可靠性——从 MVP 单机到 HA 的演进

背景

聊到可靠性,先把态度说清楚:HA 当然想要。DNS 是基础设施的基础设施,它挂了,所有依赖名字的系统都会跟着抖。但 MVP 阶段的现实是:权威 DNS 只有一台机器,团队的精力只够把一件事做对。

所以这个阶段的可靠性策略不是"做 HA",而是两句话:先保证单机可用,再保证备份可靠——HA 是 roadmap,不是放弃。

这一篇讲单机阶段怎么把可靠性做到位,用三个著名事故当警示,最后给出 HA 的演进路径和触发条件。

单机阶段的可靠性三件套

第一件:git repo 就是版本化备份。 这是 GitOps 设计的副产品,也是我最喜欢的一笔。公共 zone 的权威数据源本来就是 git 仓库(GitOps 篇会展开),个人 zone 则有一个导出器,每天把所有记录快照导出到另一个 git 仓库。两边合在一起意味着:整个 DNS 平台的全部状态,都有完整的版本历史。

由此得到一个极低的重建成本:装一台 PowerDNS + git sync 一次,平台就回来了。 不需要备份软件,不需要恢复演练的复杂流程,git clone 就是恢复。

第二件:递归缓存是天然的故障保护网。 权威 DNS 挂掉后,公司递归 DNS 里还缓存着 TTL 期内的所有记录——大部分服务在缓存过期前毫无感知。TTL 300 秒意味着你有至少五分钟的"隐形缓冲",而实际感知往往更久(热点记录会被持续刷新)。这不是不修的理由,但它是单机现实的减压阀。

第三件:依赖降级预案。 平台登录依赖 LDAP,LDAP 挂了怎么办?留一个本地 admin 账号兜底,只在 LDAP 故障时启用。DNS 挂了平台还能查(直连权威),平台挂了 DNS 不受影响(数据面和管理面分离)——每一层都问过自己"上一层挂了我会怎样"。

三个事故

单机策略定下来后,我专门重读了三个著名事故的复盘,确认自己的取舍站得住,也知道未来 HA 要解决什么。

2016 年 Dyn 被 DDoS。Mirai 僵尸网络打瘫了 Dyn——一家大型 DNS 托管商。后果是 Twitter、Netflix、GitHub 等一批把 DNS 全部托管在 Dyn 的公司集体受影响。这个事故的教训朴素到残酷:你的应用做得再好,DNS 全押在一家,就是单点。 事后行业流行的做法是用两家 DNS 提供商互为备份。对应到我的设计:内网权威虽然是单机,但"递归缓存 + 备份重建"是另一种形式的减压和恢复,HA 阶段则必须考虑第二节点。

2021 年 Facebook 全球宕机。一次例行维护中的命令错误切断了骨干网,BGP 路由被撤销,权威 DNS 全球不可达。最值得注意的是细节:DNS 服务器本身一直是好的,坏的是"到不了"——可达性和可用性是两回事。而连锁反应远不止解析:监控系统打不开、修复工具连不上、连数据中心的门卡都刷不开。这个事故讲的是依赖链根部的放大效应:越靠底层的系统,故障的爆炸半径越不成比例。DNS 就坐在根部。

2017 年 GitLab 删库。管理员误删生产数据库,去恢复时发现五层备份机制层层失效——有的没在跑,有的版本不对,有的从来没验证过恢复。这个事故直接印证了我的第一条:备份不验证等于没有备份。git 即备份的方案里,我把"定期在测试机做一次完整重建"写进了运维例行——备份的价值只在恢复的那一刻兑现。

HA 演进路径

roadmap 里的 HA 是明确的,分两步:

第一步:主备权威。第二台 PowerDNS 用 zone transfer(AXFR)做数据同步,递归 DNS 的转发配置里写两个地址。权威层的数据面(PowerDNS 自身)几乎零改造,要补的是平台侧:导出器要把快照推给两台、健康检查要覆盖两台。

第二步:管理面冗余。API、数据库、投影引擎的多实例。这一步比第一步复杂得多,也靠后得多——管理面挂了的后果是"暂时不能改记录",数据面挂了的后果是"全公司解析不了",两者的优先级天然不同。

什么时候单机不够用

触发 HA 的条件我也提前写下来了,避免"什么时候该做"变成永远的拖延:

最后

可靠性的取舍本质是概率和成本的交换:单机 + 可靠备份,覆盖了"硬件坏了"和"数据丢了"两类最常见故障;没覆盖的"机房级中断"和"高并发冲击",留给 HA 阶段,用明确的触发条件保证它不被遗忘。

HA 是 roadmap 不是放弃——但备份的可靠性,从第一天起就没有折扣。

备份不验证等于没有备份;恢复演练的频率,才是备份系统的真实 SLO。

下一篇看看市面上:每个模块,别人都是怎么做的,我参考了什么、为什么不直接用。