记一次线上问题,同一个域名,之前一直正常,在网络部门做完网络切割后,该域名偶尔会遇到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服务器查询到一个地址列表,根据优先级和权重,从中选取一