Kafka 静态 IP 和服务发现

问题描述

我有一个三节点的 Kakfa 集群,还有一个管理它的三节点 Zookeeper 集群。我对这个集群的配置看起来像

  • 节点 1
    • IP - 192.168.1.11
    • Kafka 端口 - 9092
    • 动物园管理员端口 - 2181
  • 节点 2
    • IP - 192.168.1.12
    • Kafka 端口 - 9092
    • 动物园管理员端口 - 2181
  • 节点 3
    • IP - 192.168.1.13
    • Kafka 端口 - 9092
    • 动物园管理员端口 - 2181

对于这些节点中的每一个,我都有 Zookeeper 和 Kakfa 配置文件。我的示例 Zookeeper 配置文件看起来像

# Zookeeper server config

dataDir=/tmp/zookeeper
clientPort=2181
initLimit=5
synclimit=2

server.1=192.168.1.11:2889:3889
server.2=192.168.1.12:2889:3889
server.3=192.168.1.13:2889:3889

由于每个 Zookeeper 实例都需要了解彼此的 Zookeeper 实例,而且一般我所看到的,即使在管理海量 Kafka 集群时,通常也只有不到 10 个 Zookeeper 节点。所以在这里我们只需要跟踪 10 个 IP。同样根据我的理解,这些 IP 没有那么易变,而且通常不会经常更改。

对于我的 Kafka 配置文件,我在每个节点上都有以下内容

# Kafka server properties file

broker.id=<ID for this node>
log.dirs=/tmp/kafka-logs
zookeeper.connect=192.168.1.11:2181,192.168.1.12:2181,192.168.1.13:2181
zookeeper.connection.timeout.ms=36000
listeners=PLAINTEXT://<IP of this node>:9092

现在对我来说,我们引入集群的每个 Kafka 节点都必须知道所有 Zookeeper 节点,以便对其进行管理。但对我来说问题是,随着我们向上或向下扩展 Kafka 节点,我们对它们的 IP 不太确定。例如,如果我想创建一个新的 Kafka 主题,我将使用他们提供的 kafka-topics.sh shell 文件并键入类似

kafka-topics.sh --create --topic MyTopic --bootstrap-server <IP of one of the Kafka nodes>

# Could also use the broker-list option instead of bootstrap-server to allow multiple IPs

对我来说问题是,我们永远不知道哪些 Kafka IP 正在启动和运行,因此将 IP 传递给 --bootstrap-server 似乎是一个猜谜游戏,或者我需要手动检查工作节点的 IP。

那么对于 Kafka,我如何配置静态 IP(可能是虚拟 IP?),以便使用我的 Kafka 集群的其他服务始终可以连接到它?如何为 IP 发生变化的集群执行服务发现?

解决方法

通常少于 10 个 Zookeeper 节点

根据Kafka绝对指南,7通常是大型Kafka集群的Zookeeper集群的最大大小。就我个人而言,我在每天处理数百万个事件的 Kafka 集群上没有看到超过 5 个......


您可以创建解析为健康实例的 DNS 记录

但是,如果 IP 不是静态的,那么客户端通常会遇到问题,因为分区领导者由 IP 和代理 ID 托管。如果 ID 移动到新 IP 或 IP 不再解析为(健康的)Kafka 代理,您的客户就会开始遇到错误

注意:bootstrap-server 和 broker-list 都接受多个地址,但只有控制台生产者使用 broker-list 参数

还有其他创建主题的方法,例如 Terraform,您可以在其中将 Kafka 地址静态存储为源代码中的变量,并且很少更改它。尤其是不需要每次使用Kafka客户端都列出每一个IP,只需要几个