docker-compose的方式搭建 kafka KRaft 模式集群

文章目录

  • 前言
    • [docker-compose的方式搭建 kafka KRaft 模式集群](#docker-compose的方式搭建 kafka KRaft 模式集群)
      • [1. 创建docker网络](#1. 创建docker网络)
      • [2. 检查docker网络创建情况](#2. 检查docker网络创建情况)
      • [3. 制作存储目录唯一 ID](#3. 制作存储目录唯一 ID)
      • [4. 修改Dockerfile构建](#4. 修改Dockerfile构建)
      • [5. 重新制作镜像](#5. 重新制作镜像)
      • [6. 制作docker-compose.yml](#6. 制作docker-compose.yml)
      • [7. 在本机新建挂载目录](#7. 在本机新建挂载目录)
      • [8. 通过docker-compose 启动](#8. 通过docker-compose 启动)
      • [9. 查看网络情况](#9. 查看网络情况)
      • [10. 检查容器是否正常启动](#10. 检查容器是否正常启动)
      • [11. 检查日志是否启动成功](#11. 检查日志是否启动成功)
      • [12. 检查 Kafka 状态](#12. 检查 Kafka 状态)
      • [13. 检查 Kafka Broker 节点的连接性](#13. 检查 Kafka Broker 节点的连接性)
      • [14. 容器外部链接kafka集群](#14. 容器外部链接kafka集群)
      • [15. 停止所有容器](#15. 停止所有容器)

前言

如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。

而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


docker-compose的方式搭建 kafka KRaft 模式集群

1. 创建docker网络

docker network create kafka_network

2. 检查docker网络创建情况

docker network inspect kafka_network

删除网络命令:

docker network rm kafka_network

3. 制作存储目录唯一 ID

先运行 ./kafka-storage.sh random-uuid

因为 格式化 Kafka 存储目录时必须使用相同的存储目录唯一 ID,原因如下:

  • UUID 的作用: bin/kafka-storage.sh random-uuid 生成的是一个唯一的标识符(UUID),这个标识符会用于初始化 Kafka 存储目录。它是 Kafka 内部标识数据存储的一种方式,用于确保每个 Kafka 集群的元数据和日志目录是唯一的。
  • 格式化过程: 当你执行 bin/kafka-storage.sh format -t -c 时,Kafka 会根据指定的 UUID 来初始化存储目录。如果你使用了不同的 UUID 格式化存储目录,Kafka 会认为这是一个不同的存储系统,导致节点 ID 不匹配,最终无法启动。
  • 一致性要求: Kafka 在 KRaft 模式下启动时,依赖 UUID 来识别存储目录,因此格式化过程中的 UUID 必须与集群配置一致,才能确保存储目录能够被正确识别和加载。

docker run -it yzy-kafka-3.7.0:v1.0 /bin/bash

./kafka-storage.sh random-uuid

唯一ID : Rw1XXncDQ0atpj16dFPdNw

4. 修改Dockerfile构建

相比单节点kafka构建,然后以此镜像运行容器来说,采用docker-compose 管理多节点kafka,格式化操作只能进行一次,因此要将Dockerfile构建中的格式化操作去掉,在docker-compose管理多节点kafka容器中的数据格式化操作,同时将启动环节也去掉,在docker-compose 里进行管理。

Dockerfile:

bash 复制代码
# 使用包含JDK 8 的基础镜像
FROM yzy:v2.3
MAINTAINER yangzhenyu


# 设置 Kafka 版本
ARG KAFKA_VERSION=3.7.0
ARG SCALA_VERSION=2.13
COPY kafka_${SCALA_VERSION}-${KAFKA_VERSION}.tgz /app/appuser/
# 配置 KRaft 模式的 Kafka server
COPY kraft-server.properties /app/appuser/kafka_${SCALA_VERSION}-${KAFKA_VERSION}/config/
# 下载并解压 Kafka
RUN cd /app/appuser \
    && mkdir data \
    && tar -xzf kafka_${SCALA_VERSION}-${KAFKA_VERSION}.tgz
# 设置 Kafka 的环境变量
ENV KAFKA_HOME=/app/appuser/kafka_${SCALA_VERSION}-${KAFKA_VERSION}
ENV PATH=$KAFKA_HOME/bin:$PATH


# 暴露 Kafka 默认端口
EXPOSE 9092


# 设置工作目录
WORKDIR /app/appuser/kafka_${SCALA_VERSION}-${KAFKA_VERSION}

注:这里的yzy:v2.3是我自己制作的公用基础镜像。

5. 重新制作镜像

docker build -t yzy-kafka-3.7.0:v1.0 .

这里的 . 表示当前目录,是 Dockerfile 所在的目录路径。

6. 制作docker-compose.yml

bash 复制代码
version: '3.8'
services:
  kafka1:
    image: yzy-kafka-3.7.0:v1.0
    container_name: kafka1
    volumes:
      - /f/kafka-docker/node1/data:/app/appuser/data
      - ./kraft-server-1.properties:/app/appuser/kafka_2.13-3.7.0/config/kraft-server.properties
    ports:
      - "19092:9092"  # 外部端口 19092
      - "19093:9093"  # 控制器端口
    networks:
      kafka_network:
        ipv4_address: 192.168.160.2
    restart: unless-stopped
    command: bash -c "cd /app/appuser/kafka_2.13-3.7.0/bin && ./kafka-storage.sh format -t Rw1XXncDQ0atpj16dFPdNw -c /app/appuser/kafka_2.13-3.7.0/config/kraft-server.properties --ignore-formatted && ./kafka-server-start.sh /app/appuser/kafka_2.13-3.7.0/config/kraft-server.properties"


  kafka2:
    image: yzy-kafka-3.7.0:v1.0
    container_name: kafka2  
    volumes:
      - /f/kafka-docker/node2/data:/app/appuser/data
      - ./kraft-server-2.properties:/app/appuser/kafka_2.13-3.7.0/config/kraft-server.properties
    ports:
      - "29092:9092"  # 外部端口 29092
      - "29093:9093"  # 控制器端口
    networks:
      kafka_network:
        ipv4_address: 192.168.160.3
    restart: unless-stopped
    command: bash -c "cd /app/appuser/kafka_2.13-3.7.0/bin && ./kafka-storage.sh format -t Rw1XXncDQ0atpj16dFPdNw -c /app/appuser/kafka_2.13-3.7.0/config/kraft-server.properties --ignore-formatted && ./kafka-server-start.sh /app/appuser/kafka_2.13-3.7.0/config/kraft-server.properties"


  kafka3:
    image: yzy-kafka-3.7.0:v1.0
    container_name: kafka3
    volumes:
      - /f/kafka-docker/node3/data:/app/appuser/data
      - ./kraft-server-3.properties:/app/appuser/kafka_2.13-3.7.0/config/kraft-server.properties
    ports:
      - "39092:9092"  # 外部端口 39092
      - "39093:9093"  # 控制器端口
    networks:
      kafka_network:
        ipv4_address: 192.168.160.4
    restart: unless-stopped
    command: bash -c "cd /app/appuser/kafka_2.13-3.7.0/bin && ./kafka-storage.sh format -t Rw1XXncDQ0atpj16dFPdNw -c /app/appuser/kafka_2.13-3.7.0/config/kraft-server.properties --ignore-formatted && ./kafka-server-start.sh /app/appuser/kafka_2.13-3.7.0/config/kraft-server.properties"


networks:
  kafka_network:
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.160.0/24

kraft-server-1.properties:

bash 复制代码
# 设置 broker 的 ID
broker.id=1
# 设置 Kafka 的日志目录(即数据存储目录)
log.dirs=/app/appuser/data


# (内部使用)设置监听器和端口,KRaft 模式的 Kafka 需要同时定义 broker 和 controller 的监听器
listeners=PLAINTEXT://192.168.160.2:9092,CONTROLLER://0.0.0.0:9093


# 设置 Kafka controller 的监听器名称
controller.listener.names=CONTROLLER


# (外部使用)设置广告的 broker 地址 可路由并且可达的IP地址
advertised.listeners=PLAINTEXT://192.168.160.2:9092


# 设置 controller quorum 的成员
controller.quorum.voters=1@192.168.160.2:9093,2@192.168.160.3:9093,3@192.168.160.4:9093


# 设置日志清理策略(如删除旧日志)
log.cleanup.policy=delete


# 设置日志切分大小
log.segment.bytes=1073741824


# 启用 Kafka 的 KRaft 模式
process.roles=broker,controller


# 开启 Kafka 支持的特性
confluent.support.metrics.enable=false


# 设置允许的最大消息大小(例如,允许最大 1GB)
message.max.bytes=1073741824
# 设置单个消息的最大值(如果使用了压缩)
replica.fetch.max.bytes=1073741824
# 设置生产者最大请求大小(与 Kafka 的 message.max.bytes 配置相匹配)
max.request.size=1073741824

kraft-server-2.properties:

bash 复制代码
# 设置 broker 的 ID
broker.id=2
# 设置 Kafka 的日志目录(即数据存储目录)
log.dirs=/app/appuser/data


# (内部使用)设置监听器和端口,KRaft 模式的 Kafka 需要同时定义 broker 和 controller 的监听器
listeners=PLAINTEXT://192.168.160.3:9092,CONTROLLER://0.0.0.0:9093


# 设置 Kafka controller 的监听器名称
controller.listener.names=CONTROLLER


# (外部使用)设置广告的 broker 地址 可路由并且可达的IP地址
advertised.listeners=PLAINTEXT://192.168.160.3:9092


# 设置 controller quorum 的成员
controller.quorum.voters=1@192.168.160.2:9093,2@192.168.160.3:9093,3@192.168.160.4:9093


# 设置日志清理策略(如删除旧日志)
log.cleanup.policy=delete


# 设置日志切分大小
log.segment.bytes=1073741824


# 启用 Kafka 的 KRaft 模式
process.roles=broker,controller


# 开启 Kafka 支持的特性
confluent.support.metrics.enable=false


# 设置允许的最大消息大小(例如,允许最大 1GB)
message.max.bytes=1073741824
# 设置单个消息的最大值(如果使用了压缩)
replica.fetch.max.bytes=1073741824
# 设置生产者最大请求大小(与 Kafka 的 message.max.bytes 配置相匹配)
max.request.size=1073741824

kraft-server-3.properties:

bash 复制代码
# 设置 broker 的 ID
broker.id=3
# 设置 Kafka 的日志目录(即数据存储目录)
log.dirs=/app/appuser/data


# (内部使用)设置监听器和端口,KRaft 模式的 Kafka 需要同时定义 broker 和 controller 的监听器
listeners=PLAINTEXT://192.168.160.4:9092,CONTROLLER://0.0.0.0:9093


# 设置 Kafka controller 的监听器名称
controller.listener.names=CONTROLLER


# (外部使用)设置广告的 broker 地址 可路由并且可达的IP地址
advertised.listeners=PLAINTEXT://192.168.160.4:9092


# 设置 controller quorum 的成员
controller.quorum.voters=1@192.168.160.2:9093,2@192.168.160.3:9093,3@192.168.160.4:9093


# 设置日志清理策略(如删除旧日志)
log.cleanup.policy=delete


# 设置日志切分大小
log.segment.bytes=1073741824


# 启用 Kafka 的 KRaft 模式
process.roles=broker,controller


# 开启 Kafka 支持的特性
confluent.support.metrics.enable=false


# 设置允许的最大消息大小(例如,允许最大 1GB)
message.max.bytes=1073741824
# 设置单个消息的最大值(如果使用了压缩)
replica.fetch.max.bytes=1073741824
# 设置生产者最大请求大小(与 Kafka 的 message.max.bytes 配置相匹配)
max.request.size=1073741824

7. 在本机新建挂载目录

8. 通过docker-compose 启动

docker-compose up -d

9. 查看网络情况

docker network inspect kafka_network

10. 检查容器是否正常启动

docker ps

11. 检查日志是否启动成功

docker logs -n 10 kafka1

docker logs -n 10 kafka2

docker logs -n 10 kafka3

12. 检查 Kafka 状态

docker exec -it kafka1 bash

./kafka-topics.sh --list --bootstrap-server 192.168.160.2:9092

13. 检查 Kafka Broker 节点的连接性

你可以通过以下命令检查 Kafka 各个节点之间的连接情况:

./kafka-broker-api-versions.sh --bootstrap-server 192.168.160.2:9092

14. 容器外部链接kafka集群

通过端口映射的方式访问到容器内的信息。

链接kafka集群:

192.168.74.125:19092,192.168.74.125:19093,192.168.74.125:19094。

192.168.74.125为我的主机ip。

下面是telnet 192.168.74.125 19092的效果。

15. 停止所有容器

docker-compose down -v

相关推荐
忘忧人生2 分钟前
docker 部署 java 项目详解
java·docker·容器
ks胤墨4 小时前
Docker快速部署高效照片管理系统LibrePhotos搭建私有云相册
运维·docker·容器
忘忧人生5 小时前
docker 安装 redis 详解
redis·docker·容器
cccl.11 小时前
JAVA(SpringBoot)集成Kafka实现消息发送和接收。
spring boot·后端·kafka
周杰伦_Jay18 小时前
详细介绍:持续集成与持续部署(CI/CD)技术细节(关键实践、CI/CD管道、优势与挑战)
程序人生·ci/cd·docker·微服务·云原生·容器·人机交互
大秦王多鱼18 小时前
Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)
分布式·kafka·apache
骑台风走21 小时前
ubunut22.04安装docker(基于阿里云 Docker 镜像源安装 Docker)
阿里云·docker·容器
仇辉攻防1 天前
【云安全】云原生-Docker(五)容器逃逸之漏洞利用
安全·web安全·网络安全·docker·云原生·容器·安全性测试
SomeBottle1 天前
【小记】在 Google Colab 等平台上运行 GPU 容器
linux·python·docker·学习笔记·容器化·斩虫