【问题标题】:Kafka cluster unavailable if a node in Zookeeper cluster dies如果 Zookeeper 集群中的节点死亡,Kafka 集群将不可用
【发布时间】:2017-02-01 10:52:00
【问题描述】:

我正在配置一个由 3 个代理组成的 Kafka 集群。 该集群使用 3 个节点的 Zookeeper 集群。

使用 Docker,这就是我启动 3 个 Zookeeper 节点的方式:

docker run --net=my_network --name zoo1 -d -e ZOO_MY_ID=1 -e ZOO_SERVERS="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888" zookeeper

docker run --net=my_network --name zoo2 -d -e ZOO_MY_ID=2 -e ZOO_SERVERS="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888" zookeeper

docker run --net=my_network --name zoo3 -d -e ZOO_MY_ID=3 -e ZOO_SERVERS="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888" zookeeper

这就是我启动 3 个 Kafka 节点的方式:

docker run --net=my_network --name kafka1 -d -e KAFKA_ADVERTISED_PORT=9092 -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT="zoo1:2181,zoo2:2181,zoo3:2181" wurstmeister/kafka

docker run --net=my_network --name kafka2 -d -e KAFKA_ADVERTISED_PORT=9092 -e KAFKA_BROKER_ID=2 -e KAFKA_ZOOKEEPER_CONNECT="zoo1:2181,zoo2:2181,zoo3:2181" wurstmeister/kafka

docker run --net=my_network --name kafka3 -d -e KAFKA_ADVERTISED_PORT=9092 -e KAFKA_BROKER_ID=3 -e KAFKA_ZOOKEEPER_CONNECT="zoo1:2181,zoo2:2181,zoo3:2181" wurstmeister/kafka

Zookeeper 和 Kafka 集群在独立测试时表现良好。

我的意思是,我可以连接到其中一个 Zookeeper 节点(比如 zoo1)并创建一个 znode。之后我可以停止节点(例如,docker stop zoo1),我仍然可以从 Zookeeper 集群中的任何其他节点查询 znode

Kafka 集群也表现良好。假设 Zookeeper 中的 3 个节点都启动了,我可以创建一个主题,发送一条消息,删除 broker leader,并验证消息是否仍然可以被消费。

我的问题是,如果其中一个 Zookeeper 节点死亡,Kafka 集群就会停止工作。

例如,如果我停止一个 zookeeper 节点(例如,docker stop zoo1),然后尝试使用以下命令创建一个主题:

 ./kafka-topics.sh --create --zookeeper "zoo1:2181,zoo2:2181,zoo3:2181" --replication-factor 3 --partitions 1 --topic my-replicated-topic

我会收到一个UnknownHostException

Exception in thread "main" org.I0Itec.zkclient.exception.ZkException: Unable to connect to zoo1:2181,zoo2:2181,zoo3:2181
    at org.I0Itec.zkclient.ZkConnection.connect(ZkConnection.java:71)
    at org.I0Itec.zkclient.ZkClient.connect(ZkClient.java:1227)
    at org.I0Itec.zkclient.ZkClient.<init>(ZkClient.java:156)
    at org.I0Itec.zkclient.ZkClient.<init>(ZkClient.java:130)
    at kafka.utils.ZkUtils$.createZkClientAndConnection(ZkUtils.scala:75)
    at kafka.utils.ZkUtils$.apply(ZkUtils.scala:57)
    at kafka.admin.TopicCommand$.main(TopicCommand.scala:54)
    at kafka.admin.TopicCommand.main(TopicCommand.scala)
Caused by: java.net.UnknownHostException: zoo3: Name or service not known
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928)
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323)
    at java.net.InetAddress.getAllByName0(InetAddress.java:1276)
    at java.net.InetAddress.getAllByName(InetAddress.java:1192)
    at java.net.InetAddress.getAllByName(InetAddress.java:1126)
    at org.apache.zookeeper.client.StaticHostProvider.<init>(StaticHostProvider.java:61)
    at org.apache.zookeeper.ZooKeeper.<init>(ZooKeeper.java:445)
    at org.apache.zookeeper.ZooKeeper.<init>(ZooKeeper.java:380)
    at org.I0Itec.zkclient.ZkConnection.connect(ZkConnection.java:69)

但即使托管 Zookeeper 节点的其中一台机器烧毁,我也确实需要 Kafka 集群才能完全正常运行。 我怎样才能达到这种弹性?

【问题讨论】:

    标签: apache-kafka apache-zookeeper


    【解决方案1】:

    正如例外所说,主机名可能无法从您运行创建主题命令的位置解析。尝试 ping zoo1、zoo2、zoo3 以检查它们是否正在解析正确的 IP。

    我不认为这是 Kafka 的问题。但 Zookeeper 主机名解析可能无法正确进行。我建议首先通过创建一个新的 znode 并读取之前创建的 znode 来检查 Zookeeper 集成是否正常工作。此外,尝试在 kafka-topics.sh 命令中传递 Zookeeper IP 地址来代替主机名。

    当您重新启动 docker 实例(例如 zoo1)时,它可能会以新 IP 启动。 zoo1 主机名是否仍可从 zoo2 和 zoo3 解析?

    【讨论】:

    • 嗨。我知道异常指向一个无法解析的 zookeeper 主机。当然,我可以在任何动物园管理员还活着的时候 ping 它们,如果我明确杀死它们,我就无法再 ping 它们了。由于我正在精确地测试弹性,我需要的是即使其中一个 zookeeper 节点从网络中消失,kafka 集群也能继续工作(因此它的主机名或 ip 都无法解析)。只要Zookeeper节点的法定人数仍然存在,我希望这可以工作。 Zookeeper ensemble 可以正常工作,否则我按照您的建议进行了创建 znode 的测试。
    • 我认为只要 Zookeeper quorum 可用,Kafka 集群就会正常工作。大多数情况下,kaka-topics.sh 工具可能存在一些问题,该工具仅在内部调用一些 Java 类。我们可以手动检查 /brokers、/consumers、/controller 等 zookeeper znode 来检查 Kafka 集群是否正常运行。
    猜你喜欢
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 2016-06-16
    • 2019-04-12
    • 2019-02-27
    • 1970-01-01
    • 2017-06-07
    • 2019-11-08
    相关资源
    最近更新 更多