我们上网的原点就是打开浏览器,在上方地址栏输入网址的那一刻,这个回车按了之后,发生了很多事情。
首先,计算机只懂0和1,也就是说人类的字母网址计算机是不懂的,它只认识IP地址,如果是IPV4那就是4组8位的二进制数字。
为了人类方便,需要有一个把网址翻译成IP地址的服务,就是DNS。
这是一个高度简略的示意图,实际上DNS整个获取过程是被层层缓存的,一个DNS的获取并不一定都是从权威处获得的响应。
域名解析并非一个简单的过程,其解析结果可能会被层层缓存,如浏览器 DNS 缓存、操作系统 DNS 缓存、ISP 的 DNS缓存,容易被忽略的是 JVM 本身也会对 DNS 进行缓存。
某java应用频繁因网络问题而出现故障,同时也抛出一个问题:JAVA本身对DNS的缓存时间是多久?
对于这个疑问,第一反应Google之,大致有两种说法:
第1种:默认情况下networkaddress.cache.ttl=-1,代表永久缓存(配置文件路径: ${JAVA_HOME}/jre/lib/security/java.security),就是在应用启动之后第一次DNS 解析成功的结果会一直cache到应用停止。显然在域名对应的IP有变更的时候,如果不重启应用就会造成故障。
第2种:jdk1.5和1.5之前的版本默认DNS 缓存时间是永久缓存,jdk 1.6以后与security manager策略有关(jboss tomcat 等app server默认不启用),如果没有启用security manager ,默认DNS 缓存时间30秒(策略配置文件:JAVA_HOME/jre/lib/security/java.policy)。
JVM 的 DNS 缓存可以通过以下参数进行配置:
networkaddress.cache.ttl
sun.net.inetaddr.ttl
如果开启了 SecurityManager,优先从 ${java.home}/jre/lib/security/java.security 中读取参数 networkaddress.cache.ttl,单位为秒。
如果未读取到,则会读取启动参数 sun.net.inetaddr.ttl 作为缓存 ttl.
如果以上参数均未读取到,并且未开启 SecurityManager,则会使用默认值 30s.
否则使用初始值 -1,表示永久生效。
除了解析成功的结果,JVM 也会缓存解析失败的结果,可以通过下列参数配置:
networkaddress.cache.negative.ttl
sun.net.inetaddr.negative.ttl
在缓存有效期内,取到的IP永远是缓存中全部A记录的第一条,并没有轮循之类的策略。
缓存失效之后重新进行DNS解析,因为每次域名解析返回的A记录顺序会发生变化(dig www.example.com测试可见),所以缓存中的数据顺序也变了,取到的IP也变化。
几种修改缓存时间的方法:
1. jvm启动参数里面配置-Dsun.net.inetaddr.ttl=value
2. 修改 配置文件JAVA_HOME/jre/lib/security/java.security相应的参数networkaddress.cache.ttl=value
3. 代码里直接设置:java.security.Security.setProperty(”networkaddress.cache.ttl” , “value”)
参考
JVM and OS DNS Caching
https://stackoverflow.com/questions/17362758/jvm-and-os-dns-caching
elastisearch dns cache settings
https://www.elastic.co/guide/en/elasticsearch/reference/7.5/networkaddress-cache-ttl.html
Networking Properties/Java Properties
https://docs.oracle.com/javase/6/docs/technotes/guides/net/properties.html#nct
How to make Java honor the DNS Caching Timeout?
https://stackoverflow.com/questions/1256556/how-to-make-java-honor-the-dns-caching-timeout
设置 DNS 名称查找的 JVM TTL
https://docs.amazonaws.cn/sdk-for-java/latest/developer-guide/jvm-ttl-dns.html
JVM and OS DNS Caching
http://coddingbuddy.com/article/20978349/jvm-and-os-dns-caching
Java DNS Cache Reference Guide
http://javaeesupportpatterns.blogspot.com/2011/03/java-dns-cache-reference-guide.html
How to configure DNS caching using networkaddress.cache.ttl?
http://docs.oracle.com/javase/6/docs/api/java/net/InetAddress.html
http://kenwublog.com/java-dns-cache-setting
http://stackoverflow.com/questions/1835421/java-dns-cache-viewer
http://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/4/html/Security_on_JBoss-Running_JBoss_with_a_Java_2_security_manager.html
网友评论