为了使我们的 Kafka 集群既可以从互联网也可以从我们的私有网络访问,我们认为可以这样配置 Kafka:
Private VIP:9000 => All brokers:9092 (topology query only)
Private VIP:9001 => Broker #1:9092
Private VIP:9002 => Broker #2:9092
...
Public VIP:9000 => All brokers:9092 (topology query only)
Public VIP:9001 => Broker #1:9092
Public VIP:9002 => Broker #2:9092
...
我们以这种方式配置了负载均衡器,然后配置了我们的代理:
listeners=PLAINTEXT://<server_priv_ip>:9092
advertised.listeners=INTERNAL://<private_VIP>:9001,EXTERNAL://<public_vip>:9001
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
inter.broker.listener.name=INTERNAL
现在,正如你所期望的,Kafka 经纪人还没有启动:
ERROR Exiting Kafka due to fatal exception (kafka.Kafka$)
java.lang.IllegalArgumentException: requirement failed: Each listener must have a different port, listeners: INTERNAL://<private_VIP>:9001,EXTERNAL://<public_vip>:9001
从管理员的角度来看,我的方法完全合乎逻辑,尽管我预计会出现一个问题,即生产者/消费者无论从哪里联系代理,都会获得两个地址。在两个不同的地址上使用相同的端口似乎合乎逻辑,并且更清晰...
第一个问题:这为什么是错误的?
第二个问题:如果不这样做,我该如何实现我的目标?(大多数选择都摆在桌面上)
答案1
我们与 Kafka 专家进行了交谈并得出了以下结论。
简而言之,虽然 kafka 拥有监听器名称来区分两个监听器,但它需要知道连接的客户端想要到达哪一个,并且只能使用传入端口来实现。
如果监听器和公布的监听器具有相同的端口,它们也会相互映射,因此您需要让它们匹配。
最后,我们做了以下事情:
listeners=INTERNAL://hostname:900N,EXTERNAL://hostname:910N,REPLICATION:hostname:9092
advertised.listeners==INTERNAL://vip:900N,EXTERNAL://vip:910N,REPLICATION:hostname:9092
listeners.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,REPLICATION:PLAINTEXT
inter.listener.protocol=REPLICATION
其中“N”是经纪商ID(从1开始计数)
在负载均衡器上,我们将 VIP 的每个端口映射到代理的 IP 地址,再加上端口 9000(内部网络)和 9100(外部网络)上的虚拟 IP,这些虚拟 IP 映射到每个代理的相关侦听器。
这有点过头了,但它可以按预期工作(只要 kafka 内部元数据主题__consumer_offset
被复制)
答案2
有一种场景是kafka无法实现的。
- 集群中设置了三个 kafka 服务器。Kafka 服务器有私有 IP,只能通过其自己的 VPN(例如 KAFKA VPN)访问。
- 当机器连接到 KAFKA VPN + 办公室网络时,有一个可访问的公共 IP。此公共 IP 仅用于 NAT 私有 IP,以便互联网上的人们可以从办公室网络访问它。
- 办公室网络中有一个消费者。现在,当该消费者连接到 KAFKA VPN 时,它可以使用公共 IP 从 Kafka 消费主题。
现在我想通过断开 KAFKA VPN 来连接公共 IP。可以吗?网络运行良好。我已检查跟踪路由和反向跟踪路由。
我认为生产者/Kafka 服务器/消费者配置存在一些问题
NAT 配置:: 10.XX.XX.XX:9092 -> AA.XX.XX.XX:9095 10.XX.XX.XY:9092 -> AA.XX.XX.XX:9093 10.XX.XX.XZ:9092 -> AA.XX.XX.XX:9094
生产者配置:: bootstrap-servers=10.XX.XX.XX:9092,10.XX.XX.XY:9092,10.XX.XX.XZ:9092
Kafka 配置:: listeners=SASL_SSL://0.0.0.0:9092,EXTERNAL://0.0.0.0:9095 advertised.listeners=SASL_SSL://10.XX.XX.XX:9092,EXTERNAL://AA.XX.XX.XX:9095 listener.security.protocol.map=SASL_SSL:SASL_SSL,EXTERNAL:SASL_SSL
消费者配置:: sh kafka-console-consumer.sh --bootstrap-server AA.XX.XX.XX:9093,AA.XX.XX.XX:9094,AA.XX.XX.XX:9095 --topic test --consumer.config consumer.properties
当我未连接到 KAFKA VPN 时收到的错误:: [2022-03-02 17:35:58,236] WARN [Consumer clientId=consumer-test_group-1, groupId=test_group] 无法建立与节点 2147483646 (10.XX.XX.XX/10.XX.XX.XX:9092) 的连接。 代理可能不可用。 (org.apache.kafka.clients.NetworkClient) [2022-03-02 17:36:26,421] WARN [Consumer clientId=consumer-test_group-1, groupId=test_group] 无法建立与节点 2 (10.XX.XX.XY/10.XX.XX.XY:9092) 的连接。 代理可能不可用。 (org.apache.kafka.clients.NetworkClient) [2022-03-02 17:36:47,467] 警告 [Consumer clientId=consumer-test_group-1,groupId=test_group] 无法建立与节点 3 (10.XX.XX.XZ/10.XX.XX.XZ:9092) 的连接。代理可能不可用。 (org.apache.kafka.clients.NetworkClient)
现在一些问卷是::
- 即使我使用公共 IP 连接到 Kafka,为什么日志中显示的是私有 IP?
- 生产者中的引导服务器和消费者中的引导服务器必须完全相同吗?
- 我如何检查元数据请求的响应。kafka 有没有什么程序可以检查?就像 kafka-console-consumer 一样。
- 我该如何修复这个问题?
- 考虑 SASL 和 SSL 属性以及证书。
如果有人能帮助我,那就太好了
谢谢,米兰 K