大型互联网公司的基础架构-DNS与HTTP DNS

55 阅读9分钟

如今互联网时代下,各类应用已经深度渗透到我们每个人都衣食住行、学习、娱乐等各种生活日常中,从一个应用中触碰到一个按钮到相关数据流畅的呈现在你的眼前,你可能会好奇:数据响应如此之快,应用后台是如何做到的呢?这就是本章要讨论的话题。

假设我们有个应用Fridendy是建立在单机房中,并为用户提供Web端和移动端两种使用途径,其中各角色的功能如下。

  • DNS服务器负责将用户访问Frideny的域名映射为公网IP地址(或称为整个机房的入口IP地址),然后用户请求就可以通过IP协议进入机房了。
  • LVS提供对外的公网IP地址作为机房的入口,同时作为四层负载均衡器将用户请求分发到Nginx集群
  • Nginx作为七层负载均衡器,根据HTTP(S)请求到协议头或URl路径规则将用户请求转发到对应的业务HTTP服务器
  • 业务服务层的HTTP服务真正处理用户的请求,根据不同的HTTP URL向RPC服务发送业务逻辑处理请求
  • 业务服务层的RPC服务执行核心业务逻辑。如果业务逻辑设计读/写数据,那么它会进一步访问数据层;如果业务逻辑涉及与其他RPC服务的交互,那么它也会调用其他RPC服务
  • 存储层是所有存储系统的集合,包括分布式缓存、关系型数据库、NoSQL数据库等。
  • 服务发现负责保存每个服务的动态访问地址列表,以便其他服务可以快速查找到某服务的访问地址,其功能与DNS相似。

这就是整个应用架构的各角色,今天我们来介绍DNS的相关知识

1.客户端连接机房的技术1:DNS

客户端启动时要做的第一件事就是通过互联网与机房建立连接,然后用户才可以在客户端与后台服务器进行网络通信。目前在计算机网络中应用较为广泛的网络通信协议是TCP/IP,它的通信地址是IP地址,因为IP地址有如下两个主要功能。

  • 标识设备:接入网络的设备必须有一个独一无二的IP地址,这样才能唯一标识一个网络目标
  • 网络寻址:将数据包从一个网络设备发送到另一个网络设备,需要携带目标网络设备的IP地址,通过TCP/IP中的IP路由寻址功能,数据包最终可以到达目标网络设备。

客户端要与机房建立连接,就需要知道机房的公网IP地址,但是IP地址不好记,因此便诞生了域名地址。如www.baidu.com,就可以访问对应的网站,它的底层就是DNS来实现的。

1.1 DNS的意义

DNS(Domain Name System,域名系统)是互联网中的核心服务,它维护域名与对应IP地址的映射关系,并提供将域名翻译为IP地址的域名解析功能。如果你觉得DNS仅仅只是维护域名与IP的关系,那就大错特错了。DNS在互联网中有非常广泛的作用。例如:

  • 通过维护域名与多个IP地址的映射关系,DNS可以将针对同一个域名的不同用户请求解析到不同的IP地址,从而缓解单一后台服务器的压力。
  • 公司要升级架构、网络改造等需要变更机房公网IP地址时,仅需在DNS服务器中重新配置最新的IP地址,不会对用户造成影响。
  • 基于DNS可以实现灵活的负载均衡策略。

1.2 域名结构与域名服务器

1.2.1 域名结构

image.png 如图所示,域名采用了层级化的树形结构来命名。顶端为根,下一级为顶级域名,指的是域名的后缀部分,如常见的.com , .net等;顶级域名的下一层是二级域名,指的是域名的倒数第二部分,一般表示域名注册人或主体所使用的网络名称,如这里的example.com;依次往下就是三级、四级等。每一级域名都控制下一级域名的分配。所以从这个例子来说,www.example.com. 顶级域名是.com,二级域名example.com,三级域名是www.example.com

1.2.2 域名服务器

根据域名的层级结构,可以把域名服务器分成4种不同的类型。

  • 根域名服务器(根DNS服务器):它负责互联网顶级域名的解析,掌握着全部顶级域名的域名和IP地址的映射关系
  • 顶级域名服务器(顶级DNS服务器):负责管理在每个顶级域名下注册的二级域名解析工作,即可以根据二级域名寻找到二级域名服务器的IP地址
  • 权威域名服务器(权威DNS服务器):这个是DNS最核心的部分,它决定着一个域名到底应该被解析成哪个IP地址,负责顶级域名下的二级域名、三级域名
  • 本地域名服务器(本地DNS服务器):本地域名服务器一般由网络运营商提供,它作为主机访问网络时域名解析的总代理,会将域名解析结果缓存到本地,以便加速主机后面的域名解析过程。

