保姆级教程Docker部署KRaft模式的Kafka官方镜像

目录

一、安装Docker及可视化工具

二、单节点部署

1、创建挂载目录

2、运行Kafka容器

3、Compose运行Kafka容器

4、查看Kafka运行状态

三、集群部署

四、部署可视化工具

1、创建挂载目录

2、运行Kafka-ui容器

3、Compose运行Kafka-ui容器

4、查看Kafka-ui运行状态


在Kafka2.8版本之前,Kafka是强依赖于Zookeeper中间件的,这本身就很不合理,中间件依赖另一个中间件,搭建起来实在麻烦。所幸Kafka2.8之后推出了KRaft模式,即抛弃Zookeeper由Kafka节点自己做Controller来选举Leader。本篇文章内容就是介绍如何在Docker中搭建Kafka KRaft环境。

一、安装Docker及可视化工具

Docker及可视化工具的安装可参考:Ubuntu上安装 Docker及可视化管理工具

二、单节点部署

在进行单节点部署并以KRaft模式运行时,该节点通常是混合节点的类型

1、创建挂载目录

# 创建宿主机kafka挂载目录
sudo mkdir -p /data/docker/kafka

2、运行Kafka容器

# 拉取镜像
sudo docker pull apache/kafka:3.9.0# 运行容器
sudo docker run --privileged=true \
--net=bridge \
-d --name=kafka \
-v /data/docker/kafka/data:/var/lib/kafka/data \
-v /data/docker/kafka/config:/mnt/shared/config \
-v /data/docker/kafka/secrets:/etc/kafka/secrets \
-p 9092:9092 -p 9093:9093 \
-e LANG=C.UTF-8 \
-e KAFKA_NODE_ID=1 \
-e CLUSTER_ID=kafka-cluster \
-e KAFKA_PROCESS_ROLES=broker,controller \
-e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT \
-e KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER \
-e KAFKA_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.3.9:9092 \
-e KAFKA_CONTROLLER_QUORUM_VOTERS=1@localhost:9093 \
apache/kafka:3.9.0

参数解析如下:

参数参数说明
docker run运行 Docker 容器
-d容器将在后台运行,而不是占用当前的终端会话
--privileged=trueDocker会赋予容器几乎与宿主机相同的权限
--net=bridge网络模式配置,默认是bridge,bridge表示使用容器内部配置网络
--name kafka给容器命名为 kafka,以便于管理和引用该容器
-p 9092:9092 -p 9093:9093映射 kafka 的客户端通信端口和控制器端口
-e KAFKA_NODE_ID=1节点ID,用于标识每个集群中的节点,需要是不小于1的整数,同一个集群中的节点ID不可重复
-e CLUSTER_ID=kafka-cluster集群ID,可以自定义任何字符串作为集群ID,同一个集群中所有节点的集群ID必须配置为一样
-e KAFKA_PROCESS_ROLES=broker,controller节点类型,broker,controller表示该节点是混合节点,通常单机部署时需要配置为混合节点

-e KAFKA_INTER_BROKER_LISTENER_NAME=

PLAINTEXT

Kafka的Broker地址前缀名称,固定为PLAINTEXT即可

-e KAFKA_CONTROLLER_LISTENER_NAMES=

CONTROLLER

Kafka的Controller地址前缀名称,固定为CONTROLLER即可

-e KAFKA_LISTENERS=

PLAINTEXT://:9092,CONTROLLER://:9093

表示Kafka要监听哪些端口,PLAINTEXT://:9092,CONTROLLER://:9093表示本节点作为混合节点,监听本机所有可用网卡的9092和9093端口,其中9092作为客户端通信端口,9093作为控制器端口

-e KAFKA_ADVERTISED_LISTENERS=

PLAINTEXT://192.168.3.9:9092

配置Kafka的外网地址,需要是PLAINTEXT://外网地址:端口的形式,当客户端连接Kafka服务端时,Kafka会将这个外网地址广播给客户端,然后客户端再通过这个外网地址连接,除此之外集群之间交换数据时也是通过这个配置项得到集群中每个节点的地址的,这样集群中节点才能进行交互。需要修改为对应的Kafka的外网地址。

