文章目录
说明
Docker Hub - bitnami/kafka
Docker Hub - apache/kafka
Kafka QuickStart
Kafka 目前没有 Docker 官方镜像, 目前拉取次数最多的是 bitnami/kafka
, Apache 提供的是 apache/kafka
(更新最及时), 本文使用 bitnami/kafka
bitnami/kafka 镜像支持的环境变量有很多, 除 DockerHub 文档中列出的外, Kafka 的每一个配置项都可以与一个以 KAFKA_CFG_
开头的环境变量相对应, 如 KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE
对应 auto.create.topics.enable
, KAFKA_CFG_BACKGROUND_THREADS
对应 background.threads
Kafka 现在有两种启动方式, ZooKeeper 或 KRaft, 后者不需要依赖 Zookeeper, 本文使用 KRaft
数据卷 | 数据卷印射在容器内的路径 |
---|---|
kafka | /bitnami/kafka |
命令
shell
docker pull bitnami/kafka:3.7.0
shell
docker volume create kafka
shell
# 创建并运行容器
docker run -d --name kafka -p 9092:9092 --hostname=kafka -e TZ=Asia/Shanghai -e KAFKA_CFG_PROCESS_ROLES=controller,broker -e KAFKA_CFG_NODE_ID=0 -e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT -e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 -e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 -e KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER -e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093 -e KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false -v kafka:/bitnami/kafka bitnami/kafka:3.7.0
shell
# KRaft 模式运行 Kafka 必须的配置
# 本节点扮演的角色, 即是 broker 也是 controller
process.roles=broker,controller
# 本节点的唯一标识
node.id=0
# 指定用于控制器通信的监听器名称, 作用是告诉 Kafka 控制器节点应该使用哪个监听器来进行通信。
# 控制器节点是 Kafka 集群中的一种特殊节点,负责管理集群的元数据、领导者选举、分区分配和其他集群管理任务。在 KRaft 模式下,控制器节点通过与其他节点之间的通信来执行这些任务。
controller.listener.names=CONTROLLER
# 该项配置了该节点接受连接的两个监听器, CONTROLLER 和 PLAINTEXT. 其中, CONTROLLER 监听器用于 controller 与 broker 的通信 (由 controller.listener.names 指定), PLAINTEXT 监听器用于 broker 与客户端的通信
# 定义 Socket 服务器监听的地址. 格式为 listeners = listener_name://host_name:port
# 这里没有写 host 部分, 作用是在所有网络接口上的 9092 和 9093 端口监听连接. 可以简单认为每一个网卡(对应一个 IP)就是一个网络接口, 比如主机有 localhost/局域网/公网 三个地址, 如果配置指定了 localhost, 则客户端不能通过局域网和公网地址连接到该节点
# 如果该节点同时扮演 broker 和 controller 角色, 则至少要列出 controller 监听器, 如果未列出 broker 监听器, 则默认监听器将使用主机名,主机名等于 java.net.InetAddress.getCanonicalHostName() 的值, 使用 PLAINTEXT 监听器名称, 并监听 9092 端口
# 如果某监听器的名称不是以安全协议名称来命名, 则需要配置 listener.security.protocol.map 来指定该监听器使用的安全协议, 这里 CONTROLLER 监听器使用的安全协议需要额外指定, 而 PLAINTEXT 监听器使用的安全协议就是它本身
listeners=CONTROLLER://:9093,PLAINTEXT://:9092
# 定义了 Broker 向客户端广告的地址和端口. 这些地址和端口是客户端用来连接到 Broker 的地址和端口
# 这通常用于处理 Broker 运行在 NAT 后面或容器化环境中的情况, Broker 监听的地址和端口与客户端需要使用的地址和端口不同
# 如果不加这个配置, kafka-client api 会报 UnknownHostException: kafka, 说明是把容器内主机的 hostname 返回去了
# 假设宿主机的 IP 地址是 192.168.1.100, 则该项配置为 advertised.listeners=PLAINTEXT://192.168.1.100:9092
advertised.listeners=PLAINTEXT://localhost:9092
# 指定监听器使用的安全协议, 常见的安全协议有 PLAINTEXT/SSL/SASL_PLAINTEXT/SASL_SSL 等
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
# 投票者列表, 奇数, 格式为 {id}@{host}:{port}, 这里的 host 为 kafka 是因为 docker run 通过 --hostname 指定了容器 host 为 kafka
controller.quorum.voters=0@kafka:9093
# 控制生产者与消费者尝试与不存在的主题交互时是否自动创建主题(使用默认分区与副本配置), 默认为 true
auto.create.topics.enable=false
可以在启动日志中找到 Kafka 节点的完整配置
shell
# 查看日志
docker logs kafka
# 跟踪日志
docker logs -f kafka
docker logs --follow kafka
# 查看最后10条日志
docker logs --tail 10 kafka
# 查看最近10分钟的日志
docker logs --since 10m kafka
shell
# 进入容器并执行 bash
docker exec -it kafka bash
# 退出容器
exit
Kafka 脚本文件在容器中的存放路径 /opt/bitnami/kafka/bin
默认情况下, 新建的 Topic 有一个分区, 每个分区有一个副本, 由 num.partitions
和 default.replication.factor
指定, 默认值都是 1
shell
docker exec -it kafka bash
cd /opt/bitnami/kafka
# 创建 topic, 创建一个1分区1副本的主题, 集群每个节点都需要写到 --bootstrap-server 中, 用逗号分割
# host 用 kafka 是因为启动容器指定了 hostname
# 分区数会影响消费者的最大并行度
bin/kafka-topics.sh --bootstrap-server kafka:9092 --create --partitions 1 --replication-factor 1 --topic test
bin/kafka-topics.sh --bootstrap-server kafka:9092 --create --topic test
# 查看 topic
bin/kafka-topics.sh --bootstrap-server kafka:9092 --list
bin/kafka-topics.sh --bootstrap-server kafka:9092 --describe --topic test
# 修改 topic, 分区改为两个(分区数只能增不能减)
bin/kafka-topics.sh --bootstrap-server kafka:9092 -alter --partitions 2 --topic test
# 删除 topic
bin/kafka-topics.sh --bootstrap-server kafka:9092 --delete --topic test