DNS与HTTPDNS

 

DNS服务的基本结构

根DNS服务器:返回顶级域DNS服务器的IP地址

顶级域DNS服务器:返回权威DNS服务器的IP地址

权威DNS服务器:返回相应主机的IP地址

DNS解析过程

为了提高DNS的解析性能,很多网络都会就近部署DNS缓存服务器。于是,就有了以下的DNS解析流程。

1.电脑客户端会发出一个DNS请求,问www.163.com的IP是啥,并发给本地DNS。那本地DNS是什么呢?如果是通过DHCP配置,本地DNS由你的网络服务商ISP,如电信,移动等自动分配,它通常就在你网络服务商的某个机房。

2.本地DNS收到来自客户端的请求,你可以想象这台服务器上缓存了一张域名与之对应IP地址的大表格。如果能找到www.163.com,它直接就返回IP地址。如果没有,本地DNS会去问它的根域名服务器:老大,能告诉我www.163.com的IP地址吗? 根域名服务器是最高层次的,全球共有13套。它不直接用于域名解析,但能指明一条道路。

3.根DNS收到来自本地DNS的请求,发现后缀是.com,说:“哦,www.163.com啊,这个域名是.com区域管理的,我给你它的顶级域名服务器的地址,你去问它吧”

4.本地DNS转向问顶级域名服务器:“老二,你能告诉我www.163.com的IP地址吗” 顶级域名服务器就是大名鼎鼎的比如.com, .net,.org。这些一级域名,它负责管理二级域名,比如163.com,所以它能提供一条更清晰的方向。

5.顶级域名服务器说:“我给你负责www.163.com区域的权威DNS服务器的地址,你去问它应该能问到”

6.本地DNS转向问权威DNS服务器:“您好,www.163.com对应的ip是啥?”163.com的权威DNS服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。

7.权限DNS服务器查询后将对应的IP地址 x.x.x.x告诉本地DNS

8.本地DNS再将IP地址返回给客户端,客户端和目标建立连接。

DNS的全局负载均衡概念

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

我们通过DNS访问数据中心中对象存储上的静态资源为例,看一看整个过程

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

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

但是对于复杂的应用,尤其是跨地域跨运营商的大型应用,则需要更加复杂的全局负载均衡机制,因而需要专门的设备或者服务器来做这件事情,这就是全局负载均衡器(GSLB)

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

图中画了2层的GSLB,是因为分运营商和地域。我们希望不同运营商的客户,可以访问相同运营商机房中的资源,这样不跨运营商访问,有利于提高吞吐量,减少时延。

1.第一层GSLB,通过查看请求它的本地DNS服务器所在的运营商,就知道用户所在的运营商,假设是移动,通过CNAME的方式,通过另一个别名object.yd.yourcompany.com,告诉本地DNS服务器去请求第二层的GSLB。

2.第二层GSLB,通过查看请求它的本地DNS服务器所在的地址,就知道用户所在的地理位置,然后将距离用户位置比较近的Region里面,6个内部负载均衡器的地址,返回给本地DNS服务器。

3.本地DNS服务器将结果返回给本地DNS解析器

4.本地DNS解析器将结果缓存后,返回给客户端。

5.客户端开始访问属于相同运营商的距离较近的Region 1中的对象存储,当然客户端得到了6个ip地址,它可以通过负载均衡的方式,随机或者轮询选择一个可用区进行访问。对象存储一般会有三个备份,从而可以实现对存储读写的负载均衡。

 传统DNS存在哪些问题?

1.域名缓存问题

它可以在本地做一个缓存,也就是说,不是每一个请求,都会去访问权威DNS服务器,而是访问过一次就把结果缓存到本地,当其他人来问的时候,直接就返回这个缓存数据。

再就是本地的缓存,往往使得全局负载均衡失败,因为上次进行缓存的时候,缓存中的地址不一定是这次访问离客户最近的地方,如果把这个地址返回给客户,那肯定就会绕远路。

2.域名转发问题

如果是A运营商的客户,访问自己运营商的DNS服务器,如果A运营商去权威DNS服务器查询的话,权威DNS服务器知道你是A运营商的,就会返回给一个部署在A运营商的网站地址,这样针对相同运营商的访问,速度就会快很多。

但是A运营商偷懒,将解析的请求转发给B运营商,B运营商去权威DNS服务器查询的话,权威服务器会误认为,你是B运营商的,那就返回给你一个在B运营商的网站地址吧,结果客户的每次访问都要跨运营商,速度就会很慢。

3.出口NAT问题

出口的时候,很多机房都会配置NAT,也即网络地址转换,使得从这个网关出去的包,都换成新的ip地址,当然请求返回的时候,在这个网关,再将ip地址转换回去,所以对于访问来说是没有任何问题的。

