【Kafka】基于Docker的KRaft模式(无Zookeeper)集群安装及测试

【Kafka运维】部署基于Docker的Kraft模式Kafka集群

最近项目中想使用kafka做消息系统,但安装好像很复杂,现在把安装过程记录一下。
主流的安装方式是在服务器上直接安装,而我希望的是使用Docker。
主流的Kafka使用Zookeeper,但最近Kafka将会逐步舍弃Zookeeper而使用自带的KRaft
所以以下步骤是基于Docker安装无Zookeeper的Kafka。

环境

服务器1:

  • 10.8.15.49
  • Docker: 20.10.20
  • docker-compose: 1.26.0
  • Kafka: 3.3.1

服务器2:

  • 10.11.206.4
  • Docker: 20.10.20
  • docker-compose: 1.26.0
  • Kafka: 3.3.1

服务器3:

  • 10.11.206.141
  • Docker: 20.10.20
  • docker-compose: 1.26.0
  • Kafka: 3.3.1

docker-compose.yml

将以下docker-compose.yml分别放在各服务器的任意位置
服务器1:

version: "3"
services:
   kafka:
     image: 'bitnami/kafka:latest'
     user: root
     environment:
       - KAFKA_ENABLE_KRAFT=yes
       - KAFKA_CFG_PROCESS_ROLES=broker,controller
       - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
       - KAFKA_CFG_LISTENERS=PLAINTEXT://:9095,CONTROLLER://:9096
       - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
       - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://10.8.15.49:9095
       - KAFKA_BROKER_ID=1
       - KAFKA_KRAFT_CLUSTER_ID=LelM2dIFQkiUFvXCEcqRWA
       - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@10.8.15.49:9096,2@10.11.206.141:9093,3@10.11.206.4:9093
       - ALLOW_PLAINTEXT_LISTENER=yes
     volumes:
       - /data/deploy/kafkaCluster/kraft:/bitnami/kafka:rw
     network_mode: host

服务器2:

version: "3"
services:
   kafka:
     image: 'bitnami/kafka:latest'
     user: root
     environment:
       - KAFKA_ENABLE_KRAFT=yes
       - KAFKA_CFG_PROCESS_ROLES=broker,controller
       - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
       - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
       - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
       - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://10.11.206.4:9092
       - KAFKA_BROKER_ID=3
       - KAFKA_KRAFT_CLUSTER_ID=LelM2dIFQkiUFvXCEcqRWA
       - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@10.8.15.49:9096,2@10.11.206.141:9093,3@10.11.206.4:9093
       - ALLOW_PLAINTEXT_LISTENER=yes
     volumes:
       - /data/deploy/kafkaCluster/kraft:/bitnami/kafka:rw
     network_mode: host

服务器3:

version: "3"
services:
   kafka:
     image: 'bitnami/kafka:latest'
     user: root
     environment:
       - KAFKA_ENABLE_KRAFT=yes
       - KAFKA_CFG_PROCESS_ROLES=broker,controller
       - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
       - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
       - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
       - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://10.11.206.141:9092
       - KAFKA_BROKER_ID=3
       - KAFKA_KRAFT_CLUSTER_ID=LelM2dIFQkiUFvXCEcqRWA
       - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@10.8.15.49:9096,2@10.11.206.141:9093,3@10.11.206.4:9093
       - ALLOW_PLAINTEXT_LISTENER=yes
     volumes:
       - /data/deploy/kafkaCluster/kraft:/bitnami/kafka:rw
     network_mode: host

注:

  1. 由于10.8.15.49服务器的9092和9093端口被占用了,故这里使用9095和9096端口
  2. 由于network_mode: host原因,docker-compose文件中没有指定ports

启动

分别"docker-compose up -d"

测试

进入容器中

>>> docker exec -it kafka_kafka_1 /bin/bash

创建

副本为3、分区为5的topic

>>> /opt/bitnami/kafka/bin/kafka-topics.sh --create --topic foo --partitions 5 --replication-factor 3 --bootstrap-server 10.8.15.49:9095,10.11.206.141:9092,10.11.206.4:9092
Created topic foo.

查看topic列表

>>> /opt/bitnami/kafka/bin/kafka-topics.sh --list --bootstrap-server 10.8.15.49:9095,10.11.206.141:9092,10.11.206.4:9092
foo

查看topic详情

>>> /opt/bitnami/kafka/bin/kafka-topics.sh --describe --topic foo --bootstrap-server 10.8.15.49:9095,10.11.206.141:9092,10.11.206.4:9092
Topic: foo	TopicId: TrI5QIXpTle-yl2FJy9vCA	PartitionCount: 5	ReplicationFactor: 3	Configs:
	Topic: foo	Partition: 0	Leader: 1	Replicas: 1,2,3	Isr: 1,2,3
	Topic: foo	Partition: 1	Leader: 2	Replicas: 2,3,1	Isr: 2,3,1
	Topic: foo	Partition: 2	Leader: 3	Replicas: 3,1,2	Isr: 3,1,2
	Topic: foo	Partition: 3	Leader: 1	Replicas: 1,3,2	Isr: 1,3,2
	Topic: foo	Partition: 4	Leader: 3	Replicas: 3,2,1	Isr: 3,2,1

