美文网首页
【jvm&DNS】关于java dns cache

【jvm&DNS】关于java dns cache

作者: Bogon | 来源:发表于2021-11-02 00:12 被阅读0次

    我们上网的原点就是打开浏览器,在上方地址栏输入网址的那一刻,这个回车按了之后,发生了很多事情。

    首先,计算机只懂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

    相关文章

      网友评论

          本文标题:【jvm&DNS】关于java dns cache

          本文链接:https://www.haomeiwen.com/subject/mwtxzltx.html