docker-compose方式部署kafka集群

Kafka 4.0 引入了 KRaft 模式(Kafka Raft Metadata Mode),它使 Kafka 集群不再依赖 ZooKeeper 进行元数据管理。KRaft 模式简化了 Kafka 部署和管理,不需要额外配置 ZooKeeper 服务,使得集群的配置和运维更加高效。

本文将介绍如何配置一个基于 KRaft 模式的 Kafka 集群,步骤简单明了。我们将从零开始,介绍如何配置 Kafka 集群并进行测试,包括遇到的权限问题以及如何通过自定义工具简化测试命令。

一、KRaft 模式简介

KRaft(Kafka Raft Metadata Mode)是 Kafka 在 4.0 版本引入的一个新特性,旨在替代传统的依赖 ZooKeeper 的架构。在 KRaft 模式下,Kafka 使用内建的 Raft 协议来管理元数据和集群协调,而不需要外部的 ZooKeeper 服务。

主要特点:

  • 不再依赖 ZooKeeper。

  • 使用 Kafka 自带的 Raft 协议处理元数据和控制器选举。

  • 简化了集群配置,降低了维护成本。

二、集群配置

1. 配置主机

在本例中,我们使用了 3 台主机,每台主机上启动一个 Kafka 容器,形成一个简单的 KRaft 模式集群。

  • 主机 1 (IP: 172.16.0.106):配置为 Kafka 节点 0。

  • 主机 2 (IP: 172.16.0.107):配置为 Kafka 节点 1。

  • 主机 3 (IP: 172.16.0.108):配置为 Kafka 节点 2。

2. Kafka 配置

docker-compose.yml 中,我们配置了 3 个 Kafka 节点的容器,采用 KRaft 模式,并设置了必要的环境变量来启动集群。
这是第一个节点:0

services:kafka-0:image: bitnami/kafka:4.0.0container_name: kafka-0ports:- "9092:9092"- "9093:9093"environment:- KAFKA_CFG_NODE_ID=0- KAFKA_CFG_PROCESS_ROLES=controller,broker- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@172.16.0.106:9093,1@172.16.0.107:9093,2@172.16.0.108:9093- KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv- KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://172.16.0.106:9092- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2volumes:- /data/kafka/kafka-0:/bitnami/kafka

 这是第一个节点::1

services:kafka-1:image: bitnami/kafka:4.0.0container_name: kafka-1ports:- "9092:9092"- "9093:9093"environment:- KAFKA_CFG_NODE_ID=1- KAFKA_CFG_PROCESS_ROLES=controller,broker- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@172.16.0.106:9093,1@172.16.0.107:9093,2@172.16.0.108:9093- KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv- KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://172.16.0.107:9092- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2volumes:- /data/kafka/kafka-0:/bitnami/kafka

 这是第三个节点:2

services:kafka-2:image: bitnami/kafka:4.0.0container_name: kafka-2ports:- "9092:9092"- "9093:9093"environment:- KAFKA_CFG_NODE_ID=0- KAFKA_CFG_PROCESS_ROLES=controller,broker- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@172.16.0.106:9093,1@172.16.0.107:9093,2@172.16.0.108:9093- KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv- KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://172.16.0.108:9092- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2volumes:- /data/kafka/kafka-0:/bitnami/kafka

 

每个 Kafka 节点的配置都类似,只是 KAFKA_CFG_NODE_IDKAFKA_CFG_ADVERTISED_LISTENERS 不同。

3. 数据持久化

通过 Docker 的 volumes 配置,我们将每个容器的数据目录挂载到宿主机上,从而实现数据持久化。如下所示:

volumes:- /data/kafka/kafka-0:/bitnami/kafka

这意味着 Kafka 容器中的数据会存储在宿主机的 /data/kafka/kafka-0 目录中,即使容器停止或删除,数据也不会丢失。

三、遇到的权限问题及解决方法

在配置过程中,我遇到了一个权限问题:容器内的脚本无法删除临时文件或执行一些操作。

解决方法:

  1. 容器内操作权限问题:由于容器内没有 sudo 权限,导致无法执行一些文件删除操作。解决方案是在宿主机上执行相关操作,使用 docker exec 执行命令时确保使用正确的权限。

  2. 文件系统权限:挂载到容器的宿主机目录 /data/kafka/kafka-0 必须确保有正确的读写权限,否则 Kafka 容器无法正常写入数据。确保宿主机上的目录拥有正确的权限,例如使用 chmod 命令修改目录权限。

