概述:
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请求及业务流量访问:
调度说明
- 三个不同区域的客户端依次发起了www.test.com域名的访问,系统/浏览器调用接口向LDNS发起了域名解析请求
- 三个不同区域LDNS依次收到解析请求后向权威DNS发起www.test.com域名解析请求
- 权威DNS根据自身算法,匹配到www.test.com的权重为2:1,前两次请求应答1.1.1.1,后1次请求应答2.2.2.2
- 三个不同区域客户端各自收到域名解析结果后,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缓存机制较为特殊,来分析一下如何导致的解析流量不均衡:
权威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