首页 文章

为什么我不能从外面连接到 Kafka ?

提问于
浏览
32

我在ec2实例上运行kafka . 因此,amazon ec2实例有两个ips,一个是内部ip,第二个是外部使用 .

我从本地机器创建了 生产环境 者,但它重定向到内部ip并给我连接失败错误 . 任何人都可以帮我在ec2实例上配置kafka,这样我就可以从本地机器运行 生产环境 者了 . 我尝试了很多组合,但没有奏效 .

7 回答

  • 30

    如果您想从LAN访问,请更改以下2个文件 -

    • config/server.properties
    advertised.listeners=PLAINTEXT://server.ip.in.lan:9092
    
    • config/producer.properties
    bootstrap.servers=server.ip.in.lan:9092
    

    在我的例子中,server.ip.in.lan是192.168.15.150

  • 16

    Kafka FAQ中,您可以阅读:

    当代理启动时,它会在ZK中注册其ip / port . 您需要确保注册的ip与 生产环境 者配置中的metadata.broker.list中列出的内容一致 . 默认情况下,注册的ip由InetAddress.getLocalHost.getHostAddress()给出 . 通常,这应该返回主机的真实IP . 但是,有时(例如,在EC2中),返回的ip是内部ip并且不能从外部连接 . 解决方案是通过在server.properties中设置host.name属性来显式设置要在ZK中注册的主机IP . 在另一种罕见的情况下,绑定主机/端口与用于客户端连接的主机/端口不同,您可以设置advertised.host.name和advertised.port以进行客户端连接 .

  • 1

    我解决了这个问题,方法是将 server.properties 中的 advertised.host.nameproducer.properties 中的 metadata.broker.list 设置为公共IP地址,将 host.name 设置为 0.0.0.0 .

  • 0

    我刚刚在AWS中做到了这一点 . 首先让Kafka服务器使用host.name监听正确的接口/ IP . 对于您的情况,这将是内部IP,而不是localhost,因为您的意图是外部Kafka客户端连接 . 任何本地客户端都需要使用相同的地址,而不是localhost .

    然后将advertised.host.name设置为主机名,而不是IP地址 . 诀窍是让主机名始终解析为内部和外部机器的正确IP . 我在里面使用/ etc / hosts和在外面使用DNS . 看我的full answer about Kafka and name resolution here .

  • 36

    如何从外部网络中的消费者访问EC2上的Kafka服务器(版本kafka_2.11-1.0.0)的最简单方法是更改属性文件

    kafka_2.11-1.0.0/config/server.properties
    

    并修改以下行

    listeners=PLAINTEXT://ec2-XXX-XXX-XXX-XXX.eu-central-1.compute.amazonaws.com:9092
    

    使用您的公共地址

    在2.11-2.0.0上验证

  • 0

    以下是从EC2实例外部连接Kafka的步骤 .

    • 在EC2上打开Kafka服务器属性文件 .

    /kafka_2.11-2.0.0/config/server.properties

    • 将advertised.listeners的值设置为

    advertised.listeners = PLAINTEXT://ec2-xx-xxx-xxx-xx.compute-1.amazonaws.com:9092

    这应该是您的EC2实例的公共DNS(IPv4) .

    • 停止Kafka服务器 .

    • 启动Kafka服务器以查看上述配置更改的操作 .

    • 现在,您可以从外部或从本地主机连接到您的Kafka EC2实例 .

    在kafka_2.11-2.0.0上试过并测试过

  • 12

    对于EC2,您应编辑 /etc/hosts 文件以添加:

    XXX.XXX.XXX.XXX ip-YYY-YYY-YYY-YYY
    

    其中XXX ...是您的外部IP,而ip-YYY-YYY-YYY-YYY是 hostname 命令返回的字符串 . 您可以使用 127.0.0.1 而不是外部IP在服务器内部进行通信 .

    host.namedeprecated - advertised.host.nameadvertised.port

相关问题