ToB企服应用市场:ToB评测及商务社交产业平台

标题: 保姆级教程Docker摆设KRaft模式的Kafka官方镜像 [打印本页]

作者: 美丽的神话    时间: 2025-2-21 19:32
标题: 保姆级教程Docker摆设KRaft模式的Kafka官方镜像
目次
一、安装Docker及可视化工具
二、单节点摆设
1、创建挂载目次
2、命令运行容器
3、Compose运行容器
4、查看运行状态
5、验证生产消耗
三、集群摆设
四、摆设可视化工具
1、创建挂载目次
2、命令运行容器
3、Compose运行容器
4、查看运行状态
五、Zookeeper模式和KRaft模式

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

Docker及可视化工具的安装可参考:Ubuntu上安装 Docker及可视化管理工具
二、单节点摆设

在举行单节点摆设并以KRaft模式运行时,该节点通常是肴杂节点的范例
1、创建挂载目次

  1. # 创建宿主机kafka挂载目录
  2. sudo mkdir -p /data/docker/kafka-kraft
复制代码
2、命令运行容器

  1. # 拉取镜像
  2. sudo docker pull apache/kafka:3.9.0
  3. # 运行容器
  4. sudo docker run --privileged=true \
  5. --net=bridge \
  6. -d --name=kafka-kraft \
  7. -v /data/docker/kafka-kraft/data:/var/lib/kafka/data \
  8. -v /data/docker/kafka-kraft/config:/mnt/shared/config \
  9. -v /data/docker/kafka-kraft/secrets:/etc/kafka/secrets \
  10. -p 9092:9092 -p 9093:9093 \
  11. -e TZ=Asia/Shanghai \
  12. -e LANG=C.UTF-8 \
  13. -e KAFKA_NODE_ID=1 \
  14. -e CLUSTER_ID=kafka-cluster \
  15. -e KAFKA_PROCESS_ROLES=broker,controller \
  16. -e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT \
  17. -e KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER \
  18. -e KAFKA_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \
  19. -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.3.9:9092 \
  20. -e KAFKA_CONTROLLER_QUORUM_VOTERS=1@localhost:9093 \
  21. apache/kafka:3.9.0
复制代码
  注:
  1、192.168.3.9 要更换为对外暴露的外网地点
  参数解析如下:
参数参数分析
docker run运行 Docker 容器
-d容器将在后台运行,而不是占用当前的终端会话
--privileged=trueDocker会赋予容器险些与宿主机相同的权限
--net=bridge网络模式配置,默认是bridge,bridge表示利用容器内部配置网络
--name kafka-kraft给容器定名为 kafka-kraft,以便于管理和引用该容器
-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-kraft/data:
/var/lib/kafka/data
持久化数据文件夹,如果运行出现题目可以清空该数据卷文件重启再试
-v /data/docker/kafka-kraft/config:
/mnt/shared/config
持久化配置文件目次
-v /data/docker/kafka-kraft/secrets:
/etc/kafka/secrets
持久化秘钥相关文件夹
容器运行参数详解参考:Docker容器运行常用参数详解-CSDN博客 
3、Compose运行容器

创建docker-compose.yml文件
  
  1. sudo touch /data/docker/kafka-kraft/docker-compose.yml
复制代码
文件内容如下:
  
  1. version: '3'
  2. services:
  3.   kafka:
  4.     image: apache/kafka:3.9.0
  5.     container_name: kafka-kraft
  6.     ports:
  7.       - "9092:9092"
  8.       - "9093:9093"
  9.     environment:
  10.       - TZ=Asia/Shanghai
  11.       - LANG=C.UTF-8
  12.       - KAFKA_NODE_ID=1
  13.       - CLUSTER_ID=kafka-cluster
  14.       - KAFKA_PROCESS_ROLES=broker,controller
  15.       - KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT
  16.       - KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER
  17.       - KAFKA_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
  18.       - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.3.9:9092
  19.       - KAFKA_CONTROLLER_QUORUM_VOTERS=1@localhost:9093
  20.     volumes:
  21.       - /data/docker/kafka-kraft/data:/var/lib/kafka/data
  22.       - /data/docker/kafka-kraft/config:/mnt/shared/config
  23.       - /data/docker/kafka-kraft/secrets:/etc/kafka/secrets
  24.     privileged: true
  25.     network_mode: "bridge"
