背景:

        5月14号公司部分海外VM 出现解析异常的现象,如下所示:

root@ubuntu:~ # nslookup  group003-test.aaa.com
;; Got SERVFAIL reply from 100.100.1.100, trying next server
Server:         100.100.1.100
Address:        100.100.1.100#53

** server can't find group003-test.aaa.com: SERVFAIL

    

         经过定位发现是当天凌晨,运营商那边海外到国内电信线路出问题导致,当时通过dig +trace 看到的现象是.com 服务器访问我们公司NS Server 解析异常。

DNS NS Server 优选机制剖析_第1张图片

        公司内部当前NS Server 部署在国内IDC机房,并且国际注册局上注册的只有电信线路。本次受影响的正好是电信线路,故部分业务有所影响。

        中国电信 宕机 5 个小时:AWS、Azure、谷歌云、SAP、NTT、Akamai等受影响


解决方案:

1、部署海外NS Server节点

2、部署dns cache 服务(长期规划)



    思考

    在部署过程中,想到一个问题,当前我们有ns1.aaa.com / ns2.aaa.com / ns3.aaa.com 分别解析到国内IDC机房,同时为国内/外业务提供服务。如果此时我们加入了一个海外NS Server 并注册到国际注册局,是否会影响我们国内业务?即国内业务解析时,是否会解析到海外NS Server 节点导致时延增大?如果这个NS Server 不可达,是否会重试其他NS Server?

    

    带着这几个疑问,我们查阅了很多资料,都没有说到关于DNS NS Server 调度方式的介绍。后面通过阿里的同学,找到了个文档:

    https://yq.aliyun.com/articles/622410?spm=5176.11065265.1996646101.searchclickresult.2d1e12ea81mZel


    这个文档解答了我们上述提到的问题。

    大致的实现流程是这样的:

DNS NS Server 优选机制剖析_第2张图片


    首先,bind 在初始化的时候,会为每个NS Server SRTT 赋值(随机值)

    找到SRTT 最小的NS ,并向其发起请求

    记录本次请求RTT ,并重新核算SRTT (核算公式为:old_srtt 0.7 + curr_rtt 0.3 ,即旧的SRTT值占比70%,本次请求RTT占比30%,然后将这个值重新赋值给SRTT)

    如果NS Server 收到请求没有响应,则会触发惩罚机制,即SRTT += 200ms 

    如果该NS Server 能够正常响应,则将降低其他NS 的SRTT 值(在bind 9.8以前版本SRTT=SRTT*98%, bind9.9 以上版本则SRTT=SRTT*99.8%)

    1800 s后重置所有NS SRTT值,重新进入上述循环



     至此,我们上述提到的问题都迎刃而解:

     加入一台海外的NS Server 是否会影响国内NS Server?

     —— 初次请求如果海外的NS Server 初始化后得到一个较小的SRTT值,则请求会分配到海外NS;如果海外NS Server 由于网络问题不可达,会触发惩罚机制,进一步降低其优先级,以确保在本轮循环中尽量不选中该NS Server


    后面找到了上述文章作者,上面的思路得到了他的证实。