Docker部署Kafka集群需至少3个broker节点,启用KRaft或ZooKeeper协调,配置唯一node.id、合理listeners与advertised.listeners,创建topic时指定partitions和replication-factor实现分区与容错。

用 Docker 部署 Kafka 集群并支持数据分区,核心在于:正确配置多个 broker 节点、启用内部协调机制(如 KRaft 或 ZooKeeper)、合理设置 topic 分区数与副本因子。单节点容器无法实现真正集群高可用和分区负载分担,必须至少 3 个 broker 才能体现分区容错与横向扩展能力。
选择合适镜像与部署模式
推荐使用 bitnami/kafka:3.6+(KRaft 模式原生支持)或 wurstmeister/kafka + zookeeper(传统 ZooKeeper 协调)。KRaft 模式更轻量、无需额外 ZooKeeper 容器,适合新项目;ZooKeeper 模式兼容性更好,适合已有生态。
- 避免使用 apache/kafka 官方镜像(下载量低、文档少、维护弱)
- 不建议在单容器内“模拟”多 broker——本质仍是单点,无法实现真实分区冗余
- 生产环境禁用
KAFKA_CFG_PROCESS_ROLES=controller,broker全合一模式,应分离 controller 和 broker 角色提升稳定性
docker-compose 部署三节点 KRaft 集群
以 bitnami/kafka 为例,以下是最小可行集群配置(3 broker + 1 controller quorum):
- 每个 broker 设置唯一
KAFKA_CFG_NODE_ID(如 0/1/2) -
KAFKA_CFG_PROCESS_ROLES统一设为broker,另起一个专用 controller 容器或复用其中一个(推荐单独 controller) -
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS必须包含全部 controller 节点,格式为0@controller:9093,1@broker1:9093,2@broker2:9093 -
KAFKA_CFG_LISTENERS至少暴露PLAINTEXT和CONTROLLER两个 listener,ADVERTISED_LISTENERS需映射到宿主机可访问地址(如PLAINTEXT://192.168.9.81:9092)
网络需共用自定义 bridge 网络(如 kafka-net),确保容器间 DNS 可解析(如 broker1、broker2、controller)。
创建带分区和副本的 Topic
集群启动后,通过 kafka-topics.sh 工具创建 topic 并显式指定分区与副本:
- 命令示例:
./kafka-topics.sh --create --bootstrap-server broker1:9092 --topic orders --partitions 6 --replication-factor 3 -
--partitions 6表示该 topic 数据将切分为 6 个逻辑分区,写入时按 key 哈希或轮询分发,实现并行读写 -
--replication-factor 3表示每个分区有 3 个副本(1 leader + 2 followers),分布在不同 broker 上,保障单节点宕机不丢数据 - 可通过
--describe查看分区分布:./kafka-topics.sh --describe --topic orders --bootstrap-server broker1:9092,确认各 partition 的 leader 和 replicas 是否跨节点
验证分区写入与消费行为
使用控制台工具发送/接收消息,观察是否触发真实分区路由:
- 发送带 key 的消息:
./kafka-console-producer.sh --bootstrap-server broker1:9092 --topic orders --property parse.key=true --property key.separator=:,输入user_123:{"order_id":"abc"} - 同一 key 的消息始终落到同一 partition(由默认
DefaultPartitioner保证),可用于业务有序性场景 - 启动多个消费者(
--group-id test-group)时,Kafka 自动将 6 个分区分配给消费者实例,实现水平扩展消费能力 - 停掉一个 broker 后,原 leader 分区自动切换至 follower,producer/consumer 无感知继续工作



















