bash
# =============================================================================
# Kafka Docker Compose 部署变量模板
# 用法:cp docker-compose.env.example .env 然后按需修改(三个 compose 文件共用本文件)
# 注意:.env 与 compose 文件必须放在同一个目录下
# =============================================================================
# 镜像(Apache 官方 JVM 镜像;实验性的 native 版 apache/kafka-native 不建议生产使用)
KAFKA_IMAGE=apache/kafka:4.3.1
# KRaft 集群 ID:同一集群所有节点必须完全一致,且首次格式化后不可随意更换
# 生成方式:docker run --rm apache/kafka:4.3.1 /opt/kafka/bin/kafka-storage.sh random-uuid
CLUSTER_ID=4L6g3nShT-eMCtK--X86sw
# 客户端连接 Kafka 时使用的主机名/IP ------ 必须是"客户端所在机器能访问到"的地址
# · 客户端就在本机(宿主机) → localhost
# · 客户端是局域网内其他机器 → 填宿主机 IP,例如 192.168.1.100
# · 客户端是云主机外部的机器 → 填公网 IP 或域名
# 填错的典型症状:客户端能连上 bootstrap,但随后报超时/连接被拒(拿到的是连不通的地址)
HOST_ADVERTISED_HOST=localhost
# 单节点模式下映射到宿主机的 Kafka 端口
HOST_KAFKA_PORT=9092
bash
# =============================================================================
# Apache Kafka KRaft 模式 · Docker Compose 单节点部署
# 镜像:apache/kafka:4.3.1(Apache 官方 JVM 镜像)
# 用途:本地开发、功能测试、单机小规模场景
#
# 用法:
# cp docker-compose.env.example .env # 按需修改 CLUSTER_ID / HOST_ADVERTISED_HOST
# docker compose -f docker-compose-single-node.yml up -d
# docker compose -f docker-compose-single-node.yml logs -f kafka
#
# 两个必须知道的点:
# 1) 客户端不在本机时,务必把 .env 里的 HOST_ADVERTISED_HOST 改成宿主机 IP/域名,
# 否则客户端拿到的是 localhost:9092,会出现"能连上 bootstrap 但随后超时"。
# 2) 数据目录必须显式设为 KAFKA_LOG_DIRS=/var/lib/kafka/data 并挂载卷;
# 镜像默认的 /tmp/kraft-combined-logs 位于容器可写层,容器一删数据就没了。
# =============================================================================
name: kafka-single
services:
kafka:
image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
hostname: kafka
container_name: kafka
restart: unless-stopped
# Kafka 关停需要时间落盘,留足优雅退出时间
stop_grace_period: 60s
ports:
# 宿主机客户端入口(对应 PLAINTEXT_HOST 监听器)
- "${HOST_KAFKA_PORT:-9092}:9092"
volumes:
- kafka-data:/var/lib/kafka/data
environment:
# ---------- 集群标识 ----------
CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
# ---------- KRaft 角色 ----------
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
# ---------- 监听器 ----------
# PLAINTEXT :容器间/集群内部通信(不映射到宿主机)
# CONTROLLER :KRaft 控制器通信
# PLAINTEXT_HOST :给宿主机/外部客户端的入口
KAFKA_LISTENERS: PLAINTEXT://:19092,CONTROLLER://:29093,PLAINTEXT_HOST://:9092
# advertised 必须是"客户端真正能连到的地址",且不要包含 CONTROLLER 监听器
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:19092,PLAINTEXT_HOST://${HOST_ADVERTISED_HOST:-localhost}:${HOST_KAFKA_PORT:-9092}
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka:29093
# ---------- 存储 ----------
KAFKA_LOG_DIRS: /var/lib/kafka/data
# ---------- 单节点副本因子(集群文件里是 3)----------
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR: 1
KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR: 1
KAFKA_DEFAULT_REPLICATION_FACTOR: 1
KAFKA_MIN_INSYNC_REPLICAS: 1
# ---------- 常规参数 ----------
# 开发环境想省去手动建 topic,可把下面这行改成 "true"
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
KAFKA_NUM_PARTITIONS: 3
KAFKA_LOG_RETENTION_HOURS: 168
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
# ---------- JVM ----------
# 堆建议取容器内存上限的约 1/2,其余留给页缓存和直接内存
KAFKA_HEAP_OPTS: -Xms512m -Xmx512m
# 只在内网使用时,可把上面 advertised 的 HOST_ADVERTISED_HOST 设为内网 IP,
# 并把 ports 改成 "127.0.0.1:9092:9092" 限制只允许本机访问。
ulimits:
nofile:
soft: 65536
hard: 65536
healthcheck:
# 能响应 Broker API 才算健康;每次探测会启动一个 JVM,开销可接受
test:
- CMD-SHELL
- /opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server localhost:19092 >/dev/null 2>&1
interval: 15s
timeout: 10s
retries: 10
start_period: 30s
deploy:
resources:
limits:
cpus: "2"
memory: 2g
reservations:
cpus: "0.5"
memory: 1g
# ---------------------------------------------------------------- 可选:图形界面
# 如需 Web 界面,去掉下面的注释即可(第三方镜像,按需评估后使用)
# kafka-ui:
# image: provectuslabs/kafka-ui:latest
# container_name: kafka-ui
# restart: unless-stopped
# depends_on:
# kafka:
# condition: service_healthy
# ports:
# - "8080:8080"
# environment:
# KAFKA_CLUSTERS_0_NAME: local
# KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:19092
volumes:
kafka-data:
driver: local
# 想用宿主机目录(bind mount)时,改用下面写法,并先把目录属主改成 uid 1000:
# sudo mkdir -p /data/kafka && sudo chown -R 1000:1000 /data/kafka
# 然后把上面的 "kafka-data:/var/lib/kafka/data" 换成 "/data/kafka:/var/lib/kafka/data"
# driver_opts:
# type: none
# o: bind
# device: /data/kafka
bash
# =============================================================================
# Apache Kafka KRaft 模式 · Docker Compose 三节点集群(Combined:broker + controller 合一)
# 镜像:apache/kafka:4.3.1(Apache 官方 JVM 镜像)
# 用途:单机上跑出可容 1 节点故障的 3 副本集群;小规模生产、预发、联调
#
# 用法:
# cp docker-compose.env.example .env
# docker compose -f docker-compose-cluster-3node.yml up -d
# docker compose -f docker-compose-cluster-3node.yml ps
#
# 拓扑:
# kafka-1 内部 19092 / 控制器 9093 / 宿主机 29092
# kafka-2 内部 19092 / 控制器 9093 / 宿主机 39092
# kafka-3 内部 19092 / 控制器 9093 / 宿主机 49092
#
# 注意:三个节点共用 .env 里的 CLUSTER_ID(必须一致),
# 但 node.id、advertised.listeners、宿主机端口各自不同,已在下方逐个写死。
# =============================================================================
name: kafka-cluster
services:
kafka-1:
image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
hostname: kafka-1
container_name: kafka-1
restart: unless-stopped
stop_grace_period: 60s
ports:
- "29092:9092"
volumes:
- kafka-1-data:/var/lib/kafka/data
environment:
CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://:19092,CONTROLLER://:9093,PLAINTEXT_HOST://:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-1:19092,PLAINTEXT_HOST://${HOST_ADVERTISED_HOST:-localhost}:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093
KAFKA_LOG_DIRS: /var/lib/kafka/data
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2
KAFKA_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR: 3
KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR: 2
KAFKA_DEFAULT_REPLICATION_FACTOR: 3
KAFKA_MIN_INSYNC_REPLICAS: 2
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
KAFKA_NUM_PARTITIONS: 3
KAFKA_LOG_RETENTION_HOURS: 168
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_HEAP_OPTS: -Xms1g -Xmx1g
ulimits:
nofile:
soft: 65536
hard: 65536
healthcheck:
test:
- CMD-SHELL
- /opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server localhost:19092 >/dev/null 2>&1
interval: 15s
timeout: 10s
retries: 10
start_period: 40s
deploy:
resources:
limits:
cpus: "2"
memory: 3g
kafka-2:
image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
hostname: kafka-2
container_name: kafka-2
restart: unless-stopped
stop_grace_period: 60s
ports:
- "39092:9092"
volumes:
- kafka-2-data:/var/lib/kafka/data
environment:
CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
KAFKA_NODE_ID: 2
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://:19092,CONTROLLER://:9093,PLAINTEXT_HOST://:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-2:19092,PLAINTEXT_HOST://${HOST_ADVERTISED_HOST:-localhost}:39092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093
KAFKA_LOG_DIRS: /var/lib/kafka/data
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2
KAFKA_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR: 3
KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR: 2
KAFKA_DEFAULT_REPLICATION_FACTOR: 3
KAFKA_MIN_INSYNC_REPLICAS: 2
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
KAFKA_NUM_PARTITIONS: 3
KAFKA_LOG_RETENTION_HOURS: 168
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_HEAP_OPTS: -Xms1g -Xmx1g
ulimits:
nofile:
soft: 65536
hard: 65536
healthcheck:
test:
- CMD-SHELL
- /opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server localhost:19092 >/dev/null 2>&1
interval: 15s
timeout: 10s
retries: 10
start_period: 40s
deploy:
resources:
limits:
cpus: "2"
memory: 3g
kafka-3:
image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
hostname: kafka-3
container_name: kafka-3
restart: unless-stopped
stop_grace_period: 60s
ports:
- "49092:9092"
volumes:
- kafka-3-data:/var/lib/kafka/data
environment:
CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
KAFKA_NODE_ID: 3
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://:19092,CONTROLLER://:9093,PLAINTEXT_HOST://:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-3:19092,PLAINTEXT_HOST://${HOST_ADVERTISED_HOST:-localhost}:49092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093
KAFKA_LOG_DIRS: /var/lib/kafka/data
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2
KAFKA_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR: 3
KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR: 2
KAFKA_DEFAULT_REPLICATION_FACTOR: 3
KAFKA_MIN_INSYNC_REPLICAS: 2
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
KAFKA_NUM_PARTITIONS: 3
KAFKA_LOG_RETENTION_HOURS: 168
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_HEAP_OPTS: -Xms1g -Xmx1g
ulimits:
nofile:
soft: 65536
hard: 65536
healthcheck:
test:
- CMD-SHELL
- /opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server localhost:19092 >/dev/null 2>&1
interval: 15s
timeout: 10s
retries: 10
start_period: 40s
deploy:
resources:
limits:
cpus: "2"
memory: 3g
volumes:
kafka-1-data:
kafka-2-data:
kafka-3-data:
bash
# =============================================================================
# Apache Kafka KRaft 模式 · Docker Compose 角色分离(Isolated:controller / broker 各自独立)
# 镜像:apache/kafka:4.3.1(Apache 官方 JVM 镜像)
# 用途:生产取向。controller 只做元数据共识,不受 broker 流量影响,可独立扩缩容
#
# 用法:
# cp docker-compose.env.example .env
# docker compose -f docker-compose-isolated.yml up -d
#
# 拓扑(6 个容器):
# controller-1/2/3 node.id=1/2/3 仅 CONTROLLER 监听 9093(不对外暴露端口)
# kafka-1/2/3 node.id=4/5/6 内部 19092 / 宿主机 29092、39092、49092
#
# 关键约束:controller-only 节点严禁设置 KAFKA_ADVERTISED_LISTENERS,
# 官方启动脚本会直接报错退出("KAFKA_ADVERTISED_LISTENERS is not supported on a KRaft controller.")
# =============================================================================
name: kafka-isolated
services:
# ================================ Controller 层 ================================
controller-1:
image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
hostname: controller-1
container_name: controller-1
restart: unless-stopped
stop_grace_period: 60s
volumes:
- controller-1-data:/var/lib/kafka/data
environment:
CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: controller
KAFKA_LISTENERS: CONTROLLER://:9093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093
KAFKA_LOG_DIRS: /var/lib/kafka/data
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_HEAP_OPTS: -Xms512m -Xmx512m
healthcheck:
test:
- CMD-SHELL
- /opt/kafka/bin/kafka-metadata-quorum.sh --bootstrap-controller localhost:9093 describe --status >/dev/null 2>&1
interval: 15s
timeout: 10s
retries: 10
start_period: 30s
deploy:
resources:
limits:
cpus: "1"
memory: 2g
controller-2:
image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
hostname: controller-2
container_name: controller-2
restart: unless-stopped
stop_grace_period: 60s
volumes:
- controller-2-data:/var/lib/kafka/data
environment:
CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
KAFKA_NODE_ID: 2
KAFKA_PROCESS_ROLES: controller
KAFKA_LISTENERS: CONTROLLER://:9093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093
KAFKA_LOG_DIRS: /var/lib/kafka/data
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_HEAP_OPTS: -Xms512m -Xmx512m
healthcheck:
test:
- CMD-SHELL
- /opt/kafka/bin/kafka-metadata-quorum.sh --bootstrap-controller localhost:9093 describe --status >/dev/null 2>&1
interval: 15s
timeout: 10s
retries: 10
start_period: 30s
deploy:
resources:
limits:
cpus: "1"
memory: 2g
controller-3:
image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
hostname: controller-3
container_name: controller-3
restart: unless-stopped
stop_grace_period: 60s
volumes:
- controller-3-data:/var/lib/kafka/data
environment:
CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
KAFKA_NODE_ID: 3
KAFKA_PROCESS_ROLES: controller
KAFKA_LISTENERS: CONTROLLER://:9093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093
KAFKA_LOG_DIRS: /var/lib/kafka/data
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_HEAP_OPTS: -Xms512m -Xmx512m
healthcheck:
test:
- CMD-SHELL
- /opt/kafka/bin/kafka-metadata-quorum.sh --bootstrap-controller localhost:9093 describe --status >/dev/null 2>&1
interval: 15s
timeout: 10s
retries: 10
start_period: 30s
deploy:
resources:
limits:
cpus: "1"
memory: 2g
# ================================== Broker 层 ==================================
kafka-1:
image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
hostname: kafka-1
container_name: kafka-1
restart: unless-stopped
stop_grace_period: 60s
depends_on:
- controller-1
- controller-2
- controller-3
ports:
- "29092:9092"
volumes:
- kafka-1-data:/var/lib/kafka/data
environment:
CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
KAFKA_NODE_ID: 4
KAFKA_PROCESS_ROLES: broker
KAFKA_LISTENERS: PLAINTEXT://:19092,PLAINTEXT_HOST://:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-1:19092,PLAINTEXT_HOST://${HOST_ADVERTISED_HOST:-localhost}:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093
KAFKA_LOG_DIRS: /var/lib/kafka/data
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2
KAFKA_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR: 3
KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR: 2
KAFKA_DEFAULT_REPLICATION_FACTOR: 3
KAFKA_MIN_INSYNC_REPLICAS: 2
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
KAFKA_NUM_PARTITIONS: 3
KAFKA_LOG_RETENTION_HOURS: 168
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_HEAP_OPTS: -Xms2g -Xmx2g
ulimits:
nofile:
soft: 65536
hard: 65536
healthcheck:
test:
- CMD-SHELL
- /opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server localhost:19092 >/dev/null 2>&1
interval: 15s
timeout: 10s
retries: 10
start_period: 40s
deploy:
resources:
limits:
cpus: "2"
memory: 4g
kafka-2:
image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
hostname: kafka-2
container_name: kafka-2
restart: unless-stopped
stop_grace_period: 60s
depends_on:
- controller-1
- controller-2
- controller-3
ports:
- "39092:9092"
volumes:
- kafka-2-data:/var/lib/kafka/data
environment:
CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
KAFKA_NODE_ID: 5
KAFKA_PROCESS_ROLES: broker
KAFKA_LISTENERS: PLAINTEXT://:19092,PLAINTEXT_HOST://:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-2:19092,PLAINTEXT_HOST://${HOST_ADVERTISED_HOST:-localhost}:39092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093
KAFKA_LOG_DIRS: /var/lib/kafka/data
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2
KAFKA_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR: 3
KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR: 2
KAFKA_DEFAULT_REPLICATION_FACTOR: 3
KAFKA_MIN_INSYNC_REPLICAS: 2
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
KAFKA_NUM_PARTITIONS: 3
KAFKA_LOG_RETENTION_HOURS: 168
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_HEAP_OPTS: -Xms2g -Xmx2g
ulimits:
nofile:
soft: 65536
hard: 65536
healthcheck:
test:
- CMD-SHELL
- /opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server localhost:19092 >/dev/null 2>&1
interval: 15s
timeout: 10s
retries: 10
start_period: 40s
deploy:
resources:
limits:
cpus: "2"
memory: 4g
kafka-3:
image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
hostname: kafka-3
container_name: kafka-3
restart: unless-stopped
stop_grace_period: 60s
depends_on:
- controller-1
- controller-2
- controller-3
ports:
- "49092:9092"
volumes:
- kafka-3-data:/var/lib/kafka/data
environment:
CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
KAFKA_NODE_ID: 6
KAFKA_PROCESS_ROLES: broker
KAFKA_LISTENERS: PLAINTEXT://:19092,PLAINTEXT_HOST://:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-3:19092,PLAINTEXT_HOST://${HOST_ADVERTISED_HOST:-localhost}:49092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093
KAFKA_LOG_DIRS: /var/lib/kafka/data
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2
KAFKA_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR: 3
KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR: 2
KAFKA_DEFAULT_REPLICATION_FACTOR: 3
KAFKA_MIN_INSYNC_REPLICAS: 2
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
KAFKA_NUM_PARTITIONS: 3
KAFKA_LOG_RETENTION_HOURS: 168
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_HEAP_OPTS: -Xms2g -Xmx2g
ulimits:
nofile:
soft: 65536
hard: 65536
healthcheck:
test:
- CMD-SHELL
- /opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server localhost:19092 >/dev/null 2>&1
interval: 15s
timeout: 10s
retries: 10
start_period: 40s
deploy:
resources:
limits:
cpus: "2"
memory: 4g
volumes:
controller-1-data:
controller-2-data:
controller-3-data:
kafka-1-data:
kafka-2-data:
kafka-3-data:
仅供参考