但是一旦做了网络地址的转换,权威的DNS服务器,就没办法通过这个地址,来判断客户到底是来自哪个运营商,而且极有可能因为转换过后的地址,误判运营商,导致跨运营商的访问。

4.域名更新问题

本地DNS服务器是由不同地区,不同运营商独立部署的。对域名解析缓存的处理上,实现策略也有区别,有的会偷懒,忽略域名解析结果的TTL时间限制,在权威DNS服务器解析变更的时候,解析结果在全网生效的周期非常漫长。但是有的时候,在DNS的切换中,场景对生效时间要求比较高。

例如双机房部署的时候,跨机房的负载均衡和容灾多使用DNS来做。当一个机房出问题之后,需要修改权威DNS,将域名指向新的IP地址,但是如果更新太慢,那很多用户都会出现访问异常。

5.解析延迟问题

从DNS的查询过程来看,DNS的查询过程需要递归遍历多个DNS服务器,才能获取最终的解析结果,这会带来一定的时延,甚至会解析超时。

HTTPDNS的出场

既然DNS解析中有这么多问题,那怎么办?难不成退回到直接用IP地址?这样显示不合适,所以就有了HTTPDNS

HTTPDNS其实就是,不走传统的DNS解析,而是自己搭建基于HTTP协议的DNS服务器集群,分布在多个地点和多个运营商。当客户端需要解析DNS的时候,直接通过HTTP协议进行请求这个服务器集群,得到就近的地址。

这就相当于每家基于HTTP协议,自己实现自己的域名解析,自己做一个自己的地址簿,而不使用统一的地址簿。但是默认的域名解析都是走DNS的,因为使用HTTPDNS需要绕过默认的DNS路径,就不能使用默认的客户端。使用HTTPDNS的,往往是手机应用,需要在手机端嵌入支持HTTPDNS的客户端SDK。

HTTPDNS的工作模式

在客户端的SDK里面动态请求服务端,获取HTTPDNS服务器的IP列表,缓存到本地。随着不断解析域名,SDK也会在本地缓存DNS解析的结果。

当手机应用要访问一个地址的时候,首先看是否有本地的缓存,如果有就直接返回。这个缓存和本地DNS的缓存不一样的是,这个是手机App自己做的,而非整个运营商统一做的。如何更新,何时更新,手机应用的客户端可以和服务器协调来做这件事。

如果本地没有,就需要请求HTTPDNS的服务器,在本地HTTPDNS服务器的IP列表中,选择一个发出HTTP的请求,会返回一个要访问的网站的IP列表。

请求的方式是这样的

curl http://106.2.xxx.xxx/d?dn=c.m.163.com
{"dns":[{"host":"c.m.163.com","ips":["223.252.199.12"],"ttl":300,"http2":0}],"client":{。。。

手机客户端自然知道手机在哪个运营商、哪个地址,由于是直接的HTTP通信,HTTPDNS服务器能够准确知道这些信息,因而可以做精准的全局负载均衡。

当然,当所有这些都不工作的时候,可以切换到传统的DNS来解析,慢也比访问不到好。

HTTPDNS的缓存设计

见常用的缓存架构

缓存更新可以同步更新,异步更新更好
 

HTTPDNS的调度设计

由于客户端嵌入了SDK,因而就不会因为本地DNS的各种缓存,转发,NAT,让权威DNS服务器误会客户端所在的位置和运营商,而可以拿到第一手资料。

在客户端,可以知道手机是哪个国家,哪个运营商,哪个省,甚至哪个市,HTTPDNS服务端可以根据这些信息,选择最佳的服务节点返回。

如果有多个节点,还会考虑错误率,请求时间,服务器压力,网络状况等,进行综合选择,而非仅仅考虑地理位置。当有一个节点宕机或者性能下降的时候,可以尽快进行切换。

要做到这一点,需要客户端使用HTTPDNS返回的IP访问业务应用。客户端的SDK会收集网络请求数据,如错误率,请求时间等网络请求质量数据,并发送到统计后台,进行分析,聚合,以此查看不同的IP的服务质量。

在服务端,应用可以通过调用HTTPDNS的管理接口,配置不同服务质量的优先级,权重。HTTPDNS会根据这些策略综合地理位置和线路状况算出一个排序,优先访问当前那些优质的、时延低的IP地址。

HTTPDNS通过智能调度之后返回的结果,也会缓存在客户端。为了不让缓存使得调度失真,客户端可以根据不同的移动网络运营商WIFI的SSID来分维度缓存,不同的运营商或者WIFI解析出来的结果会不同。

Q:使用HTTPDNS,需要向HTTPDNS服务器请求解析域名,可是客户端怎么知道HTTPDNS服务器的地址或者域名呢?

A:可以是通过域名解析,也可以是直接配置所有HTTPDNS服务器节点,这些服务器的地址一般不会变。阿里云采用的是配置ip列表的方式。

 

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值