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é.
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 parInetAddress.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
dansserver.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éfiniradvertised.Host.name
etadvertised.port
pour la connexion client.
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
.
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 }.
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
Vous trouverez ci-dessous les étapes à suivre pour connecter Kafka en dehors d’une instance EC2.
Ouvrez le fichier de propriétés du serveur Kafka sur EC2.
/kafka_2.11-2.0.0/config/server.properties
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.
Arrêtez le serveur Kafka.
Démarrez le serveur Kafka pour voir les modifications de configuration ci-dessus en action.
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
Si vous voulez accéder depuis le réseau local, changez les 2 fichiers suivants-
Dans config/server.properties
advertised.listeners=PLAINTEXT://server.ip.in.lan:9092
Dans config/producteur.properties
bootstrap.servers=server.ip.in.lan:9092
Dans mon cas, server.ip.in.lan était 192.168.15.150.