2014-11-28 11 views
21

Ich führe Kafka auf ec2-Instanz. So hat amazon ec2 instance zwei ips, eine ist interne IP und die zweite ist für den externen Gebrauch.Warum kann ich mich nicht von draußen mit Kafka verbinden?

Ich habe Producer von der lokalen Maschine erstellt, aber es auf interne IP-Adresse umleiten und mir Verbindung erfolglosen Fehler geben. Kann mir jemand helfen, kafka auf der ec2-Instanz zu konfigurieren, damit ich den Producer vom lokalen Rechner aus starten kann. Ich habe viele Kombinationen ausprobiert, aber nicht funktioniert.

Antwort

31

In der Kafka FAQ Sie können lesen:

Wenn ein Broker startet, es seine IP/Port in ZK registriert. Sie müssen sicherstellen, dass die registrierte IP-Adresse mit der übereinstimmt, die in der Producer-Konfiguration unter metadata.broker.list aufgeführt ist. Standardmäßig ist die registrierte IP-Adresse InetAddress.getLocalHost.getHostAddress(). In der Regel sollte dies die reale IP des Hosts zurückgeben. Manchmal (z. B. in EC2) ist die zurückgegebene IP jedoch eine interne und kann nicht von außen verbunden werden. Die Lösung besteht darin, die Host-IP explizit für die Registrierung in ZK festzulegen, indem Sie die hostname-Eigenschaft in server.properties festlegen. In einem weiteren seltenen Fall, in dem sich der bindende Host/Port vom Host/Port für die Clientverbindung unterscheidet, können Sie advertised.host.name und advertised.port für die Clientverbindung festlegen.

+5

Just beachten wollte, dass die genannte Hostname-Eigenschaft in server.properties genannt wird: 'host.name = ' –

+2

Ich bin im seltenen Fall: 'In einem anderen seltenen Fall, in dem der bindende Host/Port sich von dem Host/Port für die Clientverbindung unterscheidet, können Sie advertised.host.name und advertised.port für die Clientverbindung festlegen. Wie mache ich das? – Sodved

23

Ich löste dieses Problem, indem advertised.host.name in server.properties und metadata.broker.list in producer.properties der öffentlichen IP-Adresse und host.name-0.0.0.0 Einstellung.

+0

Das ist die Lösung, die für mich funktionierte. Vielen Dank! – uohzxela

+0

@ sms_1190 .. Hallo .. Ich habe die gleichen Probleme. Ich habe kafka eingerichtet, in ec2 linux zu laufen. Ich habe Java-Code in Eclipse in Windows-Maschine installiert geschrieben. Ich bin in der Lage, Ereignisse in Eclipse zu erstellen, aber ich sehe sie nicht in kafka Produzent, der in ec2 läuft. Wie verbinde ich deinen eclipse oder kafka code in maven in windows um mit ec2 linux zu verbinden. Ich habe advertised.host.name und advertised.port in kafka server config und metadata.broker.list im Producer als pub ip: 0000 geändert. – user3858193

+0

@ user3858193: Überprüfen Sie Ihre Sicherheitsgruppen in ec2. Sie sollten 9092 Port zu 0.0.0.0/0 öffnen. –

12

Ich habe das gerade in AWS getan. Lassen Sie zuerst den Kafka-Server mit host.name auf die richtige Schnittstelle/IP abhören. Für Ihren Fall wäre dies die interne IP, nicht localhost, da Ihre Absicht ist, dass sich externe Kafka-Clients verbinden. Alle lokalen Clients müssen dieselbe Adresse verwenden, nicht localhost.

Setzen Sie advertised.host.name dann auf einen Hostnamen, nicht auf eine IP-Adresse. Der Trick besteht darin, dass dieser Hostname immer auf die richtige IP-Adresse für interne und externe Maschinen auflöst. Ich benutze/etc/hosts innerhalb und DNS außerhalb. Siehe meine full answer about Kafka and name resolution here.

2

Die einfachste Art und Weise, wie Sie Ihren Kafka-Server (Version kafka_2.11-1.0.0) auf EC2 von Verbrauchern in externem Netzwerk zu erreichen, ist die Eigenschaften

zu ändern Datei
kafka_2.11-1.0.0/config/server.properties 

und ändern Sie die folgende Zeile

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

Verwenden der öffentliche Adresse

Verwandte Themen