四、集群测试

测试 Kafka 集群是否成功部署,我们使用了以下步骤:

  1. 启动 Kafka 容器:使用 docker-compose up 分别启动集群。

  2. 这个问题!Kafka 在 Docker 容器中运行时,通常会以 1001 这个用户 ID(UID)来启动,而宿主机上的目录默认可能是 root 用户所有。这就导致了 Kafka 在容器内无法对挂载的目录进行写入或修改,因为容器用户与宿主机目录的所有者不同。

    解决方法:

    你可以通过更改宿主机目录的所有者为容器内的 Kafka 用户(即 UID 1001),这样容器就能够正确地访问和修改该目录。

    执行以下命令:

sudo chown -R 1001:1001 ./kafka_data

这将会把宿主机上的 ./kafka_data 目录的所有者更改为 UID 1001,即容器内的 Kafka 用户。这样,容器就可以在该目录下创建所需的文件了。

为什么要这么做?

  • Kafka 容器默认使用 1001 用户运行,而宿主机的目录默认是 root 用户拥有。

  • Docker 容器内的进程没有 root 权限,因此无法修改宿主机上的目录(除非你将宿主机目录的权限改为所有人都能写入)。

  • 使用 chown -R 1001:1001 将目录所有者改为容器内 Kafka 用户,使容器能够访问和操作该目录。

 

  1. 检查 Kafka 主题:使用

    kafka-topics.sh --list --bootstrap-server localhost:9092

    命令查看集群中的所有主题。

  2. 创建测试主题:通过

    kafka-topics.sh --create --topic test --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1

    创建一个名为 test 的测试主题。

docker exec -it kafka-0 bash
kafka-topics.sh --create --topic test --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
kafka-topics.sh --list --bootstrap-server localhost:9092

五、自定义工具简化命令

为了方便测试,我编写了一个自定义工具脚本 kafka-tools.sh,通过简单的命令执行 Kafka 常用操作:

1.宿主机(容器外部)执行:

vim kafka-tools.sh

#!/bin/bash# Kafka操作函数# 列出所有主题
kt() {kafka-topics.sh --list --bootstrap-server localhost:9092
}# 生产消息到指定主题
kp() {if [ -z "$1" ]; thenecho "请指定主题名称!"return 1fikafka-console-producer.sh --broker-list localhost:9092 --topic "$1"
}# 消费指定主题的消息
kc() {if [ -z "$1" ]; thenecho "请指定主题名称!"return 1fikafka-console-consumer.sh --bootstrap-server localhost:9092 --topic "$1" --from-beginning
}# 删除指定主题
kd() {if [ -z "$1" ]; thenecho "请指定主题名称!"return 1fikafka-topics.sh --bootstrap-server localhost:9092 --topic "$1" --delete
}# 查看指定主题描述
kdesc() {if [ -z "$1" ]; thenecho "请指定主题名称!"return 1fikafka-topics.sh --bootstrap-server localhost:9092 --describe --topic "$1"
}# 创建一个新主题
create_topic() {if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ]; thenecho "请提供主题名称、分区数和副本数!"return 1fikafka-topics.sh --create --topic "$1" --bootstrap-server localhost:9092 --partitions "$2" --replication-factor "$3"
}# 提示
echo "✅ Kafka 自定义工具函数已经加载成功(使用方式如下):"
echo "  kt --list            ----查看所有主题"
echo "  kp my-topic          ----使用主题生产"
echo "  kc my-topic          ----使用主题消费"
echo "  kd my-topic          ----删除主题"
echo "  kdesc my-topic       ----主题描述"
echo "  create_topic my-topic 3 1 ----创建主题 (例如:3个分区,1个副本)"

 

 2.将.sh文件移动到容器内部:

docker cp kafka-tools.sh kafka-0:/tmp/kafka-tools.sh
docker cp kafka-tools.sh kafka-1:/tmp/kafka-tools.sh
docker cp kafka-tools.sh kafka-2:/tmp/kafka-tools.sh

docker cp kafka-tools.sh kafka-0:/tmp/kafka-tools.sh
docker exec -it kafka-0 bash
source /tmp/kafka-tools.sh

 

3.进入容器 
docker exec -it kafka-0 bash
4.执行:
 source /tmp/kafka-tools.sh

 提示:则执行成功
生命周期是每次容器内执行后(容器不死,方便测试,复杂参数的命令还是需要自己去写或者完善该脚本)

