DNS 服务器
在现实世界中,当您进行阅览新闻、在线下单、下载文件或观看直播时,您需要通过访问域名来访问目标网站,例如 youtube.com、google.com 等。您只需记住这些网站的名称,而非它们的 IP 地址,因为与网站名称相比,IP 地址是很难记住的。因此,您需要一个作为 DNS 服务器的网站/域名地址本。
DNS 在日常生活中非常重要。每个在线的人都需要访问它,但同时,这对它来说也是一个非常大的挑战。如果 DNS 服务器出现故障,整个 Internet 网络都将关闭。
另外,上网的人分布在世界各地,如果每个人都去同一个地方访问某个服务器,延迟会非常大。因此,DNS 服务器必须设置为高可用、高并发和分布式的。
因此,它应具有如下树状层次结构:
- 根 DNS 服务器:返回顶级域 DNS 服务器的 IP 地址。
- 顶级域 DNS 服务器:返回权威 DNS 服务器的 IP 地址。
- 权威 DNS 服务器:返回对应主机的 IP 地址。
DNS 解析过程
为了提高 DNS 解析性能,许多网络会根据位置部署 DNS 缓存服务器。DNS 解析过程如下:(这里以访问 google.com 为例)
-
客户端会发出 DNS 请求,询问 google.com 的 IP 是什么,它会先在浏览器缓存中查找 google.com 的 IP 地址。
-
然后请求将被发送到本地 DNS 服务器。本地 DNS 服务器由您的网络服务供应商 (ISP, Internet Service Provider) 自动分配,这通常是您的 ISP 提供的路由器。
-
本地 DNS 服务器收到来自客户端的 DNS 请求,它会在其缓存中查找 google.com 的 IP 地址。如果它可以找到对应的条目,它将直接将 IP 地址返回给客户端。否则,本地 DNS 服务器会询问它的根域名服务器:“你能告诉我 google.com 的 IP 地址吗”?根域名服务器作为最高级别的 DNS 服务器,全球共 13 台。它不会直接解析域名,而起到一个“指路”的作用。
-
根 DNS 服务器收到本地 DNS 的请求,发现要查找域名的后缀是
.com
,然后告诉本地 DNS 服务器:“好的,你要找的既然是.com
后缀的域名,它是由.com
管理的。这里是.com
区域的顶级域 DNS 服务器的 IP 地址,去找它问吧”。 -
本地 DNS 服务器转向
.com
区域的顶级域名服务器,并请求 google.com 的 IP 地址。顶级.com
区域 DNS 服务器再次为该请求指明了方向。它提供了负责 google.com 的权威 DNS 服务器的 IP 地址。 -
本地 DNS 服务器然后转向了权威 DNS 服务器并询问 google.com 的 IP 地址。这次,google.com 的权威 DNS 服务器是域名解析结果的原始来源。它会将 google.com 的 IP 地址直接返回到本地 DNS 服务器。
-
然后本地 DNS 服务器将 IP 返回给客户端并将其缓存。至此,DNS 解析完成。
总结一下,我画了下面这张图:
DNS 负载均衡
内部负载均衡
DNS 服务器首先进行内部负载均衡。比如,应用要访问数据库,应该在应用中配置数据库的 IP 地址,还是应该配置数据库的域名呢?
很明显,应该配置域名,因为一旦数据库因为某种原因换到另一台机器上,如果多个应用都配置了这个数据库,一旦 IP 地址改变了,所有这些应用都需要重新修改。
但是,如果配置了域名,只要在 DNS 服务器中将域名映射到一个新的 IP 地址就完成了这项工作,如此大大简化了运维工作。
在此基础上,我们可以走得更远。例如,如何在访问它的多个应用程序之间进行负载均衡?只需将其配置为域名即可。在域名解析中,我们只需要配置策略,这次返回第一个 IP,下次返回第二个 IP,就可以实现负载均衡了。
全局负载均衡
为了保证我们的应用程序的高可用性,它们经常被部署在多个计算机数据中心,而每个地方都会有自己的 IP 地址。
当用户访问一个域名时,这个 IP 地址可以轮询多个数据中心。如果某个数据中心由于某种原因宕机了,只要在 DNS 服务器中删除该数据中心对应的 IP 地址即可。这样就可以实现一定程度的高可用。
另外,我们肯定希望纽约的用户访问纽约的数据中心,西雅图的用户访问西雅图的数据中心,这样客户体验会非常好,访问速度会超级快。这就是全局负载均衡的概念。
我们来看看它是如何工作的,假设全国有多个地区,每个地区都有三个可用区域。
-
当客户端要访问 app.metaleap.com 时,需要将域名转换为 IP 地址才能访问,所以需要请求本地 DNS 解析器。
-
本地 DNS 解析器首先检查本地缓存是否有此记录。如果有,直接使用。
-
如果没有本地缓存,则需要请求本地 DNS 服务器。
-
本地 DNS 服务器也需要检查本地是否有缓存,如果有则返回。
-
如果没有本地 DNS,需要从根 DNS 服务器递归查找
.com
的顶级域名服务器,直到找到 metaleap.com 的权威 DNS 服务器,交给本地 DNS 服务器。权威 DNS 服务器通常会返回真实 IP 地址。
对于不需要全局负载均衡的简单应用,metaleap.com 的权威 DNS 服务器可以直接将域名 app.metaleap.com 解析为一个或多个 IP 地址,然后客户端可以使用多个 IP 地址进行轮询来实现简单的负载均衡。
但是对于复杂的应用,尤其是跨区域、跨数据中心的大型应用,需要更复杂的全局负载均衡机制,这需要专门的设备或服务器来做这件事——全局负载均衡器(GSLB,Global Load Balancer)。
在 metaleap.com 的 DNS 服务器中,一般通过配置 CNAME,给 app.metaleap.com 起一个别名,如 app.vip.metaleap.com,然后告诉本地 DNS 服务器去请求 GSLB 来解析域名,GSLB 在解析这个域名的过程中,可以通过自己的策略来实现负载均衡。
图中绘制了两层 GSLB,分别为数据中心和区域。我们希望不同数据中心的客户可以访问同一数据中心的资源,以提高吞吐量并减少延迟。
结论
DNS 是网络世界的通讯录,可以通过域名搜索地址,因为域名服务器是按树状结构组织的,所以域名搜索采用递归的方式,通过缓存来提升性能。
在域名和 IP 的映射过程中,应用程序有机会进行基于域名的负载均衡,可以是简单的负载均衡,也可以是基于地址、数据中心和区域的全局负载均衡。
链接:https://medium.com/geekculture/dns-deep-dive-421e321a0a06