1.2.3 域名解析过程

域名解析一般采用递归查询方式执行,一个完整的域名解析过程,如下图所示:

image.png

当我们在访问某个域名的时候,首先在设备的本地缓存中查找是否有此域名对应的IP地址。本地缓存包括浏览器缓存和计算机系统Hosts文件DNS缓存。

如果没有本地缓存中没有对应的IP地址,则客户端向本地域名服务器发起域名服务器发起域名解析请求。然后开始递归完成域名解析。可以看到,除客户端查询本地缓存和本地域名服务器发起请求之外,域名解析的其余各环节均以本地域名服务器为中心进行递归查询,在这里本地域名服务器在域名解析的整个环节承担了代理的角色.

这里需要特殊说明的是,一旦本地域名服务器获得域名解析记录,它就会在本地进行记录缓存,以便下次客户端查询同一域名的时候直接获得结果。

2. 客户端连接机房的技术2: HTTP DNS

上面我们说到DNS,那其实DNS中会存在许多问题。首先,域名解析需要进行递归查询,这样会带来很高的访问延迟。另外,由于本地域名服务器是分地区、分运营商的,不同运营商实现的DNS解析策略不同。而且,由于本地域名服务器是分地区、分运营商的,不同运营商实现的DNS解析策略不同。

另外,最重要的是DNS劫持问题。这是一种互联网攻击方式,通过干预域名服务器把域名解析到错误的IP地址上,以达到用户无法访问目标网站或访问恶意网站的目的。很多知名的互联网公司备受DNS劫持的困扰,运营商可能基于本地域名服务器做DNS劫持,黑客可能篡改计算机Hosts文件做DNS劫持。

大家可能都有这样的经历:在浏览一个正常的网站时,左下角总会弹出各种与网站内容画风格格不入的垃圾广告,这很可能就是运营商DNS劫持的结果。这种会对网站运营造成很大的影响。

2.1 HTTP DNS的原理

HTTP DNS是基于HTTP,具有DNS解析能力的网络服务。它的原理非常简单:就是直接访问权威域名服务器,然后获得最优的IP地址。在客户端获取到域名IP地址后,直接向此IP地址发送业务协议请求。如果客户端需要访问这个网址,则会在HTTP header中指定Host字段为此IP地址即可。

这里大家可能会疑惑,不同运营商的用户访问同一个HTTP DNS服务器的IP地址,用户访问延迟问题如何解决?高可用如何保证?

实际上,HTTP DNS会采用 BGP(边界网关协议)等手段,让这个IP地址在全国各地都能就近访问,腾讯云就是如此来做,接入了BGP Anycast 网络架构,与全国最主要的17个运营商的用户都能快速访问到HTTP DNS服务器;所以,实际上HTTP DNS只是将域名解析协议由DNS协议换成了HTTP,原理并不复杂。但是相较于DNS,这一微小的变化带来了很大的好处。

  • 降低域名解析延迟:直接访问HTTP DNS服务器,缩短了域名解析链路,不需要递归查询。
  • 防止域名劫持:绕过了本地DNS服务器,避免了域名劫持问题。
  • 调度精准度更高:这就是能够快速找到精准更迅速的IP地址
  • 快速生效:当与域名关联的IP地址发生变更时,HTTP DNS服务不受传统DNS技术多级缓存的影响,域名更新能够更快覆盖到全量客户端

2.2 HTTP DNS 实践

即使我们上面说了HTTP DNS这么多优点,但是它并不能完全取代DNS,鉴于域名解析的重要性,实际我们多是:HTTP DNS服务器 ==> 本地DNS服务器。就是当HTTP DNS失效时,要降级到使用DNS技术。

另外,在HTTP DNS的实践中可以引入如下策略。

  • 安全策略:HTTP DNS是基于标准的HTTP的,为了保证数据安全,可以进一步使用HTTPS
  • IP地址选取策略:HTTP DNS可以将最优IP地址按照顺序多个下发,客户端默认选取第一个IP地址优先校验连通性,如果连通性不佳,则再选取下一个IP地址。
  • 批量拉取策略:在客户端应用冷启动或网络切换时,客户端自动批量拉取域名和IP地址列表的映射数据并缓存,以便后续使用。