openresty DNS解析失败name resolution failed解决方案

记一次线上问题,同一个域名,之前一直正常,在网络部门做完网络切割后,该域名偶尔会遇到status=503,message=“name resolution failed”,时间频率很奇怪,基本2分钟就会触发。而其余大部分都是正常200,错误信息如下图。
在这里插入图片描述

排查过程

通过dig该域名,发现该域名与其他正常请求唯一的区别在于该域名做了2次CNAME。

首先,由于看到有时间上的规律,开始只是调整了retrans , timeout参数,即DNS的重试次数和超时时间,但经测试发现并没什么鸟用,依然按这个规律报503。
后来通过看源码,分析流程,发现正常openresty会通过域名向DNS去查询地址,若有缓存,先从缓存中直接拿IP地址。若没有,则会去DNS查询,这里要提到一点。openresty默认会以4中类型的顺序依次去DNS查询,分别是LAST,SRV,A,CNAME,上一个没查到结果,就会去执行下一种类型。

这里需要普及下这四种类型:
1 LAST
将上次DNS解析成功的类型缓存起来,下次请求进来会直接从缓存中拿上一次成功的类型。
2. SRV
用来指定服务地址。与常见的A记录、cname不同的是,SRV中除了记录服务器的地址,还记录了服务的端口,并且可以设置每个服务地址的优先级和权重。访问服务的时候,本地的DNS resolver从DNS服务器查询到一个地址列表,根据优先级和权重,从中选取一个地址作为本次请求的目标地址。
3 A记录
是用来指定主机名(或域名)对应的IP地址记录。用户可以将该域名下的网站服务器指向到自己的web server上。同时也可以设置您域名的二级域名。
4 CNAME
这种记录允许您将多个名字映射到同一台计算机。 通常用于同时提供WWW和MAIL服务的计算机。例如,有一台计算机名为“host.mydomain.com”(A记录)。 它同时提供WWW和MAIL服务,为了便于用户访问服务。可以为该计算机设置两个别名(CNAME):WWW和MAIL。 这两个别名的全称就是“www.mydomain.com”和“mail.mydomain.com”。实际上他们都指向“host.mydomain.com”。 同样的方法可以用于当您拥有多个域名需要指向同一服务器IP,此时您就可以将一个域名做A记录指向服务器IP然后将其他的域名做别名到之前做A记录的域名上,那么当您的服务器IP地址变更时您就可以不必麻烦的一个一个域名更改指向了 只需要更改做A记录的那个域名其他做别名的那些域名的指向也将自动更改到新的IP地址上了。

然后,通过与公司的DNS部门沟通发现,公司内部对SRV,CNAME进行了内部解析,单独通过该类型是查不到解析结果的。只有通过A记录的类型请求时,才会有结果返回。如果是查询的初始域名,那么会把中间的解析过程,包括在dig看到的2次CNAME也会在结果里一起返回回来。

后来通过添加日志,逐步分析,发现主要原因是由于网络调整,DNS域名解析与openresty的解析逻辑有不匹配的地方。

正常使用原始域名查A记录,直接查到3条信息,2条cname和1条a记录。网关拿到这样的完整记录后,认为原始域名是cname的,最终域名是通过A记录找到的。缓存时,LAST保存的是cname类型。当缓存到期后,原始域名直接按cname去查了,但是云解析又不支持按cname去查,结果就失败了。下一次查询重新用a记录查又可以查到。

最终通过修改dns_order参数,将原有的LAST类型去掉,解决该问题。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章