【问题标题】:Kafka Static IP and Service DiscoveryKafka 静态 IP 和服务发现
【发布时间】:2021-08-04 18:49:00
【问题描述】:

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

  • 节点 1
    • IP - 192.168.1.11
    • 卡夫卡端口 - 9092
    • Zookeeper 端口 - 2181
  • 节点 2
    • IP - 192.168.1.12
    • 卡夫卡端口 - 9092
    • Zookeeper 端口 - 2181
  • 节点 3
    • IP - 192.168.1.13
    • 卡夫卡端口 - 9092
    • Zookeeper 端口 - 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 的集群执行服务发现?

【问题讨论】:

    标签: apache-kafka architecture apache-zookeeper distributed-system service-discovery


    【解决方案1】:

    Zookeeper 节点通常少于 10 个

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


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

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

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

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

    【讨论】:

    • 这是否意味着每次添加新代理时都需要编辑每个节点的 DNS 记录?如果我有 100 个节点,然后再添加一个节点会怎样?
    • 取决于您的基础架构管理脚本。例如,将 EC2 实例添加到 VPC 服务,该服务链接到 Route53 DNS 条目...否则,您的路由器的 DNS 服务器将默认使用机器的主机名,无论如何您都可以在任何新服务器上设置该主机名跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多