Java 和 /etc/resolv.conf DNS 服务器故障转移

Java 和 /etc/resolv.conf DNS 服务器故障转移

执行摘要

  • resolv.conf如果第一个名称服务器条目失败或超时,Java 是否会查询下一个名称服务器条目?
  • Java 认为解析器“关闭”的默认超时时间是多少?

细节

/etc/resolv.conf大多数站点中,系统配置了多个 DNS 服务器。有人能解释一下,如果列表中的第一个 DNS 服务器发生故障,Java 会发生什么情况吗?例如,想象一下以下情况resolv.conf

nameserver 8.8.8.8
nameserver 4.4.4.4

如果 8.8.8.8 无法访问,那么 Java 是否会尝试 4.4.4.4?根据我们的经验,它不会尝试 - 我们看到许多线程在等待解析 DNS 名称,尽管备份 DNS 服务器可以访问。

答案1

在 Linux 上,java 将把主机名解析委托给执行实际解析的底层 C 系统库。

在查询了 /etc/nsswitch.conf 中指定的其他信息源(例如 /etc/hosts,但也可能为 NIS 或 LDAP)之后,将按照 /etc/resolv.conf 中指定的顺序查询名称服务器。

您可以在 /etc/resolv.conf 中指定超时值,根据手册页,默认值为 5 秒。

如果你的第一个服务器给出有效的错误代码,即 servfail,则不会查询第二个名称服务器

答案2

当一个程序(任何进程,包括 JVM)第一次发出 DNS 请求时,它会读取并永久缓存/etc/resolv.conf默认情况下,永不刷新即使遇到 DNS 完全故障,程序也会稍后返回该信息。程序需要编写一些特定的系统调用,使其以更用户友好的方式运行。这个问题解释细节。

我怀疑您/etc/resolv.conf在 JVM 运行时进行了编辑。重新启动它。

相关内容