复制代码
运行容器
  
  1. #-f:调用文件,-d:开启守护进程
  2. sudo docker compose -f /data/docker/kafka-kraft/docker-compose.yml up -d
复制代码
4、查看运行状态


5、验证生产消耗

验证步骤如下,分别创建一个生产者和一个消耗者,查看消耗者是否能够收到生产者生产的消息
  1. # 1.进入kafka容器内
  2. sudo docker exec -it kafka-kraft /bin/bash
  3. # 2.进入kafka安装目录
  4. cd /opt/kafka/bin
  5. # 3.生产消息
  6. ./kafka-console-producer.sh --topic test01 --bootstrap-server localhost:9092
  7. # 3.消费消息
  8. ./kafka-console-consumer.sh --topic test01 --from-beginning --bootstrap-server localhost:9092 --partition 0
  9. # 查询主题列表
  10. ./kafka-topics.sh --bootstrap-server localhost:9092 --list
  11. # 查询消费组列表
  12. ./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list
复制代码
生产消息

 消耗消息

验证效果表明,kafka摆设正常,可正常生产和消耗消息,但是Kraft模式无法通过指定group(消耗组)消耗到消息,需要通过指定partition(分区)才华消耗到消息,这个题目应是Kafka的bug,后续再观察下。 
三、集群摆设

采用Broker + Controller集群,这是推荐的生产环境的集群摆设方式,集群中不存在肴杂节点,每个节点要么是Broker范例,要么是Controller范例。
通过下列命令在服务器上摆设:
  1. # 定义域名
  2. # 这是fish shell的变量定义语法
  3. # 使用bash请替换为:kafka_host="192.168.3.9"
  4. set kafka_host "192.168.3.9"
  5. # 节点1-Controller
  6. sudo docker run -id --privileged=true \
  7.     --net=bridge --name=kafka-1 \
  8.         -p 10001:9093 \
  9.         -v /data/docker/kafka-1/config:/mnt/shared/config \
  10.         -v /data/docker/kafka-1/data:/var/lib/kafka/data \
  11.         -v /data/docker/kafka-1/secrets:/etc/kafka/secrets \
  12.         -e LANG=C.UTF-8 \
  13.         -e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT \
  14.         -e KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER \
  15.         -e CLUSTER_ID=kafka-cluster \
  16.         -e KAFKA_NODE_ID=1 \
  17.         -e KAFKA_PROCESS_ROLES=controller \
  18.         -e KAFKA_CONTROLLER_QUORUM_VOTERS="1@$kafka_host:10001" \
  19.         -e KAFKA_LISTENERS="CONTROLLER://:9093" \
  20.         apache/kafka:3.9.0
  21. # 节点2-Broker
  22. sudo docker run -id --privileged=true \
  23.     --net=bridge --name=kafka-2 \
  24.         -p 9002:9092 \
  25.         -v /data/docker/kafka-2/config:/mnt/shared/config \
  26.         -v /data/docker/kafka-2/data:/var/lib/kafka/data \
  27.         -v /data/docker/kafka-2/secrets:/etc/kafka/secrets \
  28.         -e LANG=C.UTF-8 \
  29.         -e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT \
  30.         -e KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER \
  31.         -e CLUSTER_ID=kafka-cluster \
  32.         -e KAFKA_NODE_ID=2 \
  33.         -e KAFKA_PROCESS_ROLES=broker \
  34.         -e KAFKA_CONTROLLER_QUORUM_VOTERS="1@$kafka_host:10001" \
  35.         -e KAFKA_LISTENERS="PLAINTEXT://:9092" \
  36.         -e KAFKA_ADVERTISED_LISTENERS="PLAINTEXT://$kafka_host:9002" \
  37.         apache/kafka:3.9.0
  38. # 节点3-Broker
  39. sudo docker run -id --privileged=true \
  40.     --net=bridge --name=kafka-3 \
  41.         -p 9003:9092 \
  42.     -v /data/docker/kafka-3/config:/mnt/shared/config \
  43.         -v /data/docker/kafka-3/data:/var/lib/kafka/data \
  44.         -v /data/docker/kafka-3/secrets:/etc/kafka/secrets \
  45.         -e LANG=C.UTF-8 \
  46.         -e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT \
  47.         -e KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER \
  48.         -e CLUSTER_ID=kafka-cluster \
  49.         -e KAFKA_NODE_ID=3 \
  50.         -e KAFKA_PROCESS_ROLES=broker \
  51.         -e KAFKA_CONTROLLER_QUORUM_VOTERS="1@$kafka_host:10001" \
  52.         -e KAFKA_LISTENERS="PLAINTEXT://:9092" \
  53.         -e KAFKA_ADVERTISED_LISTENERS="PLAINTEXT://$kafka_host:9003" \
  54.         apache/kafka:3.9.0
