DNS解析不稳定原因排查
一、现象
日常系统巡检时,发现oracle client的sqlnet.log中出现TNS-12545: Connect failed because target host or object does not exist, 该错误为client访问错误的oracle-server地址造成。在此之前,该部分由IP调整为了DNS。
二、工具以及命令
Nohup tcpdump -i eth0 -nt -s 500 port domain -w 81dns.cap &
Wireshark
Strace ping
三、分析
1. 为啥DNS解析结果会不稳定?
通过对报错信息分析,确认oracle-client读取到错误的server主机地址,由于client输出的sqlne.log中错误信息有限,无法明确真实的server地址返回结果。(sqlnet.log的详细日志分析)
基于以上分析,决定对dns解析过程进行抓包,定位当时dns主机返回的信息。通过校对sqlnet.log的报错与网络抓包结果。发现在网络抖动时,dns的解析会出现超时,3次超时后,db.ics.jc会变成db.ics.jc.localdomain进行IP转换,此时由于dns对该域名没有配置,会返回错误信息。(oracle-clinet对DNS超时可以容错,但对错误返回没有容错机制)
Oracle的client端,收到错误信息后,会把错误返回作为IP地址,进行通信,造成TNS-12545错误。
2. 为啥会出现db.ics.jc会变成db.ics.jc.localdomain?
在测试环境中, 将/etc/resolve.conf /etc/host.conf模拟标准DNS配置,调整resolve.conf的配置,将 172.168.71.207改为一个172.168.72.207(无该DNS地址,模拟网络访问错误)。
异常重现:再次通过网络抓包发现,72.207和我想的一样,会有超时(但71的地址还在生效,说明有缓存,需要重启)
定位localdomain来源:借助ping的解析过程,判断localdomain的来源,执行命令nohup strace ping db.ics.jc &,通过跟踪发现node名称会影响dns的解析过程,造成在二次重试失败后,马上拼装localdomain进行后二次尝试。
验证:通过临时的hostname修改主机名,修改后,再次通过
tcpdump -i eth0 -nt -s 500 port domain //域名解析抓包
strace ping db.ics.jc //跟踪ping过程逻辑
发现没有localdomain错误产生,hostname再次恢复localhost.localdomain时,域名解析错误再现,至此定位是hostname影响到域名解析。
四、更新步骤
1. hostname临时修改
登录root,直接执行hostname修改主机名,如下:
Hostname 新主机名
Hostname //验证修改结果
2. hostname永久修改
cat etc/sysconfig/network
cp /etc/sysconfig/network /etc/sysconfig/network20171109
Vi /etc/sysconfig/network
Cat /etc/hosts
Cp /etc/hosts /etc/hosts20171109
Vi /etc/hosts
Reboot //重启生效
五、总括:
构建好的底层机制,规范超时等异常情况下的错误处理。
构建好的应用容错处理,对于不规范的错误进行规范化处理。