# ============================================================================= # 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# ============================================================================= # 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# ============================================================================= # 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:# ============================================================================= # 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:仅供参考