0%

浅析DNS解析权重

前言:

本文针对权威DNS按比例返回域名解析记录实现访问流量调度的技术细节进行剖析

针对该功能可能出现的一些常见问题进行深入分析

对于该功能的使用提出最佳实践的探索

下文中所有的”LDNS”指递归DNS

功能说明

DNS可以针对一个域名设置权重比例,按照预设的权重比例给LDNS返回不同的解析结果,继而将用户访问流量引流到不同的服务器/集群上,达到负载均衡的目的。

前提条件:一个域名存在有2个或以上的IP地址才能设置权重比例

使用场景:

  • 有两个服务集群分布在A、B两地,其中A服务集群处理能力为2G,B服务集群为4G,通过DNS权重比例分配功能引导访问流量,使得服务集群流量达到合理的比例。
  • 客户端访问流量较大,导致单台服务节点/集群负载较高,增设新的服务节点/集群,同时通过DNS权重比例分配功能引导访问流量,缓解流量压力

典型案例:

调度概览

1)在test.com权威DNS上进行如下权重配置:

当将一个域名权重配置为2:1时,如下:

www.test.com TTL:3600 权重:2 A记录: 1.1.1.1

www.test.com TTL:3600 权重:1 A记录: 2.2.2.2

2)模拟三个不同区域用户DNS请求及业务流量访问:

(权威DNS按照1:2的比例给LDNS应答不同的结果,最终引流不同区域的客户端访问到指定的服务器上)

调度说明

  1. 三个不同区域的客户端依次发起了www.test.com域名的访问,系统/浏览器调用接口向LDNS发起了域名解析请求
  2. 三个不同区域LDNS依次收到解析请求后向权威DNS发起www.test.com域名解析请求
  3. 权威DNS根据自身算法,匹配到www.test.com的权重为2:1,前两次请求应答1.1.1.1,后1次请求应答2.2.2.2
  4. 三个不同区域客户端各自收到域名解析结果后,A、B客户端向服务器A:1.1.1.1发起连接,B客户端向服务器B:1.1.1.1发起连接

常见问题

负载不均衡

在实际使用过程中,偶尔会发现应用服务器的访问流量并没有符合我们在DNS上预设的权重比例,其中影响的因素是多种多样的,这里针对两个最常见的场景进行剖析

TTL缓存导致

不同区域的LDNS我们无法得知,可能不同运营商之间、省份之间、DNS品牌不同,他们LDNS的递归机制也不尽相同。 这里主要影响DNS解析权重效果的是LDNS对于TTL缓存时间的处理:在单个域名的TTL缓存中,LDNS收到该域名的解析请求后,不会再向权威DNS进行解析请求,而是直接将缓存的结果应答给客户端。

一般情况下:LDNS会遵循权威DNS给出应答的TTL值,在本地缓存指定的时间。

特殊情况下:LDNS针对TTL缓存具有自治的逻辑,举个例子:针对TTL最大不超过3600,最小TTL不小于60,超过这个范围的则强制修改为自身设定的最大/最小TTL。 (每个LDNS的自治情况不得而知,这里举个例子)

我们假设三个区域的客户端相同,且发起的请求频次也相同,但是其中一台LDNS的TTL缓存机制较为特殊,来分析一下如何导致的解析流量不均衡:(假设三个区域的客户端相同,且发起的请求频次也相同,但是其中一台LDNS的TTL缓存机制较为特殊)

权威DNS配置不变:

1)test.com权威DNS上有如下权重配置:

当将一个域名权重配置为2:1时,如下:

www.test.com TTL:3600 权重:2 A记录: 1.1.1.1

www.test.com TTL:3600 权重:1 A记录: 2.2.2.2

2)假设已经有了一轮请求,让区域ABC区域的LDNS已经在缓存了解析结果,但是区域C的LDNS缓存存在特殊机制,将TTL强制修改为300秒

3)在3600s内,区域A、B的客户端按照正常的调度,一直正常向服务器A:1.1.1.1发起了访问

4)而区域C的LDNS在300s后因为缓存过期,进而重新向权威DNS请求得到1.1.1.1的结果,导致客户端C也向服务器A:1.1.1.1发起访问,导致流量不均衡。

单个区域内访问频次过高导致

由权威DNS的权重比例调度规则我们可知:权威解析针对LDNS访问总次数来进行权重比例调度解析的。

如果在真实的业务访问中,在一个区域内客户端数量,或者客户端访问次数,相比其他所有的区域访问量都高的话,那么可能存在业务侧流量不均衡的现象,如下图:

(这里假设一个区域内的客户端数量相对较多)

相对区域A、B而言,这里区域C中的客户端数量更多,且都使用的是同一个LDNS

由于LDNS存在一定时间的缓存,大量的客户端得到的解析结果为2.2.2.2,客户端集群-c向服务器B:2.2.2.2发起了大量的访问,导致流量不均衡。

同样类似的场景,可以衍生为同一个区域内的单个/多个客户端发起数量较大的访问次数,进而导致流量不均衡,这里不做赘述。

小结

负载不均衡的问题需要结合实际的情况进行分析:其中包含单/多个区域大的范畴,也包含区域内LDNS自治的缓存逻辑、客户端的群体数量、单个客户端的访问频次小的范畴。

除了上述大小范畴,还包含各种特殊的细节,例如请求长链接、客户端缓存机制等场景,多者相互影响、相互渗透、相互作用,这就需我们使用具体问题具体分析的方法,找出问题的根本原因并加以解决。

最佳实践探索

使用DNS的权重比例功能,并不能完全保证两台机器/集群流量的完全一致,只能是一个“粗粒度”的域名解析流量调度,并不是像负载均衡那样基于会话、连接的调度,如果想要实现完全一致的调度建议使用专业的负载均衡设备或组件

虽然DNS按权重比例是“粗粒度”的,但是目前而言在多数据中心容灾、双活、多活等场景下基于DNS调度是目前较好的方式,且应用范围最广,下面对使用该功能提出几点最佳实践探索的建议:

1)在权威DNS上设置的按权重比例调度的域名TTL保持一致,如下:

www.test.com TTL:3600 权重:2 A记录: 1.1.1.1

www.test.com TTL:3600 权重:1 A记录: 2.2.2.2

2)权重比例调度的域名TTL最小不超过60S,最大不超过3600s