蚊章汇 - Joe Williams
type: channel
link: https://linuxcn.bwsl.wang/author/701/
description: Joe Williams
items: GitHub 的 DNS 基础设施

GitHub 的 DNS 基础设施
type: item
date: 2017-09-10T00:59:10+08:00
description: 在 GitHub，我们最近从头改进了 DNS。这包括了我们如何与外部 DNS 提供商交互以及我们如何在内部向我们的主机提供记录。为此，我们必须设计和构建一个新的 DNS 基础设施，它可以随着 GitHub 的增长扩展并跨越多个数据中心。以前，GitHub 的 DNS 基础设施相当简单直接。它包括每台服务器上本地的、只具备转发功能的 DNS 缓存服务器，以及一对被所有这些主机使用的缓存服务器和权威服务器主机。这些主机在内部网络以及公共互联网上都可用。我们在缓存守护程序中配置了 区域 zone 存根 stub ，以在本地进行查询，而不是在互联网上进行递归。我们还在我们的 DNS 提供商处设置了 NS 记录，它们将特定的内部 域 domain 指向这对主机的公共 IP，以便我们网络外部的查询。这个配置使用了很多年，但它并非没有缺点。许多程序对于解析 DNS 查询非常敏感，我们遇到的任何性能或可用性问题在最好的情况下也会导致服务排队和性能降级，而最坏情况下客户会遭遇服务中断。配置和代码的更改可能会导致查询率发生大幅度的意外变化。因此超出这两台主机的扩展成为了一个问题。由于这些主机的网络配置，如果我们只是继续添加 IP 和主机的话存在一些本身的问题。在试图解决和补救这些问题的同时，由于缺乏测量指标和可见性，老旧的系统难以识别问题的原因。在许多情况下，我们使用 tcpdump 来识别有问题的流量和查询。另一个问题是在公共 DNS 服务器上运行，我们处于泄露内部网络信息的风险之下。因此，我们决定建立更好的东西，并开始确定我们对新系统的要求。我们着手设计一个新的 DNS 基础设施，以改善上述包括扩展和可见性在内的运维问题，并引入了一些额外的需求。我们希望通过外部 DNS 提供商继续运行我们的公共 DNS 域，因此我们构建的系统需要与供应商无关。此外，我们希望该系统能够服务于我们的内部和外部域，这意味着内部域仅在我们的内部网络上可用，除非另有特别配置，而外部域也不用离开我们的内部网络就可解析。我们希望新的 DNS 架构不但可以基于部署的工作流进行更改，并可以通过我们的仓库和配置系统使用 API 自动更改 DNS 记录。新系统不能有任何外部依赖，太依赖于 DNS 功能将会陷入级联故障，这包括连接到其他数据中心和其中可能有的 DNS 服务。我们的旧系统将缓存服务器和权威服务器在同一台主机上混合使用。我们想转到具有独立角色的分层设计。最后，我们希望系统能够支持多数据中心环境，无论是 EC2 还是裸机。实现为了构建这个系统，我们确定了三类主机： 缓存主机 cache 、 边缘主机 edge 和 权威主机 authority 。缓存主机作为 递归解析器 recursive resolver 和 DNS “路由器” 缓存来自边缘层的响应。边缘层运行 DNS 权威守护程序，用于响应缓存层对 DNS 区域 zone 的请求，其被配置为来自权威层的 区域传输 zone transfer 。权威层作为隐藏的 DNS 主服务器 master ，作为 DNS 数据的规范来源，为来自边缘主机的 区域传输 zone transfer 提供服务，并提供用于创建、修改或删除记录的 HTTP API。在我们的新配置中，缓存主机存在于每个数据中心中，这意味着应用主机不需要穿过数据中心边界来检索记录。缓存主机被配置为将 区域 zone 映射到其 地域 region 内的边缘主机，以便将我们的内部 区域 zone 路由到我们自己的主机。未明确配置的任何 区域 zone 将通过互联网递归解析。边缘主机是地域性的主机，存在我们的网络边缘 PoP（ 存在点 Point of Presence ）内。我们的 PoP 有一个或多个依赖于它们进行外部连接的数据中心，没有 PoP 数据中心将无法访问互联网，互联网也无法访问它们。边缘主机对所有的权威主机执行 区域传输 zone transfer ，无论它们存在什么 地域 region 或 位置 location ，并将这些区域存在本地的磁盘上。我们的权威主机也是地域性的主机，只包含适用于其所在 地域 region 的 区域 zone 。我们的仓库和配置系统决定一个 区域 zone 存放在哪个 地域性权威主机 regional authority ，并通过 HTTP API 服务来创建和删除记录。 OctoDNS 将区域映射到地域性权威主机，并使用相同的 API 创建静态记录，以及确保动态源处于同步状态。对于外部域 (如 github.com)，我们有另外一个单独的权威主机，以允许我们可以在连接中断期间查询我们的外部域。所有记录都存储在 MySQL 中。可运维性迁移到更现代的 DNS 基础设施的巨大好处是可观察性。我们的旧 DNS 系统几乎没有指标，…