此kafka集群用于测试
使用Docker Compose 多节点集群
GitHub 上有成熟的 KRaft 模式 3 节点集群方案,每个节点同时充当 Broker 和 Controller
yaml
version: '3.8'
services:
kafka1:
image: apache/kafka:4.2.0
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9108,CONTROLLER://0.0.0.0:9109
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9112
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka1:9109,2@kafka2:9109,3@kafka3:9109
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2
ports:
- "9112:9108"
volumes:
- kafka1-data:/var/lib/kafka/data
kafka2:
image: apache/kafka:4.2.0
environment:
KAFKA_NODE_ID: 2
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9108,CONTROLLER://0.0.0.0:9109
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9113
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka1:9109,2@kafka2:9109,3@kafka3:9109
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2
ports:
- "9113:9108"
volumes:
- kafka2-data:/var/lib/kafka/data
kafka3:
image: apache/kafka:4.2.0
environment:
KAFKA_NODE_ID: 3
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9108,CONTROLLER://0.0.0.0:9109
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9114
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka1:9109,2@kafka2:9109,3@kafka3:9109
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2
ports:
- "9114:9108"
volumes:
- kafka3-data:/var/lib/kafka/data
kafka-ui:
image: provectuslabs/kafka-ui:latest
ports:
- "9115:8080"
environment:
KAFKA_CLUSTERS_0_NAME: local-cluster
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka1:9108,kafka2:9108,kafka3:9108
depends_on:
- kafka1
- kafka2
- kafka3
volumes:
kafka1-data:
kafka2-data:
kafka3-data:
端口分配说明
| 用途 | 端口 |
|---|---|
| 容器内部 Broker 监听 | 9108 |
| 容器内部 Controller 监听 | 9109 |
| 外部访问 kafka1 | 9112 |
| 外部访问 kafka2 | 9113 |
| 外部访问 kafka3 | 9114 |
| Kafka UI | 9115 |
注意:如需调整自己按照端口号修改即可
启动
bash
# 1. 先创建网络(可选)
docker network create kafka-net
# 2. 设置集群 ID
export KAFKA_CLUSTER_ID=$(docker run --rm apache/kafka:4.2.0 /opt/kafka/bin/kafka-storage.sh random-uuid)
# 3. 启动集群
docker compose up -d
# 4. 验证
docker ps
# 访问 http://localhost:9115 查看 Kafka UI