写点什么

DNS 在架构中的使用

作者:EquatorCoco
  • 2024-08-01
    福建
  • 本文字数:1871 字

    阅读完需:约 6 分钟

1 介绍


DNS(Domain Name System,域名系统)是一种服务,它是域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的 IP 地址数串。简单来说,DNS 就是一个将我们输入的网址(比如 www.baidu.com )转换成对应的 IP 地址(比如 192.0.2.1)的系统。这个过程是自动且透明的,用户在浏览器中输入网址后,浏览器会向 DNS 服务器发起查询请求,DNS 服务器会根据域名解析出对应的 IP 地址,然后浏览器再根据这个 IP 地址去访问目标服务器。


2 实现原理


DNS 系统的工作原理大致如下:


2.1 递归查询


当客户端(如浏览器)需要解析一个域名时,它会首先向本地 DNS 服务器(如 ISP 提供的 DNS 服务器)发起查询请求。如果本地 DNS 服务器缓存中没有该域名的记录,它会向根 DNS 服务器发起查询。根 DNS 服务器会返回顶级域(TLD,如.com、.net 等)的 DNS 服务器地址。然后,本地 DNS 服务器会向这些顶级域 DNS 服务器发起查询,顶级域 DNS 服务器再返回下一级 DNS 服务器的地址,直至找到最终的 IP 地址。这个过程中,本地 DNS 服务器会递归地查询,直到找到结果或确定查询失败。


点击查看大图


递归查询是由 DNS 服务器主动帮主机查询的查询模式。‌


2.2 迭代查询


与递归查询不同,迭代查询中,本地 DNS 服务器在收到客户端的查询请求后,会向根 DNS 服务器发起查询,但根 DNS 服务器不会直接返回 IP 地址,而是返回下一级 DNS 服务器的地址。本地 DNS 服务器会再次向这个地址发起查询,以此类推,直到找到最终的 IP 地址。在这个过程中,每个 DNS 服务器只负责返回下一级 DNS 服务器的地址,而不是直接返回 IP 地址。


迭代查询则是客户端自己逐步查询,‌直到获得结果或遍历所有可能的查询途径。‌


2.3 强大的域名解析能力


DNS 不仅支持 A 记录(将域名映射到 IPv4 地址),还支持 AAAA 记录(将域名映射到 IPv6 地址)、CNAME 记录(别名记录,将域名映射到另一个域名)、MX 记录(邮件交换记录,指定处理该域名邮件的邮件服务器)等多种记录类型,以满足不同的需求。


3 在互联网架构中的作用


我们先看一个 Http 请求,从客户端开始调用,到服务端响应,它的整个 LifeCycle,以及 DNS 起到的作用


点击查看大图

流程步骤如下:

  1. Client 访问域名 www.taobao.com 请求到 DNS 服务器

  2. DNS 服务器返回域名对应的外网 IP 地址:10.88.0.1,这是代理服务 Nginx 的地址

  3. Client 继续访问外网 IP 10.88.0.1 向 Nginx 进行链接

  4. Nginx 配置了 n 个 Service(多副本模式)的内网 IP,如 192.168.0.100、192.168.0.101、192.168.0.102

  5. Nginx 的负载均衡通过流量调度策略(如 RR)对 IP List 进行轮询

  6. 请求最终落到某一个 Service 进行处理,获得计算结果


这是 DNS 最基本的能力,那除了 DNS 的 A 记录解析,在互联网架构中,他还有哪些贡献?


3.1 反向代理和动态扩展


反向代理是一种位于服务器和客户端之间的代理服务器。客户端将请求发送给反向代理,然后由代理服务器根据一定的规则将请求转发给后端服务器。后端服务器将响应返回给代理服务器,再由代理服务器将响应转发给客户端。 反向代理对客户端是透明的,客户端无需知道实际服务器的地址,只需将反向代理当作目标服务器一样发送请求就可以了。用户在 Client 只需要记住www.taobao.com,不需要知道他后面负载了多少真实的服务,这个就为扩展提供了很多便利,所以原来的架构可以优化为:


点击查看大图


对同一个域名配置多个 Nginx Service 的 IP,每当 DNS 解析请求,RR 轮询返回不同的 Nginx IP 地址,实现动态扩展的能力。


3.2 负载均衡


DNS 轮询是一种简单的负载均衡方法,通过改变 DNS 解析结果中的 IP 地址顺序,将用户请求分散到不同的服务器上。我们的上图中,Nginx 承担了这一层职责,我们可以尝试免去 Nginx 后看看效果怎么样!


点击查看大图


看着是去掉了一层网络请求,但是这种也存在一些问题。


  1. 无法实现智能的负载均衡

这种技能支持简单的轮询,无法支持更智能的 Weighted Round RobinIP HashLeast Connections等负载策略


  1. 无法实现探活和故障转移

使用 Nginx 做反向代理时,可以对 Service 进行存活探测,当服务挂掉的时候,进行流量迁移,实现故障转移和止损的目标。


3.3 智能路由和加速


智能 DNS: 智能 DNS 可以根据用户的地理位置、网络状况等因素,将用户请求解析到最适合的服务器上,从而提高访问速度和用户体验。CDN(内容分发网络): CDN 利用 DNS 技术将用户的请求解析到距离用户最近的缓存节点上,从而加快内容的传输速度,减少网络延迟。


如下图,虽然潮州在广东,但明显离厦门更近,所以流量分发到厦门机房:


点击查看大图


点击查看大图


4 总结


  • 动态扩展反向代理层

  • 支持简易轮询模式的负载均衡,但是无法探活 和 Fail Over

  • 智能 Dns 路由和 CDN 加速


文章转载自:Hello-Brand

原文链接:https://www.cnblogs.com/wzh2010/p/18031151

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
DNS在架构中的使用_架构_EquatorCoco_InfoQ写作社区