一、准备工作
-
安装 Docker
确保本机已安装 Docker。可以通过以下命令检查 Docker 是否已安装:bashdocker --version
如果未安装,可以访问 Docker 官网下载并安装 Docker Desktop(Windows 和 Mac)或使用包管理器安装(Linux)。
-
拉取 Kafka 镜像
打开终端,执行以下命令拉取 Kafka 镜像:bashdocker pull bitnami/kafka:latest
此命令会从 Docker Hub 下载最新版本的 Kafka 镜像,由 Bitnami 提供,该镜像已预配置好 Kafka 的环境和依赖。
单机
Kafka 4.0 将移除zookeeper,仅支持KRaft
所以我们使用KRaft
模式,这也是kafka
的默认模式.
1.创建数据目录
在本机上创建一个目录用于存放 Kafka 的数据,例如 /data/kafka_data
。可以使用以下命令创建:
bash
mkdir -p /data/kafka_data
由于这是一个非 root 的容器,挂载的文件和目录必须具有 UID 1001
的适当权限
bash
sudo chown -R 1001:1001 /data/kafka_data
2.docker-run启动 Kafka 容器
在终端中执行以下命令启动 Kafka 容器:
bash
docker run -d --name kafka \
-p 9092:9092 -p 9093:9093 \
-e KAFKA_ENABLE_KRAFT=yes \
-e KAFKA_CFG_PROCESS_ROLES=broker,controller \
-e KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER \
-e KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT \
-e KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 \
-e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \
-e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://:9092 \
-e KAFKA_BROKER_ID=1 \
-e KAFKA_CFG_NODE_ID=1 \
-e KAFKA_KRAFT_CLUSTER_ID=your_unique_cluster_id \
-e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@localhost:9093 \
-e KAFKA_CFG_CONTROLLER_QUORUM_VOTER_CLIENT_QUOTA_WINDOW_NUM=10 \
-e KAFKA_CFG_CONTROLLER_QUORUM_VOTER_CLIENT_QUOTA_WINDOW_SIZE_SECONDS=1 \
-e KAFKA_CFG_CONTROLLER_QUORUM_VOTER_REQUEST_TIMEOUT_MS=5000 \
-v /data/kafka_data:/kafka:rw \
bitnami/kafka:latest
3.docker-compose部署 Kafka 容器
docker compose -f docker-compose.yml up -d
bash
version: "3"
services:
kafka:
image: bitnami/kafka:latest
ports:
- "9092:9092"
volumes:
- "/data/kafka_data:/bitnami"
environment:
# KRaft settings
- KAFKA_CFG_NODE_ID=0
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@localhost:9093
# Listeners
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://:9092
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
参数解释
参数名称 | 说明 |
---|---|
KAFKA_ADVERTISED_HOST_NAME | 这是 Kafka 服务器的主机名或 IP地址,用于通知生产者和消费者连接到该地址。 |
KAFKA_ENABLE_KRAFT | 这个参数启用 Kafka Raft(KRaft)模式,它是 Kafka 2.8.0版本引入的一种新的高可用性模式。 |
KAFKA_KRAFT_CLUSTER_ID | 这是 KRaft 集群的唯一标识符,用于将 Kafka 服务器加入特定的 KRaft集群。 |
KAFKA_CFG_PROCESS_ROLES | 这个参数指定 Kafka 服务器的角色,其中 "broker" 表示服务器是一个普通的Kafka 节点,"controller" 表示服务器是集群的控制器。 |
KAFKA_BROKER_ID | 这是 Kafka 服务器的唯一标识符,用于在集群中区分不同的服务器。 |
KAFKA_CFG_NUM_PARTITIONS | 这个参数指定每个主题的默认分区数。分区是 Kafka中的消息存储单元,用于实现消息的并行处理。 |
KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR | 这个参数指定偏移量主题的副本因子,偏移量主题用于存储消费者的偏移量信息。 |
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP | 这个参数定义了不同监听器的安全协议映射关系。在这个例子中,"EXTERNAL" 和 "CONTROLLER"分别映射到 "PLAINTEXT" 协议,表示这些监听器使用明文传输。 |
KAFKA_CFG_LISTENERS | 这个参数指定每个主题的默认分区数。分区是 Kafka中的消息存储单元,用于实现消息的并行处理。 |
KAFKA_CFG_ADVERTISED_LISTENERS | 这个参数定义了 Kafka监听器的配置。在这个例子中,有两个监听器分别使用不同的协议和端口号。 |
KAFKA_CFG_INTER_BROKER_LISTENER_NAME | 这个参数指定了经纪人之间通信使用的监听器名称,其中 "CLIENT" 表示使用客户端监听器。 |
KAFKA_CFG_CONTROLLER_LISTENER_NAMES | 这个参数指定控制器监听器的名称,用于控制器与其他经纪人之间的通信。 |
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS | 这个参数指定了控制器选举过程中的投票者信息,包括其 ID和监听器的地址。 |
ALLOW_PLAINTEXT_LISTENER | 这个参数允许使用明文传输的监听器进行连接。 |
KAFKA_AUTO_CREATE_TOPICS_ENABLE | 这个参数启用自动创建主题的功能,当生产者发送消息到不存在的主题时,将自动创建该主题。 |
KAFKA_CFG_INITIAL_BROKER_REGISTRATION_TIMEOUT_MS | 这个参数指定初始经纪人注册的超时时间,以毫秒为单位。在集群启动期间,经纪人必须在指定的时间内完成注册。 |
集群
生产环境中,机器足够,也需要一定的性能和稳定性。选择推荐使用完整集群方案
在3.0+版本中,基于raft协议的集群元数据管理方式,已经成熟,此处推荐使用kraft协议部署,简化部署方案
以前旧的依赖Zookeeper的方案在此不再提供、研究、维护
集群方式可参考链接
三台服务器,每个节点都承担broker,controller
角色
bash
# Copyright Broadcom, Inc. All Rights Reserved.
# SPDX-License-Identifier: APACHE-2.0
services:
kafka-0:
image: docker.io/bitnami/kafka:3.9
ports:
- "9092"
environment:
# KRaft settings
- KAFKA_CFG_NODE_ID=0
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-0:9093,1@kafka-1:9093,2@kafka-2:9093
- KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv
# Listeners
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://:9092
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
# Clustering
- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2
volumes:
- kafka_0_data:/bitnami/kafka
kafka-1:
image: docker.io/bitnami/kafka:3.9
ports:
- "9092"
environment:
# KRaft settings
- KAFKA_CFG_NODE_ID=1
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-0:9093,1@kafka-1:9093,2@kafka-2:9093
- KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv
# Listeners
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://:9092
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
# Clustering
- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2
volumes:
- kafka_1_data:/bitnami/kafka
kafka-2:
image: docker.io/bitnami/kafka:3.9
ports:
- "9092"
environment:
# KRaft settings
- KAFKA_CFG_NODE_ID=2
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-0:9093,1@kafka-1:9093,2@kafka-2:9093
- KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv
# Listeners
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://:9092
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
# Clustering
- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2
volumes:
- kafka_2_data:/bitnami/kafka
volumes:
kafka_0_data:
driver: local
kafka_1_data:
driver: local
kafka_2_data:
driver: local