• 使用docker-compose部署kafka(wurstmeister/kafka)以及常见问题解决


    版本信息:

    日期:2020-04-20

    wurstmeister/kafka:2.12-2.3.0

    docker-ce 版本18.09

    CentOS 7.6

     

    官网:

    https://github.com/wurstmeister/kafka-docker

    https://github.com/wurstmeister/kafka-docker/wiki/Connectivity

     

    实践

    依赖的zookeeper

    KAFKA_ZOOKEEPER_CONNECT 是必须的,指定了kafka 连接哪个 zookeeper。 直接写zookeeper就可以,因为同一台物理机上,可以使用service的名字找到相应的服务。

    两种写法

    [官网](https://github.com/wurstmeister/kafka-docker/wiki/Connectivity)上说:

    Deprecated

    KAFKA_HOST:
    KAFKA_PORT: 9092
    KAFKA_ADVERTISED_HOST_NAME: one.prod.com
    KAFKA_ADVERTISED_PORT: 9092

    Current

    KAFKA_LISTENERS: PLAINTEXT://:9092
    KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://one.prod.com:9092

    经实践,以下配置都可以正常启动和使用 kafka 向 topic 发送和消费数据

    旧的写法

    version: '3.2'
    services:
    zookeeper:
      image: wurstmeister/zookeeper
      ports:
         - "2181:2181"
       restart: always
    kafka:
      image: wurstmeister/kafka:2.12-2.3.0
      ports:
         - "9092:9092"
      environment:
         - KAFKA_ADVERTISED_HOST_NAME=${IP}
         - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
      volumes:
         - /var/run/docker.sock:/var/run/docker.sock
       restart: always

    新的写法

    version: '3.2'
    services:
    zookeeper:
      image: wurstmeister/zookeeper
      ports:
         - "2181:2181"
       restart: always
    kafka:
      image: wurstmeister/kafka:2.12-2.3.0
      ports:
         - "9092:9092"
      environment:
         - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
         - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://${IP}:9092
         - KAFKA_LISTENERS=PLAINTEXT://:9092
      volumes:
         - /var/run/docker.sock:/var/run/docker.sock
       restart: always

    注意 KAFKA_LISTENERS=PLAINTEXT://:9092 不要写成 KAFKA_LISTENERS=PLAINTEXT://${IP}:9092, 否则启动kafka时会报错:

     

    使用了namespace功能的部署方式

    docker 有个高级功能 namespace, 它的主要功能就是:将物理机的非 root 用户映射为 docker 内的 root用户。这样 docker 容器内如果写物理机上的文件夹(文件),它的owner就不是 root 而是普通用户了。

    具体参见另一篇笔记。

    如果使用了这个高级功能,使用前面提到的部署方式部署 kafka 就不成了。需要将2种方式结合起来。

    version: '3.2'
    services:
    zookeeper:
      image: wurstmeister/zookeeper
      ports:
         - "2181:2181"
      container_name: "zookeeper"
       restart: always
    kafka:
      image: wurstmeister/kafka:2.12-2.3.0
      container_name: "kafka"
      ports:
         - "9092:9092"
      environment:
         - TZ=CST-8
         - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
         # 非必须,设置自动创建 topic
         - KAFKA_AUTO_CREATE_TOPICS_ENABLE=true
         - KAFKA_ADVERTISED_HOST_NAME=${IP}
         - KAFKA_ADVERTISED_PORT=9092
         - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://${IP}:9092
         - KAFKA_LISTENERS=PLAINTEXT://:9092
         # 非必须,设置对内存
         - KAFKA_HEAP_OPTS=-Xmx1G -Xms1G
         # 非必须,设置保存7天数据,为默认值
         - KAFKA_LOG_RETENTION_HOURS=168
      volumes:
         # 将 kafka 的数据文件映射出来
         - ${DATA_PATH}/kafka:/kafka
         - /var/run/docker.sock:/var/run/docker.sock
       restart: always

     

    解决问题

    在部署 kafka 的过程中遇到了很多问题,每遇到一个问题,就求助于搜索引擎,还问使用过的同事,结果发现效果并不好。因为环境不一样,kafka的版本不一样,还会有矛盾的说法,会误导。比如,我在搜索引擎查到的结果让我一直认为 KAFKA_LISTENERS 应该配置为:PLAINTEXT://0.0.0.0:9092 或 PLAINTEXT://${IP}:9092,各种试,各种卡,结果发现这根本是错的。汗~

    反思解决问题的过程,发现,最有帮助的是官方文档部署过程中打印出来的log。为了以后和给其他人参考,特此记录下来。

     

    部署失败解决方式

    查看log, 根据 log 提示添加或修改环境变量,解决问题

    docker logs kafka

    或者

    docker-compose up

     

    调试产生和消费数据

    查询kafka log 中的 brokerId,假设 brokerId=1001

    docker logs kafka

     

    进入 kafka 的客户端,如果没有使用 kafka 容器自带的

    docker exec -ti kafka bash
    cd opt/kafa_<版本>/bin
    1. 查看 kafka 在 zookeeper 中的注册信息,出现图中类似的信息表示OK

      假设:IP=10.1.10.33

    ./zookeeper-shell.sh 10.1.10.33 <<< "get /brokers/ids/1001"

    如果没有出现信息,代表 kafka 和 zookeeper 没有连通,查看是否是部署问题。

    注意上图中红框部分,如果没有出现具体 IP 或者映射过的域名,那么,修改环境变量。

    1. 测试产生数据

      # 向k2_test topic写数据,输入任意内容后按回车输入下一条消息,按Crtl+c退出
      ./kafka-console-producer.sh --broker-list 10.1.10.33:9092 --topic k2_test

      出现提示符(>),可以打字,就代表可以了。

      如果等待了几分钟也没有提示符出现,那么代表 kafka 不通。影响这个的环境变量:KAFKA_ADVERTISED_LISTENERS

       

    2. 测试消费数据

      # 消费数据,应该能看到上一条命令时输入的消息,按Crtl+c退出
      ./kafka-console-consumer.sh --bootstrap-server 10.1.10.33:9092 --from-beginning --topic k2_test

      如果等待了几分钟也没有提示符出现,那么代表 kafka 不通。影响这个的环境变量:KAFKA_LISTENERS

     

    问题记录

    1. 每次 kafka 部署之前要把之前的容器删除,否则会出现一会成功一会不成功的问题。

      docker rm -f kafka zookeeper
    2. 一般来说,KAFKA_BROKER_ID 是不需要指定的。

      每次移除两个容器后,重新部署后,brokerId 都会从 1001 开始。

      如果不移除,brokerId 会自增, zookeeper 中会有之前的 brokerId 残留,在使用过程中会有一些 warning 但不影响使用

    3. kafka 其他配置

      docker exec -ti kafka bash
      cat opt/kafa_<版本>/config/server.properties

      比如 kafka 的配置中有 log.retention.hours = 168

      在 docker-compose.yml 中配置为 KAFKA_LOG_RETENTION_HOURS

  • 相关阅读:
    JAVA实现图的邻接表以及DFS
    对于JAVA多线程卖票小程序的理解
    我的第一篇博客
    The 'with' and 'as' Keywords
    Buffering Data
    rstrip
    MapFields和并行计算(OpenFOAM)
    Python 调用自己编写的Class
    vs2013和vs2010的配置
    Eclipse的配置
  • 原文地址:https://www.cnblogs.com/snow-backup/p/12750602.html
Copyright © 2020-2023  润新知