HTTPDNS
传统DNS存在的问题
1.域名缓存问题
服务商为了节约流量计算的成本,会将一些经常访问的域名以及IP的映射在本地进行缓存。当有其它相同的请求时,会直接返回这个缓存数据。
另外,有的运营商会把一些静态页面,缓存在本运营商的服务器中,这样用户的请求就不用再通过其它运营商的服务器访问静态资源。在域名解析的时候,不会将用户导向真正的网站,而是指向这个缓存的服务器。
这些缓存都存在更新不及时问题,导致无法获取最新的数据,第一种情况还可能会导致全局负载均衡失败。
2.域名转发问题
假如你是运营商A的客户,当你发送请求到运营商A,A却将请求转发给运营商B,然后B去解析,然后返回一个在B运营商的网站地址。这样就会导致你每次访问都要跨运营商,速度就会很慢。
运营商转发用户请求可能会导致每次客户访问的时候都要跨运营商,速度就会很慢。
3.出口NAT问题
在局域网中的机器使用NAT地址转换访问外部网络时,权威的DNS服务器无法通过转换地址来判断客户端到底是来自哪个运营商,并且可能会导致误判运营商,导致跨运营商的访问。
4.域名更新问题
有的本地DNS服务器会忽略域名解析结果的TTL时间限制,在权威DNS服务器解析变更的时候,可能会导致解析结果在全网生效的周期非常漫长。
例如,双机房部署的时候,跨机房的负载均衡和容灾多使用DNS来做。当一个机房出问题之后,需要修改权威DNS,将域名指向新的IP地址,但是如果更新太慢,那很多用户都会出现访问异常。
5.解析延迟问题
DNS的查询过程需要本地DNS服务器迭代遍历多个DNS服务器,才能获得最终的解析结果,这会带来一定的时延,甚至会解析超时。
其实归结起来就是两大问题。一是解析速度和更新速度的平衡问题,二是智能调度的问题,对应的解决方案是HTTPDNS的缓存设计和调度设计。
HTTPDNS的工作模式
HTTPNDS其实就是,不走传统的DNS解析,而是自己搭建基于HTTP协议的DNS服务器集群,分布在多个地点和多个运营商。当客户端需要DNS解析的时候,直接通过HTTP协议进行请求这个服务器集群,得到就近的地址。
HTTPDNS主要适用于手机APP解析域名,因为它必须要通过客户端SDK去实现。
大致流程:
-
获取HTTPDNS服务器IP(这个IP一般不会变,可以在客户端写死。也可以通过传统DNS方式获取IP):在客户端的SDK里动态请求服务端,获取HTTPDNS服务器的IP列表,缓存到本地。随着不断地解析域名,SDK也会在本地缓存DNS域名解析的结果。 -
HTTPDNS服务器解析域名:如果本地没有相同的请求,就需要请求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":{"ip":"106.2.81.50","line":269692944}}
- HTTPDNS服务器进行负载均衡:手机客户端自然知道手机在哪个运营商、哪个地址。由于是直接的HTTP通信,HTTPDNS服务器能够准确知道这些信息,因而可以做精准的全局负载均衡。
- 客户端访问目标IP:客户端拿到最优IP后,就去访问对应的应用服务器。
当然,当所有这些都不工作的时候,可以切换到传统的LocalDNS来解析。
HTTPDNS的缓存设计
HTTPDNS就是将解析速度和更新速度全部由客户端SDK控制:
- 一方面,解析的过程,不需要本地DNS服务递归的调用一大圈,一个HTTP的请求直接搞定,要实时更新的时候,马上就能起作用;
- 另一方面为了提高解析速度,本地也有缓存,缓存是在客户端SDK维护的,过期时间、更新时间,都可以自己控制。
HTTPDNS的缓存设计策略分为客户端、缓存、数据源三层。
也就是手机客户端、DNS缓存、HTTPDNS服务器。
解析可以同步进行,也就是直接调用HTTPDNS的接口,返回最新的记录,更新缓存;也可以异步进行,添加一个解析任务到后台,由后台任务调用HTTPDNS的接口。
更新也可以使用同步更新,优点是实时性好,缺点是如果有多个请求都发现过期的时候,同时会请求HTTPDNS多次,其实是一种浪费;也可以使用异步更新,可以将多个请求都发现过期的情况,合并为一个对于HTTPDNS的请求任务,只执行一次,减少HTTPDNS的压力。同时也可以进行缓存的预加载。
HTTPDNS的调度设计
客户端嵌入了SDK,因而就不会因为本地DNS的各种缓存、转发、NAT,让权威DNS服务器误会客户端所在的位置和运营商,而可以很方便的拿到客户端的真实信息。
客户端:可以知道手机的地址、服务商等信息,HTTPDNS服务端可以根据这些信息,选择最佳的服务节点返回。
如果服务端返回多个IP,就需要客户端使用HTTPDNS返回的IP访问业务应用。客户端的SDK会收集网络请求数据,如错误率、请求时间等网络请求质量数据,并发送到统计后台,进行分析、聚合,以此查看不同的IP的服务质量。并选择最优IP进行访问。
服务端:应用可以通过调用HTTPDNS的管理接口,配置不同服务质量的优先级、权重。HTTPDNS会根据这些策略综合地理位置和线路状况算出一个排序,优先访问当前那些优质的、时延低的IP地址。
参考:极客时间《趣谈网络协议》
|