复制代码
如许,我们就摆设了一个由1个Controller节点和2个Broker节点构成的集群,需要注意的是:
   
  四、摆设可视化工具

在早期利用Kafka时,通常会选择Kafka Tool或Kafka Eagle举行管理。Kafka Tool是一款桌面应用程序,而Kafka Eagle则基于欣赏器运行。只管这两款工具在用户体验上表现平平,但它们根本能满意日常需求。
然而,自Kafka 3.3.1版本起,Kafka正式弃用了Zookeeper,转而采用自有的仲裁机制,即kraft模式。遗憾的是,上述两款工具好像未能及时跟进这一更新,仍然要求用户输入Zookeeper地点才华连接,导致它们在新版本Kafka中无法正常利用。为了解决这一题目,我发现了一款轻量且易于利用的替换工具——kafka-ui,它能够更好地适配新版Kafka。
1、创建挂载目次

  1. # 创建宿主机kafka-ui挂载目录
  2. sudo mkdir -p /data/docker/kafka-ui/config
  3. # 创建挂载的配置文件
  4. sudo touch /data/docker/kafka-ui/config/dynamic_config.yaml
复制代码
2、命令运行容器

  1. # 拉取镜像
  2. sudo docker pull provectuslabs/kafka-ui:v0.7.2
  3. # 运行容器
  4. sudo docker run --privileged=true \
  5. --net=bridge \
  6. -d --name=kafka-ui \
  7. -p 18080:8080 \
  8. -v /data/docker/kafka-ui/config/dynamic_config.yaml:/etc/kafkaui/dynamic_config.yaml
  9. -e KAFKA_CLUSTERS_0_NAME=kafka-cluster \
  10. -e KAFKA_CLUSTERS_0_BOOTSTRAP_SERVERS=192.168.3.9:9092 \
  11. -e SERVER_SERVLET_CONTEXT_PATH=/ \
  12. -e AUTH_TYPE=LOGIN_FORM \
  13. -e SPRING_SECURITY_USER_NAME=admin \
  14. -e SPRING_SECURITY_USER_PASSWORD=admin \
  15. -e TZ=Asia/Shanghai \
  16. -e LANG=C.UTF-8 \
  17. 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运行容器

创建docker-compose.yml文件
  1. sudo touch /data/docker/kafka-ui/docker-compose.yml
复制代码
文件内容如下:
  1. version: '3'
  2. services:
  3.   kafka:
  4.     image: provectuslabs/kafka-ui:v0.7.2
  5.     container_name: kafka-ui
  6.     ports:
  7.       - "18080:8080"
  8.     environment:
  9.       - TZ=Asia/Shanghai
  10.       - LANG=C.UTF-8
  11.       - DYNAMIC_CONFIG_ENABLED=true
  12.       - KAFKA_CLUSTERS_0_NAME=kafka-cluster
  13.       - KAFKA_CLUSTERS_0_BOOTSTRAP_SERVERS=192.168.3.9:9092
  14.       - SERVER_SERVLET_CONTEXT_PATH=/
  15.       - AUTH_TYPE=LOGIN_FORM
  16.       - SPRING_SECURITY_USER_NAME=admin
  17.       - SPRING_SECURITY_USER_PASSWORD=admin
  18.     volumes:
  19.       - /data/docker/kafka-ui/config/dynamic_config.yaml:/etc/kafkaui/dynamic_config.yaml
  20.     privileged: true
  21.     network_mode: "bridge"
复制代码
运行容器
  1. #-f:调用文件,-d:开启守护进程
  2. sudo docker compose -f /data/docker/kafka-ui/docker-compose.yml up -d
复制代码
4、查看运行状态

http://192.168.3.9:18080/auth
账号和暗码 都是admin

五、Zookeeper模式和KRaft模式

Zookeeper 模式和 KRaft 模式各有其独特的上风和局限性,适用于不同的场景。
Zookeeper 模式
   
  KRaft 模式
   
  

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4