-e KAFKA_CONTROLLER_QUORUM_VOTERS=

1@localhost:9093

投票节点列表,通常配置为集群中所有的Controller节点,格式为节点id@节点外网地址:节点Controller端口,多个节点使用逗号,隔开,由于是混合节点,因此配置自己就行了
-v /data/docker/kafka/data:/var/lib/kafka/data持久化数据文件夹,如果运行出现问题可以清空该数据卷文件重启再试
-v /data/docker/kafka/config:/mnt/shared/config持久化配置文件目录
-v /data/docker/kafka/secrets:/etc/kafka/secrets持久化秘钥相关文件夹

容器运行参数详解参考:Docker容器运行常用参数详解-CSDN博客 

3、Compose运行Kafka容器

创建docker-compose.yml文件

sudo touch /data/docker/kafka/docker-compose.yml

文件内容如下:

version: '3'services:kafka:image: apache/kafka:3.9.0container_name: kafkaports:- "9092:9092"- "9093:9093"environment:- LANG=C.UTF-8- KAFKA_NODE_ID=1- CLUSTER_ID=kafka-cluster- KAFKA_PROCESS_ROLES=broker,controller- KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT- KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER- KAFKA_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.3.9:9092- KAFKA_CONTROLLER_QUORUM_VOTERS=1@localhost:9093volumes:- /data/docker/kafka/data:/var/lib/kafka/data- /data/docker/kafka/config:/mnt/shared/config- /data/docker/kafka/secrets:/etc/kafka/secretsprivileged: truenetwork_mode: "bridge"

运行容器

#-f:调用文件,-d:开启守护进程
sudo docker compose -f /data/docker/kafka/docker-compose.yml up -d

4、查看Kafka运行状态

三、集群部署

采用Broker + Controller集群,这是推荐的生产环境的集群部署方式,集群中不存在混合节点,每个节点要么是Broker类型,要么是Controller类型。

通过下列命令在服务器上部署:

# 定义域名
# 这是fish shell的变量定义语法
# 使用bash请替换为:kafka_host="192.168.3.9"
set kafka_host "192.168.3.9"# 节点1-Controller
sudo docker run -id --privileged=true \--net=bridge --name=kafka-1 \-p 10001:9093 \-v /data/docker/kafka-1/config:/mnt/shared/config \-v /data/docker/kafka-1/data:/var/lib/kafka/data \-v /data/docker/kafka-1/secrets:/etc/kafka/secrets \-e LANG=C.UTF-8 \-e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT \-e KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER \-e CLUSTER_ID=kafka-cluster \-e KAFKA_NODE_ID=1 \-e KAFKA_PROCESS_ROLES=controller \-e KAFKA_CONTROLLER_QUORUM_VOTERS="1@$kafka_host:10001" \-e KAFKA_LISTENERS="CONTROLLER://:9093" \apache/kafka:3.9.0# 节点2-Broker
sudo docker run -id --privileged=true \--net=bridge --name=kafka-2 \-p 9002:9092 \-v /data/docker/kafka-2/config:/mnt/shared/config \-v /data/docker/kafka-2/data:/var/lib/kafka/data \-v /data/docker/kafka-2/secrets:/etc/kafka/secrets \-e LANG=C.UTF-8 \-e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT \-e KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER \-e CLUSTER_ID=kafka-cluster \-e KAFKA_NODE_ID=2 \-e KAFKA_PROCESS_ROLES=broker \-e KAFKA_CONTROLLER_QUORUM_VOTERS="1@$kafka_host:10001" \-e KAFKA_LISTENERS="PLAINTEXT://:9092" \-e KAFKA_ADVERTISED_LISTENERS="PLAINTEXT://$kafka_host:9002" \apache/kafka:3.9.0# 节点3-Broker
sudo docker run -id --privileged=true \--net=bridge --name=kafka-3 \-p 9003:9092 \-v /data/docker/kafka-3/config:/mnt/shared/config \-v /data/docker/kafka-3/data:/var/lib/kafka/data \-v /data/docker/kafka-3/secrets:/etc/kafka/secrets \-e LANG=C.UTF-8 \-e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT \-e KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER \-e CLUSTER_ID=kafka-cluster \-e KAFKA_NODE_ID=3 \-e KAFKA_PROCESS_ROLES=broker \-e KAFKA_CONTROLLER_QUORUM_VOTERS="1@$kafka_host:10001" \-e KAFKA_LISTENERS="PLAINTEXT://:9092" \-e KAFKA_ADVERTISED_LISTENERS="PLAINTEXT://$kafka_host:9003" \apache/kafka:3.9.0

