繁体   English   中英

无法连接到本地网络中的 kafka 容器

[英]can't connect to kafka container in the local network

我正在我的 ubuntu 18.04 中的 docker yaml 文件中运行 zookeeper 和 kafka 实例

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.log)
    .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 薄荷 20

output:

{"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'
  }
]

您尚未在 docker 撰写文件中正确映射您的 kafka 实例的端口,您应该更改

ports:
  - "9092"

ports:
  - "9092:9092"

现在你的容器被分配了一个任意端口0.0.0.0:49157->9092/tcp

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM