如果DNS发生故障,Zookeeper会发生什么?

时间:2015-03-09 06:49:04

标签: dns apache-zookeeper

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

我不太了解DNS,静态/动态IP,DNS缓存和查找,但处理Zookeeper和DNS问题的最佳做法是什么?

2 个答案:

答案 0 :(得分:2)

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

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

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

在DNS中断期间,某些客户端可能无法解析Zookeeper端点。从技术上讲,这并不违反Zookeeper的高可用性。 Zookeeper服务仍然可用,但由于系统关键路径上的其他内容失败,因此无法访问。动物园管理员并没有保护它。

答案 1 :(得分:2)

在JDK 6和更高版本中,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());
    }
}

我们的结果:
  DEFAULT DNS TTL:30

我无法肯定地说,如果DNS是我们的动物园管理员群落下降的原因(失去领导者),但它是此时的主要嫌疑人