这样,我们就部署了一个由1个Controller节点和2个Broker节点构成的集群,需要注意的是:

  • Broker节点无需暴露9093端口,Controller节点无需暴露9092端口
  • Broker节点需指定KAFKA_PROCESS_ROLES为broker,同样的Controller需要指定为controller
  • KAFKA_CONTROLLER_QUORUM_VOTERS配置只需要写集群中所有的Controller节点的地址端口列表
  • 对于KAFKA_LISTENERS配置项:Broker节点需要配置为PLAINTEXT://:9092,表示本节点作为Broker节点;Controller节点需要配置为CONTROLLER://:9093,表示本节点作为Controller节点
  • 对于KAFKA_ADVERTISED_LISTENERS配置项:Controller节点不能指定该配置;Broker节点需要指定为自己的外网地址和端口

四、部署可视化工具

在早期使用Kafka时,通常会选择Kafka Tool或Kafka Eagle进行管理。Kafka Tool是一款桌面应用程序,而Kafka Eagle则基于浏览器运行。尽管这两款工具在用户体验上表现平平,但它们基本能满足日常需求。

然而,自Kafka 3.3.1版本起,Kafka正式弃用了Zookeeper,转而采用自有的仲裁机制,即kraft模式。遗憾的是,上述两款工具似乎未能及时跟进这一更新,仍然要求用户输入Zookeeper地址才能连接,导致它们在新版本Kafka中无法正常使用。为了解决这一问题,我发现了一款轻量且易于使用的替代工具——kafka-ui,它能够更好地适配新版Kafka。

1、创建挂载目录

# 创建宿主机kafka-ui挂载目录
sudo mkdir -p /data/docker/kafka-ui/config# 创建挂载的配置文件
sudo touch /data/docker/kafka-ui/config/dynamic_config.yaml

2、运行Kafka-ui容器

# 拉取镜像
sudo docker pull provectuslabs/kafka-ui:v0.7.2# 运行容器
sudo docker run --privileged=true \
--net=bridge \
-d --name=kafka-ui \
-p 18080:8080 \
-v /data/docker/kafka-ui/config/dynamic_config.yaml:/etc/kafkaui/dynamic_config.yaml
-e KAFKA_CLUSTERS_0_NAME=kafka-cluster \
-e KAFKA_CLUSTERS_0_BOOTSTRAP_SERVERS=192.168.3.9:9092 \
-e SERVER_SERVLET_CONTEXT_PATH=/ \
-e AUTH_TYPE=LOGIN_FORM \
-e SPRING_SECURITY_USER_NAME=admin \
-e SPRING_SECURITY_USER_PASSWORD=admin \
-e TZ=Asia/Shanghai \
-e LANG=C.UTF-8 \
provectuslabs/kafka-ui:v0.7.2

参数解析如下:

参数参数说明
docker run运行 Docker 容器
-d容器将在后台运行,而不是占用当前的终端会话
--privileged=trueDocker会赋予容器几乎与宿主机相同的权限
--net=bridge网络模式配置,默认是bridge,bridge表示使用容器内部配置网络
--name kafka-ui给容器命名为 kafka-ui,以便于管理和引用该容器
-p 18080:8080映射 kafka-ui 的web端口