使用方法:

  • kt --list:查看所有 Kafka 主题。

  • kp <topic>:生产消息到指定主题。

  • kc <topic>:消费指定主题的消息。

  • kd <topic>:删除指定的主题。

  • kdesc <topic>:查看指定主题的描述。

通过这些简化命令,我可以在容器内快速执行 Kafka 操作,而不需要记住每个命令的详细参数。

加载成功后,你可以直接在容器内使用简化命令,极大地方便了测试和管理 Kafka 集群。

六、总结

本文介绍了如何配置 KRaft 模式的 Kafka 4.0 集群,并解决了容器内的权限问题。通过自定义工具脚本,我们将常用的 Kafka 操作简化为一系列简单的命令,使得集群管理更加高效。

KRaft 模式是 Kafka 4.0 中的重要特性,它的引入让 Kafka 不再依赖 ZooKeeper,简化了集群的部署和管理。希望本文能帮助你顺利部署并管理 KRaft 模式的 Kafka 集群。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/80287.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/80287.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/80287.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Admyral - 可扩展的GRC工程自动化平台

文章目录 一、关于 Admyral相关链接资源关键特性 二、安装系统要求 三、快速开始1、启动服务 四、核心功能1、自动化即代码2、AI增强工作流3、双向同步编辑器4、工作流监控5、企业级基础设施 五、示例应用六、其他信息许可证遥测说明 一、关于 Admyral Admyral 是一个基于 Pyt…

DDR在PCB布局布线时的注意事项及设计要点

一、布局注意事项 控制器与DDR颗粒的布局 靠近原则&#xff1a;控制器与DDR颗粒应尽量靠近&#xff0c;缩短时钟&#xff08;CLK&#xff09;、地址/控制线&#xff08;CA&#xff09;、数据线&#xff08;DQ/DQS&#xff09;的走线长度&#xff0c;减少信号延迟差异。 分组隔…

计算机网络-LDP工作过程详解

前面我们已经学习了LDP的基础概念&#xff0c;了解了LDP会话的建立、LDP的标签控制等知识&#xff0c;今天来整体过一遍LDP的一个工作过程&#xff0c;后面我们再通过实验深入学习。 一、LDP标签分发 标签分发需要基于基础的路由协议建立LDP会话&#xff0c;激活MPLS和LDP。以…

解构与重构:自动化测试框架的进阶认知之旅

目录 一、自动化测试的介绍 &#xff08;一&#xff09;自动化测试的起源与发展 &#xff08;二&#xff09;自动化测试的定义与目标 &#xff08;三&#xff09;自动化测试的适用场景 二、什么是自动化测试框架 &#xff08;一&#xff09;自动化测试框架的定义 &#x…

跑不出的循环 | LoveySelf 系列定位

最近开始陷入一轮一轮的循环状态&#xff0c;无奈&#xff0c;只能自我整理一下。23年暑假&#xff0c;在计算机系折腾了一年后&#xff0c;重新打开博客&#xff0c;回想在数学系摸索博客写作的日子&#xff0c;思绪涌上心头&#xff0c;我们决定拾起这份力量。当时觉得 hexo …

Redis最新入门教程

文章目录 Redis最新入门教程1.安装Redis2.连接Redis3.Redis环境变量配置4.入门Redis4.1 Redis的数据结构4.2 Redis的Key4.3 Redis-String4.4 Redis-Hash4.5 Redis-List4.6 Redis-Set4.7 Redis-Zset 5.在Java中使用Redis6.缓存雪崩、击穿、穿透6.1 缓存雪崩6.2 缓冲击穿6.3 缓冲…

一文读懂Python之requests模块(36)

一、requests模块简介 requests模块是python中原生的一款基于网络请求的模块&#xff0c;功能强大&#xff0c;简单便捷且高效 &#xff0c;该模块可以模拟浏览器发送请求&#xff0c;主要包括指定url、发起请求、获取响应数据和持久化存储&#xff0c;包括 GET、POST、PUT、…

WPF之布局流程

文章目录 1. 概述2. 布局元素的边界框3. 布局系统原理3.1 布局流程时序图 4. 测量阶段(Measure Phase)4.1 测量过程4.2 MeasureOverride方法 5. 排列阶段(Arrange Phase)5.1 排列过程5.2 ArrangeOverride方法 6. 渲染阶段(Render Phase)7. 布局事件7.1 主要布局事件7.2 布局事件…

uniapp|获取当前用户定位、与系统设定位置计算相隔米数、实现打卡签到(可自定义设定位置、位置有效范围米数)

