Я запускаю экземпляр zookeeper и kafka из файла docker yaml в моей Ubuntu 18.04.
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
ports:
- "9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: localhost
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_CREATE_TOPICS: "test-topic:5:2"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
это работает как
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3d84a6b39f7 wurstmeister/kafka "start-kafka.sh" 3 minutes ago Up 3 minutes 0.0.0.0:49157->9092/tcp desktop_kafka_1
b2012f08b3f9 wurstmeister/zookeeper "/bin/sh -c '/usr/sb…" 5 hours ago Up 3 minutes 22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp desktop_zookeeper_1
однако клиент kafka не смог подключить kafka как
const { Kafka,logLevel,CompressionCodecs,CompressionTypes } = require('kafkajs');
const kafka = new Kafka({
logLevel: logLevel.DEBUG,
brokers: ['localhost:9092'], // tried on ['192.168.1.6:9092']
clientId: 'example-producer',
})
const topic = 'topic-test'
const producer = kafka.producer()
const getRandomNumber = () => Math.round(Math.random(10) * 1000)
const createMessage = num => ({
key: `key-${num}`,
value: `value-${num}-${new Date().toISOString()}`,
})
const sendMessage = () => {
return producer
.send({
topic,
compression: CompressionTypes.GZIP,
messages: Array(getRandomNumber())
.fill()
.map(_ => createMessage(getRandomNumber())),
})
.then(console.info)
.catch(e => console.error(`[example/producer] ${e.message}`, e))
}
const run = async () => {
await producer.connect()
setInterval(sendMessage, 3000)
}
run().catch(e => console.error(`[example/producer] ${e.message}`, e))
вывод кода
[example/producer] Connection error: connect ECONNREFUSED 127.0.0.1:9092 KafkaJSNonRetriableError
Caused by: KafkaJSConnectionError: Connection error: connect ECONNREFUSED 127.0.0.1:9092
at Socket.onError (/home/xsz/Desktop/node_modules/kafkajs/src/network/connection.js:152:23)
at Socket.emit (events.js:314:20)
at emitErrorNT (internal/streams/destroy.js:92:8)
at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
at processTicksAndRejections (internal/process/task_queues.js:84:21) {
name: 'KafkaJSNumberOfRetriesExceeded',
retriable: false,
helpUrl: undefined,
originalError: KafkaJSConnectionError: Connection error: connect ECONNREFUSED 127.0.0.1:9092
at Socket.onError (/home/xsz/Desktop/node_modules/kafkajs/src/network/connection.js:152:23)
at Socket.emit (events.js:314:20)
at emitErrorNT (internal/streams/destroy.js:92:8)
at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
at processTicksAndRejections (internal/process/task_queues.js:84:21) {
retriable: true,
helpUrl: undefined,
broker: 'localhost:9092',
code: 'ECONNREFUSED'
},
retryCount: 5,
retryTime: 10304
}
В docker-compose.ymal KAFKA_ADVERTISED_HOST_NAME настроен как localhost или 192.168.1.6 (локальный IP-адрес хост-машины), оба показывают ту же ошибку, что и выше.
примечание: используя
вывод команды ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP>
inet 127.0.0.1/8 scope host lo
3: wlx08570033e6c1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu
inet 192.168.1.6/24 brd 192.168.1.255 scope global noprefixroute wlx08570033e6c1
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
5: br-c66cb3672872: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu inet 172.18.0.1/16 brd 172.18.255.255 scope global br-c66cb3672872
22: br-521b1eb41768: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu
inet 172.19.0.1/16 brd 172.19.255.255 scope global br-521b1eb41768
последняя попытка:
Я внес изменения в файл docker-compose.yaml.
KAFKA_ADVERTISED_HOST_NAME: 172.17.0.1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
и запуск кода на хост-компьютере.
const kafka = new Kafka({
logLevel: logLevel.DEBUG,
brokers: ['172.17.0.1:9092'], // tried on ['192.168.1.6:9092']
clientId: 'example-producer',
})
но все еще сталкиваюсь с той же проблемой, что не так
Необходимо внести некоторые изменения
сначала измените узел подключения на localhost
const kafka = new Kafka({
logLevel: logLevel.DEBUG,
brokers: ['localhost:9092'],
clientId: 'example-producer',
})
затем внутри файла docker-compose
изменить ports
и добавить links
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
links:
- zookeeper
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: localhost
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_CREATE_TOPICS: "test-topic:5:2"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
в последний раз вы используете только одного брокера в своем компоновочном файле
Я смотрю на вашу конфигурацию с помощью Kafka-tool2.0, кажется, что есть только один раздел для «topic-test», поэтому вы видите эту ошибку, используйте больше брокеров, чтобы избежать этого.
{"level":"DEBUG","timestamp":"2020-12-15T07:54:05.315Z","logger":"kafkajs","message":"[Connection] Request Metadata(key: 3, version: 6)","broker":"localhost:9092","clientId":"example-producer","correlationId":25,"expectResponse":true,"size":47}There is no listener on the leader broker that matches the listener on which metadata request was processed KafkaJSNonRetriableError Caused by: KafkaJSProtocolError: There is no listener on the leader broker that matches the listener on which metadata request was processed.
Попробовано на Linux Mint 20
выход:
{"level":"DEBUG","timestamp":"2020-12-15T06:55:59.662Z","logger":"kafkajs","message":"[Connection] Response Produce(key: 0, version: 7)","broker":"localhost:9092","clientId":"example-producer","correlationId":46,"size":58,"data":{"topics":[{"topicName":"topic-test","partitions":[{"partition":0,"errorCode":0,"baseOffset":"18379","logAppendTime":"-1","logStartOffset":"0"}]}],"throttleTime":0,"clientSideThrottleTime":0}}
[
{
topicName: 'topic-test',
partition: 0,
errorCode: 0,
baseOffset: '18379',
logAppendTime: '-1',
logStartOffset: '0'
}
]
я смотрю на вашу конфигурацию с помощью Kafka-tool2.0, кажется, что есть только один раздел для «topic-test», поэтому вы видите эту ошибку
Я так понимаю, вы имеете в виду тестовую тему: 5:2, это 5 разделов и 2 реплики. если мне нужно сделать 5 разделов, то мне нужно построить кластер kafka с 5 экземплярами kafka, не так ли?
Вы неправильно сопоставили порт своего экземпляра kafka в файле компоновки докеров, который вы должны изменить
ports:
- "9092"
с
ports:
- "9092:9092"
так как теперь ваш контейнер получает произвольный порт
0.0.0.0:49157->9092/tcp
кажется, кафка подключена, но возникает другая проблема, говорящая {"level": "DEBUG", "timestamp": "2020-12-15T07:54:05.315Z", "logger":"kafkajs","mess age":"[Connection] Request Metadata(key: 3, version: 6)","broker":"localhost:9092","clientId":"example-producer","correlationId":25," expectResponse":true,"size":47} На ведущем брокере нет прослушивателя, который соответствует прослушивателю, на котором был обработан запрос метаданных. какой запрос метаданных был обработан.