• docker-compose快速搭建kafka集群


    前言

    当前是在学习kafka3.0的教程,基于需求就进行搭建了kafka集群,kafka在2.8.0之前是需要zookeeper的,之后可以不需要依赖了,目前的部署方案是基于zookeeper集群的情况下进行的,若是你还没有搭建zookeeper集群,可见:docker-compose快速搭建Zookeeper集群

    我自己搭建录制了个视频见:docker-compose快速搭建zookeeper集群以及kafka集群

    所有博客文件目录索引:博客目录索引(持续更新)

    docker-compose快速搭建kafka集群(较详细)

    详细步骤如下:

    1、拉取kafka3.0.0的镜像

    docker pull bitnami/kafka:3.0.0
    
    • 1

    2、编写docker compose的yaml配置文件

    需要说明一下,当前的网络使用的是之前已经创建的网络【zk-net】,所以在下面的配置文件中只需要进行网络声明一下,之后的服务即可指定net-work了(若是不声明就会报错)。

    在/home/dockerfiles目录中创建docker-compose-kafkas.yml文件:

    version: '3.1'
    
    # 外部网络声明(否则无法使用之前已经定义好的网络)
    networks:
       zk-net:
            external: true
    
    services:
      kafka1:
        image: 'bitnami/kafka:3.0.0'
        container_name: kafka1
        hostname: kafka1
        networks:
          - zk-net
        ports:
          - '9093:9092'
        environment:
          - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2182,zoo3:2183/kafka
          - KAFKA_BROKER_ID=1      
          - KAFKA_INTER_BROKER_LISTENER_NAME=CLIENT
          - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT
          - KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka1:9092,EXTERNAL://kafka1:9093
          - KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9093
          - ALLOW_PLAINTEXT_LISTENER=yes
      kafka2:
        image: 'bitnami/kafka:3.0.0'
        container_name: kafka2
        hostname: kafka2
        networks:
          - zk-net
        ports:
          - '9094:9092'
        environment:
          - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2182,zoo3:2183/kafka
          - KAFKA_BROKER_ID=2   
          - KAFKA_INTER_BROKER_LISTENER_NAME=CLIENT
          - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT
          - KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka2:9092,EXTERNAL://kafka2:9094
          - KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9094
          - ALLOW_PLAINTEXT_LISTENER=yes
      kafka3:
        image: 'bitnami/kafka:3.0.0'
        container_name: kafka3
        hostname: kafka3
        networks:
          - zk-net
        ports:
          - '9095:9092'
        environment:
          - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2182,zoo3:2183/kafka
          - KAFKA_BROKER_ID=3  
          - KAFKA_INTER_BROKER_LISTENER_NAME=CLIENT
          - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT
          - KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka3:9092,EXTERNAL://kafka3:9095
          - KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9095
          - ALLOW_PLAINTEXT_LISTENER=yes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • KAFKA_CFG_ZOOKEEPER_CONNECT:zookeeper连接的ip地址可以有多个。
    • KAFKA_BROKER_ID:broker的全局唯一编号,不能重复
    • KAFKA_INTER_BROKER_LISTENER_NAME:kafka内部的broker监听名称。
    • KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP:监听的协议集合多个。(这里CLIENT指的是内部,EXTERNAL是外部,之后就不能够使用PLAINTEXT作为协议名了,只能够使用定义的CLIENT、EXTERNAL)。
    • KAFKA_CFG_ADVERTISED_LISTENERS:修改为服务器ip,在真实生产环境中不能是localhost,监听的服务端口有多个。
    • KAFKA_CFG_LISTENERS:监听地址。
    • ALLOW_PLAINTEXT_LISTENER:允许使用PLAINTEXT listener监听器。

    注意点:①在KAFKA_CFG_ADVERTISED_LISTENERS配置多个监听者的时候端口是不能一样的。

    3、启动kafka集群服务

    # -f表示指定某个配置文件名   -d:表示后台启动
    docker-compose -f docker-compose-kafkas.yml up -d 
    
    • 1
    • 2

    image-20220824194830197

    如何测试是否已经连接zookeeper呢?

    # 进入zookeeper集群中的某一个服务
    docker exec -it zoo2 /bin/bash
    
    # 进入bin目录
    cd bin
    
    # 客户端工具连接到服务
    ./zkCli.sh -server 127.0.0.1:2181
    
    # 查看对应的kafka结点信息
     ls /kafka/brokers/ids
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    搭建成功如下信息所示:

    image-20220824195053333

    搭建zookeeper集群以及kafka集群所需内存如下:

    image-20220824200310698

    若是你的集群中某个服务没有启动起来,可以使用如下查看指定服务日志:

    docker logs 服务名
    
    • 1

    **注意:**停止 Kafka 集群时,一定要等 Kafka 所有节点进程全部停止后再停止 Zookeeper集群。因为 Zookeeper 集群当中记录着 Kafka 集群相关信息,Zookeeper 集群一旦先停止,Kafka 集群就没有办法再获取停止进程的信息,只能手动杀死 Kafka 进程了。


    docker-compose快速搭建Zookeeper集群+kafka集群

    创建文件docker-compose-zookeepers-kafkas.yml

    注意:为了能够Java连接到容器中的kafka,在每个kafka服务中我没有设置其他协议别名,就是单独使用了一个PLAINTEXT,并且每个服务都各自映射自己端口,而不是之前的8083:8082,8084:8082。

    • 我自己的话也试过定义多个协议名方案不过都不行,只能最终方案选择这个。

    准备操作:查看你的公网ip地址或者你的虚拟机ip地址。

    image-20220825152245466

    拿到这个ip地址后去修改下面配置中对应的ip地址,只有这样你的java程序才能够发送消息成功并接收!

    version: '3.1'
    
    networks:
      zk-net:  # 网络名
        name: zk-net
        driver: bridge
    
    services:
      # zookeeper集群
      zoo1:
        image: zookeeper:3.8.0
        container_name: zoo1   # 容器名称
        restart: always       # 开机自启
        hostname: zoo1        # 主机名
        ports:
          - 2181:2181         # 端口号
        environment:
          ZOO_MY_ID: 1
          ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
        networks:
          - zk-net
      zoo2:
        image: zookeeper:3.8.0
        container_name: zoo2
        restart: always
        hostname: zoo2
        ports:
          - 2182:2181
        environment:
          ZOO_MY_ID: 2
          ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
        networks:
          - zk-net
      zoo3:
        image: zookeeper:3.8.0
        container_name: zoo3
        restart: always
        hostname: zoo3
        ports:
          - 2183:2181
        environment:
          ZOO_MY_ID: 3
          ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
        networks:
          - zk-net
      # kafka集群
      kafka1:
        image: 'bitnami/kafka:3.0.0'
        container_name: kafka1
        hostname: kafka1
        networks:
          - zk-net
        ports:
          - '9092:9092'
        environment:
          - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2182,zoo3:2183/kafka
          - KAFKA_BROKER_ID=1   
          - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092
          - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.10.105:9092
          - ALLOW_PLAINTEXT_LISTENER=yes
        depends_on:
          - zoo1
          - zoo2
          - zoo3
      kafka2:
        image: 'bitnami/kafka:3.0.0'
        container_name: kafka2
        hostname: kafka2
        networks:
          - zk-net
        ports:
          - '9093:9093'
        environment:
          - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2182,zoo3:2183/kafka
          - KAFKA_BROKER_ID=2
          - KAFKA_CFG_LISTENERS=PLAINTEXT://:9093
          - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.10.105:9093
          - ALLOW_PLAINTEXT_LISTENER=yes
        depends_on:
          - zoo1
          - zoo2
          - zoo3
      kafka3:
        image: 'bitnami/kafka:3.0.0'
        container_name: kafka3
        hostname: kafka3
        networks:
          - zk-net
        ports:
          - '9094:9094'
        environment:
          - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2182,zoo3:2183/kafka
          - KAFKA_BROKER_ID=3  
          - KAFKA_CFG_LISTENERS=PLAINTEXT://:9094
          - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.10.105:9094
          - ALLOW_PLAINTEXT_LISTENER=yes
        depends_on:
          - zoo1
          - zoo2
          - zoo3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100

    启动服务命令:

    # -f表示指定某个配置文件名   -d:表示后台启动
    docker-compose -f docker-compose-zookeepers-kafkas.yml up -d 
    
    # 查看当前服务
    docker ps
    
    • 1
    • 2
    • 3
    • 4
    • 5

    image-20220824201414277

    参考资料

    [1]. ERROR: SERVICE “CEREBRO“ USES AN UNDEFINED NETWORK

    [2]. kafka报No security protocol defined for listener INTERNAL

    [3]. kafka 外部无法连接进行生产消费(服务器docker搭建)

    [4]. docker-compose 搭建 kafka 集群

    [5]. 基于Docker-compose构建Kafka集群

    [6]. docker-compose搭建Kafka集群,并应用代码

  • 相关阅读:
    大数据:Hive简介及核心概念
    基于 HBase & Phoenix 构建实时数仓(1)—— Hadoop HA 安装部署
    Linux:进程地址空间的简易认识
    用 Python 绘制动态可视化图表,太酷了
    ElementUI中Tree组件使用
    【02】数据类型-数据变量
    phpcms打开后台首页时向官网发送升级请求觉得卡怎么办?
    流式编程 stream
    【Android 标题文字居中 快速实现】
    Python学习之编写学生信息管理系统
  • 原文地址:https://blog.csdn.net/cl939974883/article/details/126511784