文章目录
- 前言
-
- [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