基于UniApp阐述移动应用开发中定位功能的实现全流程,涵盖实时定位获取、动态距离计算与自定义位置、有效范围设定等功能。文章提供完整的代码示例与适配方案,适用于社交签到、课堂教室打卡等场景。 目录 引言定位功能在移动应用中的价值(社交、导航、O2O等场景)UniApp跨平台…

Yii2.0 模型规则(rules)详解

一、基本语法结构 public function rules() {return [// 规则1[[attribute1, attribute2], validator, options > value, ...],// 规则2[attribute, validator, options > value, ...],// 规则3...]; }二、规则类型分类 1、核心验证器&#xff08;内置验证器&#xff0…

数据结构(三)——栈和队列

一、栈和队列的定义和特点 栈&#xff1a;受约束的线性表&#xff0c;只允许栈顶元素入栈和出栈 对栈来说&#xff0c;表尾端称为栈顶&#xff0c;表头端称为栈底&#xff0c;不含元素的空表称为空栈 先进后出&#xff0c;后进先出 队列&#xff1a;受约束的线性表&#xff0…

SQL Server 存储过程开发三层结构规范

以下是《SQL Server 存储过程开发三层结构规范》的正式文档结构&#xff0c;适用于企业级数据库应用开发场景&#xff0c;有助于团队协作、代码审查与自动化运维&#xff1a; &#x1f4d8; SQL Server 存储过程开发三层结构规范 一、架构设计总览 三层结构简介 层级命名约定…

接上篇,解决FramePack启动报错:“httpx.ReadError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。“的问题

#工作记录 FramePack部署&#xff08;从PyCharm解释器创建和使用开始&#xff09;保姆级教程-CSDN博客 上篇我们记录到FramePack从克隆到启动调试的保姆级教程&#xff0c;关于启动时会报以下错误的问题&#xff0c;已作出解决&#xff1a; 报错摘录&#xff1a; (.venv) PS F…

ping_test_parallel.sh 并行网络扫描脚本

并行网络扫描脚本分析&#xff1a;提高网络探测效率 引言脚本概述核心代码分析颜色定义与初始化并行处理机制并行执行与进程控制结果处理与统计 技术亮点性能分析结论附录&#xff1a;完整脚本 引言 在网络管理和运维过程中&#xff0c;快速检测网段内主机的在线状态是一项常见…

leetcode 3342. 到达最后一个房间的最少时间 II 中等

有一个地窖&#xff0c;地窖中有 n x m 个房间&#xff0c;它们呈网格状排布。 给你一个大小为 n x m 的二维数组 moveTime &#xff0c;其中 moveTime[i][j] 表示在这个时刻 以后 你才可以 开始 往这个房间 移动 。你在时刻 t 0 时从房间 (0, 0) 出发&#xff0c;每次可以移…

关于vue-office在vue3工程中的引用报错问题

在vue3项目工程中&#xff0c;根据vue-office文档在vue2中的引用&#xff1a; //引入VueOfficeDocx组件 相关样式import VueOfficeDocx from vue-office/docx;import vue-office/docx/lib/index.css; 报错信息&#xff1a; [plugin:vite:import-analysis] Failed to resolve …

【macOS常用快捷键】

以下是 macOS 最常用快捷键列表&#xff0c;按使用频率由高到低分类整理&#xff0c;涵盖日常操作、效率工具及系统控制&#xff0c;助你快速提升使用效率&#xff1a; 一、基础高频操作 快捷键功能说明Command C复制选中内容Command V粘贴Command X剪切Command Z撤销上一…

mdadm 报错: buffer overflow detected

最近跑 blktest (https://github.com/osandov/blktests) 时发现 md/001 的测试失败了 单独执行&#xff0c;最后定位到是 mdadm 命令报错: buffer overflow detected 这个 bug 目前已经修复: https://git.kernel.org/pub/scm/utils/mdadm/mdadm.git/commit/?id827e1870f3205…

查看jdk是否安装并且配置成功?(Android studio安装前的准备)

WinR输入cmd打开命令提示窗口 输入命令 java -version 回车显示如下&#xff1a;

STM32智能刷卡消费系统(uC/OS-III)

一、项目概述与开发背景 本系统是一款基于STM32微控制器的智能刷卡消费终端&#xff0c;集成RFID识别、OLED显示、Flash存储、蓝牙通信等核心模块。项目采用uC/OS-III实时操作系统实现多任务并发处理&#xff0c;适用于校园一卡通、企业食堂等小额支付场景。系统支持定额扣款、…