目录
DNS概念
DNS(Domain Name System)服务是和 HTTP 协议一样位于应用层的 协议。它提供域名到 IP 地址之间的解析服务
除了进行域名到IP地址的转换外,DNS还提供了一些重要的服务:
- 主机别名 CNAME记录 ,全成Canonical Name(别名解析)。就是将一个域名设置成一个或多个别名,比如:baidu.com解析成smallsunl.com,taobao.com也解析成smallsunl.com
- 负载均衡
- 反向域名解析
上网的人分布在全世界各地,如果大家都去同一个地方访问某一台服务器,时延将会非常大。因而,DNS 服务器,一定要设置成高可用、高并发和分布式的。于是,就有了这样树状的层次结构。
- 根 DNS 服务器 :根DNS服务器通常并不直接对域名进行解析,而是返回顶级域 DNS 服务器的 IP 地址
- 顶级域 DNS 服务器:返回权威 DNS 服务器的 IP 地址
- 权威 DNS 服务器 :返回相应主机的 IP 地址
一个服务器所负责管辖的(或有权限的)范围叫做区(zone)。每一个区设置相应的权威域名服务器,用来保存该区中的所有主机的域名到IP地址的映射。DNS 服务器的管辖范围不是以“域”为单位,而是以“区”为单位
DNS 解析流程
假定域名为m.xyz.com的主机想知道另一个主机y.abc.com的IP地址。例如,主机m.xyz.com打算发送邮件给y.abc.com。这时就必须知道主机y.abc.com的IP地址。
1、主机m.abc.com先向本地DNS服务器dns.xyz.com进行递归查询。
- 那本地域名服务器 (本地 DNS) 是什么呢?如果是通过 DHCP 配置,本地 DNS 由你的网络服务商(ISP),如电信、移动等自动分配,它通常就在你网络服务商的某个机房。
- 本地域名服务器一般会缓存顶级域名服务器的映射,因此根域名服务器不经常被访问
2、本地DNS收到请求后,查询本地缓存。
- 如果找到y.abc.com,就直接返回IP地址。
- 如果没有,本地DNS采用迭代查询。它先向一个根域名服务器查询。根域名服务器是最高层次的,全球共有 13 套。它不直接用于域名解析,但能指明一条道路。
3、根域名服务器收到本地DNS的请求,发现后缀是.com,就回告诉本地DNS,下一次应查询的顶级域名服务器dns.com的IP地址
4、本地DNS转向问顶级域名服务器。
- 顶级域名服务器就是大名鼎鼎的比如 .com、.net、 .org 这些一级域名,它负责管理 二级域名,比如 163.com,所以它能提供一条更清晰的方向。
5、顶级域名服务器dns.com告诉本地DNS,下一步应查询的权威服务器dns.abc.com的IP地址。
6、本地DNS向权威域名服务器dns.abc.com进行查询。为啥叫权威呢?就是我的域名我做主。
7、权威域名服务器dns.abc.com告诉本地域名服务器,所查询的主机的IP地址。
8、本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接
递归查询和迭代查询
- 主机向本地域名服务器的查询一般都是采用递归查询。如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文
- 本地域名服务器向根域名服务器的查询通常是采用迭代查询。当根域名服务器收到本地域名服务器的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地域名服务器进行后续的查询。
负载均衡
1、DNS 首先可以做内部负载均衡
- 例如,一个应用要访问数据库,在这个应用里面应该配置域名,因为一旦这个数据库,因为某种原因,换到了另外一 台机器上,且有多个应用都配置了这台数据库的话,只要在 DNS 服务器里,将域名映射为新的 IP 地址,这个 工作就完成了,大大简化了运维。
- 在这个基础上,我们可以再进一步。例如当被访问的应用撑不住的时,部署多个。在多个访问它的应用中只要配置成为域名,在域名解析时,我们只要配置策略,这次返回第一个 IP,下次返回第二个 IP,就可以实现负载均衡了。
2、DNS 还可以做全局负载均衡
为了保证应用的高可用,往往会部署在多个机房,每个地方都有自己的IP。当用户访问某个域名时,用IP地址轮询访问多个数据中心。如果一个数据数据中心挂了,在DNS服务器里面,将其对应的IP地址删除,就可以实现一定的高可用
示例:DNS 访问数据中心中对象存储上的静态资源
全局负载均衡器(GSLB,Global Server Load Balance)。在 yourcompany.com 的 DNS 服务器中,一般是通过配置 CNAME 的方式,给 object.yourcompany.com 起一个别名,例如 object.vip.yourcomany.com,然后告诉本地 DNS 服务器,让它请求 GSLB 解析这个域名,GSLB 就可以在解析这个域名的过程中,通过自己的策略实现负载均衡。
图中画了两层的 GSLB,是因为分运营商和地域。我们希望不同运营商的客户,可以访问相同运 营商机房中的资源,这样不跨运营商访问,有利于提高吞吐量,减少时延。
- 第一层 GSLB,通过查看请求它的本地 DNS 服务器所在的运营商,就知道用户所在的运营 商。假设是移动,通过 CNAME 的方式,通过另一个别名 object.yd.yourcompany.com, 告诉本地 DNS 服务器去请求第二层的 GSLB。
- 第二层 GSLB,通过查看请求它的本地 DNS 服务器所在的地址,就知道用户所在的地理位 置,然后将距离用户位置比较近的 Region 里面,六个内部负载均衡(SLB,Server Load Balancer)的地址,返回给本地 DNS 服务器。
- 本地 DNS 服务器将结果返回给本地 DNS 解析器。
- 本地 DNS 解析器将结果缓存后,返回给客户端。
- 客户端开始访问属于相同运营商的距离较近的 Region 1 中的对象存储,当然客户端得到了 六个 IP 地址,它可以通过负载均衡的方式,随机或者轮询选择一个可用区进行访问。对象 存储一般会有三个备份,从而可以实现对存储读写的负载均衡。
3、小结
- DNS 是网络世界的地址簿,可以通过域名查地址,因为域名服务器是按照树状结构组织的, 因而域名查找是使用递归的方法,并通过缓存的方式增强性能。
- 在域名和 IP 的映射过程中,给了应用基于域名做负载均衡的机会,可以是简单的负载均衡, 也可以根据地址和运营商做全局的负载均衡。
HTTPDNS
DNS可以根据名称查具体地址,还可以针对多个地址进行负载均衡。然而有时候这个DNS地址簿也会指错路,明明有个很近的地方,非要把你导向很远的地址,这是为什么呢?
传统 DNS 存在哪些问题?
1、域名缓存问题
并不是每次请求都会走一遍上面DNS解析流程的。它可以在本地做一个缓存。访问过一次就把结果缓存到本地,当再次被访问到,就直接返回这个缓存映射。这就会存在一个问题,别人问你哪有饭店,你凭记忆告诉了他,当别人到达的时候这个饭店却关门了。
另外,有的运营商会把一些静态资源,缓存到本地运营商的服务器内,当用户访问时,就不用跨运营商访问,这样既加快了速度,也减少了运营商之间流量计算的成本。大多情况下没问题,可是当页面更新时,用户访问到老的页面,问题就出来了。
还有上次访问后,本地缓存中的地址不一定是这次距离用户最近的地方,如果把这个地址返回给客户,那肯定就会绕远路。因此就使得全局负载均衡失败
2. 域名转发问题
缓存问题还是说本地域名解析服务,还是会去权威 DNS 服务器中查找。这样的问题是,如果A运营商的客户访问自己运营商的DNS服务器,但是A运营商偷懒,将解析请求转发给B运营商,B运营商去权威DNS服务器查询的话,权威服务器就会认为你是B运营商的,返回一个在B运营商的网站地址,导致客户每次访问都要跨运营商,速度就会很慢。
3. 出口 NAT 问题
NAT网络地址转换,每次从网关出去的包,都会换成新的IP地址。但是一旦有了NAT,权威服务器就没办法通过这个地址来判断客户到底是来自哪个运营商,而且极有可能因为转化过后的地址,误判运营商,导致跨运营商的访问。
4. 域名更新问题
本地 DNS 服务器是由不同地区、不同运营商独立部署的。对域名解析缓存的处理上,实现策略 也有区别,有的会偷懒,忽略域名解析结果的 TTL 时间限制,在权威 DNS 服务器解析变更的时候,解析结果在全网生效的周期非常漫长。
5. 解析延迟问题
DNS 的查询过程需要递归遍历多个 DNS 服务器,才能获得最 终的解析结果,这会带来一定的时延,甚至会解析超时。
HTTPDNS的工作模式
什么是HTTPDNS?
HTTPDNS其实是自己搭建基于HTTP协议的DNS服务集群,分布在多个地点和多个运营商。当客户需要DNS解析的时候,直接通过HTTP协议进行请求这个服务器集群,得到就近的地址。但是默认的域名解析都是走DNS的,因而使用HTTPDNS需要绕过默认的DNS路径,不能使用默认的客户端。使用 HTTPDNS 的,往往是手机应用,需要在手机端嵌 入支持 HTTPDNS 的客户端 SDK(软件开发工具包Software Development Kit)。
HTTPDNS工作模式解析
- 在客户端的SDK里动态请求服务器,获取HTTPDNS服务器的IP列表,缓存到本地,随着不断解析域名,SDK也会在本地缓存解析结果。
- 当一个应用要访问一个地址时,先看是否有本地缓存,如果有就直接返回。这个缓存和本地 DNS 的缓存不一样的是,这个是手机应用自己做的,而非整个运营商统一做的。如何更新、何时更新,手机应用的客户端可以和服务器协调来做这件事情。
- 如果本地没有,就需要请求 HTTPDNS 的服务器,在本地 HTTPDNS 服务器的 IP 列表中,选择 一个发出 HTTP 的请求,会返回一个要访问的网站的 IP 列表
- 手机客户端自然知道手机在哪个运营商、哪个地址。由于是直接的 HTTP 通信,HTTPDNS 服 务器能够准确知道这些信息,因而可以做精准的全局负载均衡。