[趣谈网络协议学习] 18 DNS协议:网络世界的地址簿

DNS 服务器

DNS 服务器,一定要设置成高可用、高并发和分布式的。

DNS服务器树状的层次结构

  • 根 DNS 服务器:返回顶级域 DNS 服务器的 IP 地址。
  • 顶级域 DNS 服务器:返回区权威 DNS 服务器的 IP 地址。
  • 权威 DNS 服务器:返回相应主机的 IP 地址

DNS 解析流程

为提高 DNS 解析性能,很多网络都会就近部署 DNS 缓存服务器。

  1. 客户端向本地 DNS 发送 DNS 请求,解析 www.163.com 的 IP 地址。本地 DNS 由网路服务商(ISP)自动分配。
  2. 本地 DNS 在缓存中查找与域名对应的 IP,如果找到就返回;如果没有,请求根 DNS。根域名服务器是最高层次的,全球共有 13 套。它不直接用于域名解析,但能指明一条道路。
  3. 根 DNS 发现是后缀 .com,返回 .com 的顶级 DNS 的地址。
  4. 本地 DNS 转向问顶级 DNS。
  5. .顶级 DNS 返回 www.163.com 区域的权威 DNS 的地址。
  6. 本地 DNS 转向问权威 DNS 服务器
  7. 权威 DNS 服务器查询后将对应的 IP 地址返回。
  8. .本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。

DNS 解析流程

负载均衡

负载均衡 扩展阅读 见 文末参考资料

DNS 除了可以通过名称映射为 IP 地址,它还可以做另外一件事,就是负载均衡。

内部负载均衡

例如,某个应用要访问另外一个应用,如果配置另外一个应用的 IP 地址,那么这个访问就是一对一的。但是当被访问的应用撑不住的时候,我们其实可以部署多个。但是,访问它的应用,如何在多个之间进行负载均衡?只要配置成为域名就可以了。在域名解析的时候,我们只要配置策略,这次返回第一个 IP,下次返回第二个 IP,就可以实现负载均衡了。

全局负载均衡

为了保证我们的应用高可用,往往会部署在多个机房,每个地方都会有自己的 IP 地址。用户访问某个域名时,用 IP 地址轮询访问多个数据中心。如何一个数据中心挂了,在 DNS 服务器中将其对应的 IP 删掉,实现高可用。

我们肯定希望北京的用户访问北京的数据中心,上海的用户访问上海的数据中心,这样,客户体验就会非常好,访问速度就会超快。这就是全局负载均衡的概念。

示例:DNS 访问数据中心中对象存储上的静态资源

全国有多个数据中心,托管在多个运营商,每个数据中心三个可用区(Available Zone)。对象存储通过跨可用区部署,实现高可用性。在每个数据中心中,都至少部署两个内部负载均衡器,内部负载均衡器后面对接多个对象存储的前置服务器(Proxy-server)。

DNS 访问数据中心中对象存储上的静态资源

  1. 当一个客户端要访问 object.yourcompany.com 的时候,它要请求本地 DNS 解析器。
  2. 本地 DNS 解析器先查看看本地的缓存是否有这个记录。如果有则直接使用。
  3. 如果本地无缓存,则需要请求本地的 DNS 服务器。
  4. 本地的 DNS 服务器一般部署在你的数据中心或者你所在的运营商的网络中,本地 DNS 服务器也需要看本地是否有缓存,如果有则返回。
  5. 至 7. 如果本地没有,本地 DNS 才需要递归地从根 DNS 服务器,查到.com 的顶级域名服务器,最终查到 yourcompany.com 的权威 DNS 服务器,给本地 DNS 服务器,权威 DNS 服务器按说会返回真实要访问的 IP 地址。

对于不需要做全局负载均衡的简单应用来讲,yourcompany.com 的权威 DNS 服务器可以直接将 object.yourcompany.com 这个域名解析为一个或者多个 IP 地址,然后客户端可以通过多个 IP 地址,进行简单的轮询,实现简单的负载均衡。

在 yourcompany.com 的 DNS 服务器中,一般通过配置 CNAME 的方式,给 object.yourcompay.com 起一个别名,如 object.vip.yourcompany.com,然后告诉本地 DNS 服务器,去请求 GSLB 解析这个域名,GSLB 就可以在这个解析域名的过程中,通过自己的策略实现负载均衡。

图中有两层 GSLB,因为分运营商和地域。这样,不同运营商的客户可不跨运营商访问,提高吞吐量,减少时延。

  1. 第一层 GSLB,通过查看请求它的本地 DNS 服务器所在运营商,知道用户所在运营商。假设时移动,通过 CNAME 的方式,通过另一个别名 object.yd.yourcompay.com, 告诉 本地 GSLB 服务器去请求第二层的 GSLB。
  2. 第二层 GSLB,通过查看请求它的本地 DNS 服务器所在地址,知道用户的地理位置,将离用户近的 Region 里的6个内部负载均衡(SLB,Server Load Balancer) 的地址返回给本地 DNS 服务器。
  3. 本地 DNS 服务器将结果返回给本地 DNS 解析器。
  4. 本地 DNS 解析器缓存结果后,返回给客户端。
  5. 客户会得到属于相同运营商且距离较近的 Region 1 里的6个IP地址,随机/轮询访问即可。

参考资料:

趣谈网络协议(极客时间)链接:
http://gk.link/a/106nW

大型网站架构系列:负载均衡详解(1):
https://www.cnblogs.com/itfly8/p/5043435.html

大型网站架构系列:负载均衡详解(2):
https://www.cnblogs.com/itfly8/p/5043452.html

大型网站架构系列:负载均衡详解(3):
https://www.cnblogs.com/itfly8/p/5080743.html

大型网站架构系列:负载均衡详解(4):
https://www.cnblogs.com/itfly8/p/5080988.html


GitHub链接:
https://github.com/lichangke/LeetCode
知乎个人首页:
https://www.zhihu.com/people/lichangke/
CSDN首页:
https://me.csdn.net/leacock1991
欢迎大家来一起交流学习

发布了170 篇原创文章 · 获赞 16 · 访问量 2833

猜你喜欢

转载自blog.csdn.net/leacock1991/article/details/100859291