Kafka producer程序本地运行时发送信息失败解决方案

今天运行kafka本地producer程序时,总是发送信息失败,经过查阅资料,最终发现是kafka集群的配置问题。

kafka 集群broker : broker1:9092,broker2:9092

配置解析:

config/server.properties文件中有几个参数:

# Hostname the broker will bind to. If not set, the server will bind to all interfaces
#host.name=localhost

# Hostname the broker will advertise to producers and consumers. If not set, it uses the
# value for "host.name" if configured.  Otherwise, it will use the value returned from
# java.net.InetAddress.getCanonicalHostName().
advertised.host.name=10.12.50.12

其中host.name默认为null。如果hostname已经设置的话,broker将只会绑定到这个地址上;如果没有设置,它将绑定到所有接口,并发布一份到ZK

advertised.host.name默认为null。如果没有设置的话,并且如果host.name如果配置的了话,会使用hots.name的值,否则会使用 java.net.InetAddress.getCanonicalHostName()接口返回的值。这个hostname会通知给producers和consumers。


默认配置时,host.name和advertised.host.name都是null。非本机运行kafka producer时发送信息失败的原因就在这两个配置上。首先本地producer会和kafka集群通信,kafka集群会将集群元数据发送给producer,然后由producer连接broker发送信息。由于host.name和advertised.host.name都没有配置,所以通知给producer的advertised.host.name如说明中所示的,就是 java.net.InetAddress.getCanonicalHostName()返回的值。在kafka集群节点上, java.net.InetAddress.getCanonicalHostName()获得的值是当前节点的hostname或者IP,如果返回的是IP,那么是没有问题的。不幸的是,返回的是hostname。当返回kafka节点的hostname给producer时,producer程序会连接这个hostname。如果本地没有配置这个hostname对应的ip,那么自然是连接不到的。所以会信息发送失败。


解决办法:1.本地配置kafka集群中节点的hostname对应的ip   => 不推荐。没有验证是否可行,原理上应该是没问题的。配置麻烦,而且工作节点可能会多种多样。

2.kafka集群配置时配置host.name或advertised.host.name为本机ip => 推荐,简单易实施。已验证可行。

你可能感兴趣的:(分布式计算,kafka)