如果 DNS 出现故障,Zookeeper 会发生什么情况?

What happens to Zookeeper if the DNS goes down?

我正在研究 Zookeeper 以及它最有价值的方面之一是高可用性。最近,我们的内部 DNS 出现问题,对 Zookeeper 和依赖它的其他服务产生了负面影响。

我不太了解 DNS、static/dynamic ip、DNS 缓存和查找,但是处理 Zookeeper 和 DNS 问题的最佳做法是什么?

A 运行 Zookeeper 集群不应受到 DNS 问题的影响。集群中的每个服务器实例都是一个 JVM 进程。 JVM 永远缓存 DNS 条目,或者直到重新启动。一旦 Zookeeper 服务器节点启动并位于集群中,它们就不应再使用 DNS。理论上,您可以将 Java 安全选项配置为永远不缓存 DNS,但这不是 ZK 情况下的默认设置。

服务器启动期间可能出现问题。如果 Zookeeper 服务器实例无法解析集群中其他节点的名称,它将拒绝服务请求。由于集群配置通常很小且大部分是静态的,您可以直接在配置中使用 IP 端点并避免任何可能的问题。

如果您有 Java 个客户端,则相同的 DNS 缓存推理适用于它们。

在 DNS 中断期间,某些客户端可能无法解析 Zookeeper 端点。这在技术上并不违反 Zookeeper 的高可用性 属性。 Zookeeper 服务仍然可用,但无法访问,因为系统关键路径上的其他内容发生故障。 Zookeeper 对此没有保护。

在 JDK6 和更高版本中,DNS 缓存行为取决于所设置的安全管理器。如果未根据此页面设置安全管理器,则 DNS 条目仅缓存 30 秒:

http://javaeesupportpatterns.blogspot.com/2011/03/java-dns-cache-reference-guide.html

JDK7(我们用于 运行 zookeeper)的官方文档在这里: https://docs.oracle.com/javase/7/docs/technotes/guides/net/properties.html

我们最近遇到了一个关于 zookeeper 的问题,我们仍在解决这个问题,但很明显它是 运行 一个 30 秒的 DNS 缓存(不尊重 TTL)。编译下面的代码并 运行 使用与 运行 zookeper 相同的 jvm args 对其进行编译将显示当前设置:

public class DNSTTL {

    public static void main(String[] args) {
        // Prints "Hello, World" to the terminal window.
    System.out.println("DEFAULT DNS TTL: "+sun.net.InetAddressCachePolicy.get());
    }
}

我们的结果:
默认 DNS TTL:30

我还不能肯定地说 DNS 是否是导致我们的 zookeeper 集群宕机(失去领导者)的原因,但它是目前的主要嫌疑人