消息生产消费

生产者

在任意节点的容器中执行如下命令

>>> /opt/bitnami/kafka/bin/kafka-console-producer.sh --broker-list 10.8.15.49:9095,10.11.206.141:9092,10.11.206.4:9092 --topic foo
消费者

在任意节点的容器中执行如下命令

>>> /opt/bitnami/kafka/bin/kafka-console-consumer.sh --bootstrap-server 10.8.15.49:9095,10.11.206.141:9092,10.11.206.4:9092 --topic foo

效果如下:
在这里插入图片描述


经测试,以上方法在树莓派上不适用

Starting pi_kafka_1 ... done
Attaching to pi_kafka_1
kafka_1  | exec /opt/bitnami/scripts/kafka/entrypoint.sh: exec format error
pi_kafka_1 exited with code 1

参考:https://www.cnblogs.com/linjiangplus/p/16424137.html


2022-10-20更新

删除topic

通过上面方式部署成功后,如果想删除某个topic,使用如下命令

>>> /opt/bitnami/kafka/bin/kafka-topics.sh --delete --bootstrap-server 10.8.15.49:9095,10.11.206.141:9092,10.11.206.4:9092 --topic HelloWorld

会发现删除成功一段时间后,再通过如下命令查看topic列表时,该topic又会出现,那是因为消费者生产者没有退出,将所有的生产者和消费者进程退出后再删除即可

### 如何在 Docker 中以 KRaft 模式安装和运行 Kafka Kafka Raft (KRaft) 是一种替代 ZooKeeper 的新元数据管理机制,它通过内置的 Raft 协议实现分布式一致性。以下是关于如何在 Docker 容器中设置和运行 Kafka KRaft 模式的指南。 #### 1. 准备工作 确保已安装最新版本的 DockerDocker Compose 工具。此外,下载官方支持的 Apache Kafka 镜像,该镜像应包含对 KRaft 模式的支持[^1]。 ```bash docker pull confluentinc/cp-kafka:latest ``` 此命令会拉取 Confluent 提供的最新 Kafka 镜像,通常已经集成了最新的功能更新和支持。 --- #### 2. 创建配置文件 创建一个名为 `kraft-config.properties` 的配置文件,用于定义 KRaft 模式下的必要参数: ```properties process.roles=broker,controller node.id=1 listeners=PLAINTEXT://0.0.0.0:9092 controller.quorum.voters=1@localhost:9093 listener.security.protocol.map=CONTROLLER_PLAINTEXT:PLAINTEXT,PLAINTEXT:PLAINTEXT inter.broker.listener.name=PLAINTEXT num.partitions=1 log.dirs=/tmp/kraft-combined-logs transaction.state.log.replication.factor=1 offsets.topic.replication.factor=1 ``` 上述配置指定了 broker 和 controller 的角色,并设置了监听地址以及日志存储路径等重要选项。 --- #### 3. 初始化元数据 执行以下命令初始化 KRaft 所需的元数据目录结构: ```bash docker run --rm -v $(pwd):/tmp/confluent confctlinit confluentinc/cp-kafka:latest \ kafka-storage format --ignore-formatted --cluster-id randomClusterID \ --config /tmp/confluent/kraft-config.properties ``` 注意:`randomClusterID` 可替换为实际生成的 Cluster ID 或者随机字符串。 --- #### 4. 启动 Kafka 实例 利用之前创建的配置文件启动 Kafka 容器: ```yaml version: '3' services: kafka: image: confluentinc/cp-kafka:latest ports: - "9092:9092" - "9093:9093" volumes: - ./kraft-config.properties:/etc/kafka/kraft-config.properties - ./data:/tmp/kraft-combined-logs command: > bash -c " kafka-server-start /etc/kafka/kraft-config.properties && tail -f /dev/null" ``` 保存以上内容到 `docker-compose.yml` 文件中,并通过以下命令启动服务: ```bash docker-compose up -d ``` 这一步将基于指定的配置文件启动 Kafka 并使其进入 KRaft 模式运行状态。 --- #### 5. 测试连接 可以通过生产消息或消费消息的方式验证 Kafka 是否正常工作: ```bash # 生产测试消息 docker exec -it kafka kafka-console-producer --bootstrap-server localhost:9092 --topic test-topic # 消费测试消息 docker exec -it kafka kafka-console-consumer --bootstrap-server localhost:9092 --from-beginning --topic test-topic ``` 如果能够成功发送和接收消息,则说明环境搭建完成。 --- ### 注意事项 尽管 KRaft 模式简化了传统依赖于 ZooKeeper 的架构设计,但在大规模生产环境中仍需考虑额外因素,例如网络分区容忍度、磁盘性能优化等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值