-v /data/docker/kafka-ui/config/dynamic_config.yaml:

/etc/kafkaui/dynamic_config.yaml

挂载配置文件,确保config/dynamic_config.yaml文件存在
-e SERVER_SERVLET_CONTEXT_PATH=/默认kafka-ui是免登录的,为了防止所有人都可以登录产生误操作问题,在docker部署的时候可以添加如下四个环境变量配置用户的登录密码。
-e AUTH_TYPE=LOGIN_FORM
-e SPRING_SECURITY_USER_NAME=admin
-e SPRING_SECURITY_USER_PASSWORD=admin
-e KAFKA_CLUSTERS_0_NAME=kafka-cluster自定义集群名称

-e KAFKA_CLUSTERS_0_BOOTSTRAP_SERVERS=

192.168.3.9:9092

集群地址,如有多个地址逗号分隔;需要修改为对应的Kafka的外网地址。

3、Compose运行Kafka-ui容器

创建docker-compose.yml文件

sudo touch /data/docker/kafka-ui/docker-compose.yml

文件内容如下:

version: '3'services:kafka:image: provectuslabs/kafka-ui:v0.7.2container_name: kafka-uiports:- "18080:8080"environment:- TZ=Asia/Shanghai- LANG=C.UTF-8- DYNAMIC_CONFIG_ENABLED=true- KAFKA_CLUSTERS_0_NAME=kafka-cluster- KAFKA_CLUSTERS_0_BOOTSTRAP_SERVERS=192.168.3.9:9092- SERVER_SERVLET_CONTEXT_PATH=/- AUTH_TYPE=LOGIN_FORM- SPRING_SECURITY_USER_NAME=admin- SPRING_SECURITY_USER_PASSWORD=adminvolumes:- /data/docker/kafka-ui/config/dynamic_config.yaml:/etc/kafkaui/dynamic_config.yamlprivileged: truenetwork_mode: "bridge"

运行容器

#-f:调用文件,-d:开启守护进程
sudo docker compose -f /data/docker/kafka-ui/docker-compose.yml up -d

4、查看Kafka-ui运行状态

http://192.168.3.9:18080/auth

账号和密码 都是admin

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

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

相关文章

[创业之路-286]:《产品开发管理-方法.流程.工具 》-1- IPD两个跨职能团队的组织

IPD(集成产品开发)中的两个重要跨职能组织是IPMT(集成产品管理团队)和PDT(产品开发团队)。 在IPD(集成产品开发)体系中,IRB(投资评审委员会)、IPM…

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之修改密码和个人资料

🧸安清h:个人主页 🎥个人专栏:【Spring篇】【计算机网络】【Mybatis篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 目录 🎃1.修改密码 -持久…

02.06 网络编程_概述

思维导图 总图:

初阶数据结构:树---堆

