私はec2インスタンスでkafka=を実行しています。したがって、Amazon ec2インスタンスには2つのIPがあり、1つは内部IP、2つ目は外部使用用です。
ローカルマシンからプロデューサーを作成しましたが、内部IPにリダイレクトされ、接続失敗エラーが表示されます。 ec2インスタンスでkafkaを構成するのを手伝ってくれる人がいますか。そうすれば、ローカルマシンからプロデューサーを実行できます。多くの組み合わせを試しましたが、うまくいきませんでした。
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
_を設定できます。
この問題を解決するには、advertised.Host.name
in server.properties
およびmetadata.broker.list
in producer.properties
からパブリックIPアドレスおよびHost.name
から0.0.0.0
。
AWSでこれを実行しました。最初にKafkaサーバーを取得して、Host.nameを使用して正しいインターフェイス/ IPでリッスンします。あなたの場合、外部Kafkaクライアントが接続することを目的としているため、これはローカルホストではなく内部IPになります。ローカルクライアントは、ローカルホストではなく、同じアドレスを使用する必要があります。
次に、advertised.Host.nameをIPアドレスではなくホスト名に設定します。トリックは、そのホスト名を取得して、内部マシンと外部マシンの両方で常に正しいIPに解決することです。内部では/ etc/hostsを使用し、外部ではDNSを使用します。私の Kafkaと名前解決についての完全な回答はこちら を参照してください。
外部ネットワークのコンシューマーから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で検証済み
以下は、EC2インスタンスの外部からKafka=に接続する手順です。
Kafka= EC2のサーバープロパティファイルを開きます。
/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=サーバーを起動して、上記の設定変更の動作を確認します。
これで、外部またはローカルホストからEC2インスタンスのKafkaに接続できます。
Kafka_2.11-2.0.0で試行およびテスト済み
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
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
と同様