一、现象描述
公司业务突然大面积爆发访问延迟超过10s现象。但是通过监控和应用日志,发现所有的HTTP请求响应都很快,后在服务器上直接执行Curl操作,发现延迟确实超过10s。
二、故障分析
通过观察怀疑问题可能在客户端的某个环节,故选择在客户端抓包,根据抓的数据包,发现HTTP交互其实非常快,和我们的http日志对的上
继续复现抓包,根据最小化请求原则,避免其他数据包干扰,服务器关闭相关服务,至访问指定域名,根据数据包分析,发现在发出请求之前,的DNS有异常。根据数据包显示
服务器同时发起了IPv4和IPv6 的DNS请求,IPv4秒回了。因为该域名无IPv6,所以无响应,这时候客户端发起了第二次的IPv6+IPv4的DNS请求,这时候dns服务器回了一个server failure。
至此,我们基本确定问题点在os或者程序层面,就是请求端必须要拿到真实的IPv6结果。
这就是大名鼎鼎的IPv6天窗问题的范围了。
三、解决
OS和开发均无从下手,这时候只能从DNS角度去解决这个问题,当然临时去添加IPv6不现实,
理一下DNS的请求路径
pc—>内网dns—(Foreward For)—>F5–(Foreward For)—>公网DNS
内网DNS服务器是Windows 基本没什么操作空间,只能从F5角度去处理,根据F5官网,针对IPv6请求做一个模拟假响应即可(大概这么个意思),
在F5对应的listeners(F5独有名词) 挂上响应irule
when DNS_REQUEST {
if {[DNS::question type] equals "AAAA" }{
DNS::header rcode NOERROR
DNS::return
}
}
管理上后,延迟明显降低,客户端抓包查看
如下图:客户端只发起了一次IPv6+IPv4请求,IPv6响应有个我们插入的no error,达到我们预期。至此我们问题解决,但是为何突然爆发,这个确实很神奇了,知道的大神可以评论区留言。