web-dev-qa-db-fra.com

Pourquoi je ne peux pas me connecter à Kafka de l'extérieur?

J'exécute kafka sur une instance ec2. Ainsi, l’instance Amazon ec2 a deux ips: l’ip interne et l’autre, à usage externe. 

J'ai créé Producer à partir d'une machine locale, mais il est redirigé vers une adresse IP interne et me donne une erreur de connexion infructueuse. Quelqu'un peut-il m'aider à configurer kafka sur une instance ec2, afin que je puisse exécuter le producteur à partir de la machine locale. J'ai essayé beaucoup de combinaisons mais je n'ai pas travaillé. 

31
sms_1190

Dans le Kafka FAQ vous pouvez lire:

Lorsqu'un courtier démarre, il enregistre son adresse IP/port dans ZK. Vous devez vous assurer que l'adresse IP enregistrée correspond à ce qui est répertorié dans metadata.broker.list dans la configuration du producteur. Par défaut, l'adresse IP enregistrée est donnée par InetAddress.getLocalHost.getHostAddress(). En règle générale, cela devrait renvoyer l'adresse IP réelle de l'hôte. Cependant, parfois (par exemple, dans EC2), l’ip retourné est interne et ne peut pas être connecté de l’extérieur. La solution consiste à définir explicitement l'adresse IP de l'hôte pour qu'elle soit enregistrée dans ZK en définissant la propriété Host.name dans server.properties. Dans un autre cas rare où l'hôte/port de liaison est différent de l'hôte/port pour la connexion client, vous pouvez définir advertised.Host.name et advertised.port pour la connexion client.

34
Lundahl

J'ai résolu ce problème en définissant advertised.Host.name dans server.properties et metadata.broker.list dans producer.properties à l'adresse IP publique et Host.name à 0.0.0.0.

30
sms_1190

Je viens de faire cela dans AWS. Demandez d’abord au serveur Kafka d’écouter sur la bonne interface/IP en utilisant Host.name. Dans votre cas, il s’agit de l’IP interne, et non de localhost, car vous souhaitez que les clients extérieurs à Kafka se connectent. Tous les clients locaux devront utiliser cette même adresse, pas localhost.

Définissez ensuite advertised.Host.name sur un nom d’hôte et non sur une adresse IP. L'astuce consiste à faire en sorte que ce nom d'hôte soit toujours résolu en IP correcte pour les ordinateurs internes et externes. J'utilise/etc/hosts à l'intérieur et DNS à l'extérieur. Voir mon réponse complète sur Kafka et la résolution de noms ici }.

15
Cedar Myers

Le moyen le plus simple pour accéder à votre serveur Kafka (version kafka_2.11-1.0.0) sur le serveur EC2 à partir d'un client du réseau externe consiste à modifier le fichier de propriétés. 

kafka_2.11-1.0.0/config/server.properties

Et modifier la ligne suivante

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

En utilisant votre adresse publique

Vérifié le 2.11-2.0.0

12
Peter Koncz

Vous trouverez ci-dessous les étapes à suivre pour connecter Kafka en dehors d’une instance EC2.

  1. Ouvrez le fichier de propriétés du serveur Kafka sur EC2.

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

  2. Définissez la valeur de advertised.listeners sur 

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

    Cela devrait être votre DNS public (IPv4) d'instance EC2.

  3. Arrêtez le serveur Kafka.

  4. Démarrez le serveur Kafka pour voir les modifications de configuration ci-dessus en action.

  5. Vous pouvez maintenant vous connecter à votre instance Kafka of EC2 depuis l’extérieur ou depuis votre hôte local.

    Essayé et testé sur kafka_2.11-2.0.0

Pour EC2, vous devez éditer le fichier /etc/hosts pour ajouter:

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

où XXX ... est votre adresse IP externe et ip-AAAA-AAAA-AAAA-AAAA est la chaîne renvoyée par la commande hostname. Vous pouvez utiliser 127.0.0.1 à la place de votre adresse IP externe pour communiquer à l'intérieur du serveur.

Host.name est obsolète - comme le sont advertised.Host.name et advertised.port

0
Mr_and_Mrs_D

Si vous voulez accéder depuis le réseau local, changez les 2 fichiers suivants-

  1. Dans config/server.properties

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

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

Dans mon cas, server.ip.in.lan était 192.168.15.150.

0
Sharif Shahriar