我使用3个Zookeeper和每个代理配置了具有3个代理的Kafka群集。下面的图显示了我的群集的图形表示。
使用主机192.168.0.10
在同一网络中的生产者和消费者测试通过kafka-console-producer
和kafka-console-consumer
命令可以很好地工作。
基于这种情况,当我尝试通过Internet通过kafka-console-producer.sh --broker-list DYNAMIC_DNS_ADDR:30192,DYNAMIC_DNS_ADDR:30292,DYNAMIC_DNS_ADDR:30392 --topic twitter_tweets
生成一些数据时,出现以下错误:
[2018-12-10 09:59:20,772]错误将消息发送到主题twitter_tweets时发生错误,其键为:null,值:16个字节,错误为:(org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) org.apache.kafka.common.errors.TimeoutException:twitter_tweets-1的1条记录已过期:自创建批处理以来,经过了1505 ms的时间 [2018-12-10 09:59:22,273]警告[Producer clientId = console-producer]无法建立到节点1的连接。经纪人可能不可用。 (org.apache.kafka.clients.NetworkClient)
代理侦听器配置有以下属性:
listeners=PLAINTEXT://0.0.0.0:9092,SSL://0.0.0.0:9443
advertised.listeners=PLAINTEXT://192.168.0.241:9092,SSL://192.168.0.241:9443
很明显,每个代理的IP地址都更改了advertised.listeners
属性。我正在为此设置使用CentOS 6.10
和Kafka 2.0.1
。 telnet测试有效。另一个指向Kafka REST代理端口的转发器正在通过Internet工作并列出所有主题。
答案 0 :(得分:1)
请参见https://rmoff.net/2018/08/02/kafka-listeners-explained/
您需要两个侦听器-一个用于响应并发布广告内部地址,一个用于外部地址。
关键是客户端连接到的监听器将返回该监听器的主机地址和端口。
此刻,您将外部设备欺骗为内部设备,而您的外部流量正在冲击内部内部监听器。
您需要这样的内容(根据每个代理的要求更改aws_internal_listener
的IP /主机名):
KAFKA_LISTENERS: aws_internal_listener://192.168.0.241:9092,external_listener://192.168.0.241:29092
KAFKA_ADVERTISED_LISTENERS: aws_internal_listener://192.168.0.241:9092,external_listener://DYNAMIC_DNS_ADDR:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: aws_internal_listener:PLAINTEXT,external_listener:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: aws_internal_listener
然后,您的DYNAMIC_DNS_ADDR
端口转发器应将连接重定向到AWS节点上的29092。关键是,外部连接不应最终在与内部侦听器匹配的主机的侦听器端口上结束(该主机通告内部192.168.0
地址)>
使用kafkacat -L -b DYNAMIC_DNS_ADDR:29092
来调试和验证您的配置,如in the article here所述。