web-dev-qa-db-ja.com

外部からKafkaに接続できないのはなぜですか?

私はec2インスタンスでkafka=を実行しています。したがって、Amazon ec2インスタンスには2つのIPがあり、1つは内部IP、2つ目は外部使用用です。

ローカルマシンからプロデューサーを作成しましたが、内部IPにリダイレクトされ、接続失敗エラーが表示されます。 ec2インスタンスでkafkaを構成するのを手伝ってくれる人がいますか。そうすれば、ローカルマシンからプロデューサーを実行できます。多くの組み合わせを試しましたが、うまくいきませんでした。

33
sms_1190

Kafka FAQ で読むことができます:

ブローカーが起動すると、IP /ポートをZKに登録します。登録済みのIPが、プロデューサー構成の_metadata.broker.list_にリストされているものと一致していることを確認する必要があります。デフォルトでは、登録されたIPはInetAddress.getLocalHost.getHostAddress()で指定されます。通常、これはホストの実際のIPを返します。ただし、場合によっては(EC2など)、返されるIPは内部IPであり、外部から接続できない場合があります。解決策は、_Host.name_プロパティを_server.properties_に設定して、ホストIPをZKに登録するように明示的に設定することです。バインディングホスト/ポートがクライアント接続のホスト/ポートと異なる別のまれなケースでは、クライアント接続に_advertised.Host.name_および_advertised.port_を設定できます。

37
Lundahl

この問題を解決するには、advertised.Host.name in server.propertiesおよびmetadata.broker.list in producer.propertiesからパブリックIPアドレスおよびHost.nameから0.0.0.0

34
sms_1190

AWSでこれを実行しました。最初にKafkaサーバーを取得して、Host.nameを使用して正しいインターフェイス/ IPでリッスンします。あなたの場合、外部Kafkaクライアントが接続することを目的としているため、これはローカルホストではなく内部IPになります。ローカルクライアントは、ローカルホストではなく、同じアドレスを使用する必要があります。

次に、advertised.Host.nameをIPアドレスではなくホスト名に設定します。トリックは、そのホスト名を取得して、内部マシンと外部マシンの両方で常に正しいIPに解決することです。内部では/ etc/hostsを使用し、外部ではDNSを使用します。私の Kafkaと名前解決についての完全な回答はこちら を参照してください。

16
Cedar Myers

外部ネットワークのコンシューマーから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で検証済み

13
Peter Koncz

以下は、EC2インスタンスの外部からKafka=に接続する手順です。

  1. Kafka= EC2のサーバープロパティファイルを開きます。

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

  2. Advertised.listenersの値を設定します

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

    これはEC2インスタンスのパブリックDNS(IPv4)である必要があります。

  3. 停止Kafkaサーバー。

  4. Kafka=サーバーを起動して、上記の設定変更の動作を確認します。

  5. これで、外部またはローカルホストからEC2インスタンスのKafkaに接続できます。

    Kafka_2.11-2.0.0で試行およびテスト済み

LANからアクセスする場合は、次の2つのファイルを変更します。

  1. config/server.properties

    advertised.listeners=PLAINTEXT://server.ip.in.lan:9092
    
  2. config/producer.properties

    bootstrap.servers=server.ip.in.lan:9092
    

私の場合、server.ip.in.lan値は192.168.15.150

1
Sharif Shahriar

EC2の場合は、/etc/hostsファイルを編集して以下を追加する必要があります。

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

ここで、XXX ...は外部IPであり、ip-YYY-YYY-YYY-YYYはhostnameコマンドによって返される文字列です。サーバー内部で通信するには、外部IPの代わりに127.0.0.1を使用できます。

Host.name非推奨 -advertised.Host.nameおよびadvertised.portと同様

0
Mr_and_Mrs_D