目录 一、树的概念 二、树的构成 (一)、树的基本组成成分 (二)、树的实现方法 三、树的特殊结构------二叉树 (一)、二叉树的概念 (二)、二叉树的性质 (三&#…

【LeetCode】day15 142.环形链表II

142. 环形链表 II - 力扣(LeetCode) 题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则…

2025.2.6

一、C思维导图: 二、C: 三、注释代码 1> 配置文件:.pro文件 QT core gui # 引入的类库,core表示核心库 gui图形化界面库greaterThan(QT_MAJOR_VERSION, 4): QT widgets # 超过版本4的qt,会自动加widgets…

CSS(三)less一篇搞定

目录 一、less 1.1什么是less 1.2Less编译 1.3变量 1.4混合 1.5嵌套 1.6运算 1.7函数 1.8作用域 1.9注释与导入 一、less 1.1什么是less 我们写了这么久的CSS,里面有很多重复代码,包括通配颜色值、容器大小。那我们能否通过js声明变量来解决这些问题&…

643. 子数组最大平均数 I

目录 一、题目二、思路2.1 解题思路2.2 代码尝试2.3 疑难问题 三、解法四、收获4.1 心得4.2 举一反三 一、题目 二、思路 2.1 解题思路 和之前一样,用一个sum来存储统计情况,窗口滑动边统计,用两个for循环,一个初始化&#xff0…

go数据结构学习笔记

本博文较为完整的实现了go的链表、栈,队列,树,排序,链表包括顺序链表,双向链表,循环链表,队列是循环队列,排序包含冒牌、选择 1.链表 1.1 顺序链表 type LNode struct {data intn…

机器学习--python基础库之Matplotlib (1) 超级详细!!!

机器学习--python基础库Matplotlib 机器学习--python基础库Matplotlib0 介绍1 实现基础绘图-某城市温度变化图1.1绘制基本图像1.2实现一些其他功能 2 再一个坐标系中绘制多个图像3 多个坐标系显示-plt.subplots(面向对象的画图方法)4 折线图的应用场景 机器学习–python基础库M…

Java 23新特性

文章目录 Java 23新特性一、引言二、Markdown文档注释(JEP 467)示例 三、ZGC:默认的分代模式(JEP 474)1. 为什么要引入分代模式2. 使用分代模式的优势3. 如何启用分代模式 四、隐式声明的类和实例主方法(JE…

【redis】数据类型之string

字符串类型是Redis最基础的数据结构。首先key都是字符串类型,而且其他几种数据结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习打下基础。 字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串&#xf…

前部分知识复习05

一、多级渐远贴图MipMap 选择贴图,可以勾选贴图的多级渐远效果 [IntRange]_MipMap("MipMap",Range(0,12))0 //多级渐远贴图的LOD调节滑杆 _MipMapTexture("MipMapTexture",2D)"white"{} //定义多级渐远贴图 多级渐远贴图的采样…

[高等数学]曲率

一、知识点 (一)弧微分 设函数 f ( x ) f(x) f(x) 在区间 ( a , b ) (a,b) (a,b) 内具有连续导数。 在曲线 y f ( x ) yf(x) yf(x) 上取固定点 M 0 ( x 0 , y 0 ) M_0(x_0,y_0) M0​(x0​,y0​) 作为度量弧长的基点,并规定依 x x x 增…

openGauss 3.0 数据库在线实训课程2:学习客户端工具gsql的使用

openGauss数据库状态查看 前提 我正在参加21天养成好习惯| 第二届openGauss每日一练活动 课程详见:openGauss 3.0.0数据库在线实训课程 学习目标 学习openGauss数据库客户端工具gsql的使用。 课程作业 gsql是openGauss提供在命令行下运行的数据库连接工具&am…

模拟实现string类

目录 一.构造与析构函数 二.基础小功能的实现 1.clear 2.c_str 3外部对私有的查看 三.实现string的迭代器 四.string的增删查改 1.push_back尾插 1.1reserve扩容 1.2尾插 3.运算符重载 4.insert在任意位置插入 5.erase删除 5.1npos的处理 5.2函数的实现 6.find查…

机器学习之数学基础:线性代数、微积分、概率论 | PyTorch 深度学习实战

前一篇文章,使用线性回归模型逼近目标模型 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于 强化学习必修课:引领人工智能新时代【梗直哥瞿炜】 线性代数、微积分、概率论 …

记录一下 在Mac下用pyinstallter 打包 Django项目

安装: pip install pyinstaller 在urls.py from SheepMasterOneToOne import settings from django.conf.urls.static import staticurlpatterns [path("admin/", admin.site.urls),path(generate_report/export/, ReportAdmin(models.Report, admin.site).generat…

UE求职Demo开发日志#23 线性任务系统数据层实现

1 按上期设计创建数据结构&#xff08;做了一些修改&#xff09; USTRUCT(BlueprintType) struct ARPG_CPLUS_API FQuestNode {GENERATED_USTRUCT_BODY()// 记录前置节点IDUPROPERTY(EditAnywhere, BlueprintReadWrite,Category"QuestNode")TArray<int> Prede…