问题描述
我有一个三节点的 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 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,只需要几个