docker kafka 配置文件
version: '3.8'
name: "kafka-service" # https://docs.docker.com/compose/how-tos/project-name/
services:
kafka-server0:
image: bitnami/kafka:latest
hostname: kafka0
container_name: kafka0
ports:
- "9092:9094"
environment:
KAFKA_CFG_NODE_ID: 0
KAFKA_CFG_BROKER_ID: 0
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://0.0.0.0:9094
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka0:9092,EXTERNAL://192.168.60.134:9092
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 1@kafka1:9093,2@kafka2:9093,0@kafka0:9093
KAFKA_CFG_PROCESS_ROLES: broker,controller
# KAFKA_CFG_LOG_DIRS: /var/lib/kafka/data
KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR: 2
KAFKA_CFG_MIN_INSYNC_REPLICAS: 1
KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE: true
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_KRAFT_CLUSTER_ID: d6c6ea9d1bfe423ebdc74579b10c61f0
networks:
kafka:
ipv4_address: 172.16.0.2
volumes:
- ~/kafka-data/0:/bitnami/kafka
kafka-server1:
image: bitnami/kafka:latest
hostname: kafka1
container_name: kafka1
ports:
- "9094:9094"
environment:
KAFKA_CFG_NODE_ID: 1
KAFKA_CFG_BROKER_ID: 1
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://0.0.0.0:9094
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092,EXTERNAL://192.168.60.134:9094
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 1@kafka1:9093,2@kafka2:9093,0@kafka0:9093
KAFKA_CFG_PROCESS_ROLES: broker,controller
# KAFKA_CFG_LOG_DIRS: /var/lib/kafka/data
KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR: 2
KAFKA_CFG_MIN_INSYNC_REPLICAS: 1
KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE: true
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_KRAFT_CLUSTER_ID: d6c6ea9d1bfe423ebdc74579b10c61f0
networks:
kafka:
ipv4_address: 172.16.0.3
volumes:
- ~/kafka-data/1:/bitnami/kafka
kafka-server2:
image: bitnami/kafka:latest
hostname: kafka2
container_name: kafka2
ports:
- "9096:9094"
environment:
KAFKA_CFG_NODE_ID: 2
KAFKA_CFG_BROKER_ID: 2
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://0.0.0.0:9094
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka2:9092,EXTERNAL://192.168.60.134:9096
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 1@kafka1:9093,2@kafka2:9093,0@kafka0:9093
KAFKA_CFG_PROCESS_ROLES: broker,controller
# KAFKA_CFG_LOG_DIRS: /var/lib/kafka/data
KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR: 2
KAFKA_CFG_MIN_INSYNC_REPLICAS: 1
KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE: true
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_KRAFT_CLUSTER_ID: d6c6ea9d1bfe423ebdc74579b10c61f0
networks:
kafka:
ipv4_address: 172.16.0.4
volumes:
- ~/kafka-data/2:/bitnami/kafka
networks:
kafka:
driver: bridge
name: kafka-net
ipam:
config:
- subnet: 172.16.0.0/24
gateway: 172.16.0.1
KAFKA_CFG_LISTENERS
:
- 配置的监听器将被用于监听网络请求,
listener_name://host_name:port,listener_name2://host_name2:port2。
- 可以同时配置多个,并且用逗号隔开,监听器的名称和端口必须是唯一的,host_name如果为空,则会绑定到默认的接口(网卡)。
KAFKA_CFG_ADVERTISED_LISTENERS
:
ADVERTISED_LISTENERS
配置 Kafka broker 向客户端(生产者和消费者)报告的地址。- 这是客户端用来连接到 broker 的地址。
- 例如:
ADVERTISED_LISTENERS=PLAINTEXT://broker-hostname:9092
表示 broker 将向客户端报告broker-hostname:9092
作为连接地址。
KAFKA_CFG_PROCESS_ROLES
:
- 如果
PROCESS_ROLES = Broker
,服务器在KRaft模式中充当 Broker。 - 如果
PROCESS_ROLES = Controller
,服务器在KRaft模式下充当 Controller。 - 如果
PROCESS_ROLES = Broker,Controller
,服务器在KRaft模式中同时充当 Broker 和Controller。 - 如果
PROCESS_ROLES
没有设置,那么集群就假定是运行在ZooKeeper模式下。
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS
:
- 标识有哪些节点是 Quorum 的投票者节点。所有想成为控制器的节点都需要包含在这个配置里面。
- 需要包含每个节点的id。如
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 1@kafka1:9093,2@kafka2:9093,0@kafka0:9093
KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR
:
- 用于指定内部主题
__consumer_offsets
的副本因子。__consumer_offsets
主题用于存储消费者组的偏移量信息。 - 设置
KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
表示__consumer_offsets
主题将有 3 个副本。这意味着即使有两个 broker 发生故障,仍然可以从剩余的一个副本中读取消费者偏移量信息。
KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR
:
- 指定内部主题
__transaction_state
的副本因子。__transaction_state
主题用于存储事务状态信息。
KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR
:
- 指定了事务状态日志主题的最小同步副本数(ISR)。这个参数确保在提交事务时,至少有指定数量的副本是同步的。说一说你对 Kafka 中 ISR 的理解-腾讯云开发者社区-腾讯云
KAFKA_CFG_MIN_INSYNC_REPLICAS
:
- 指定在写操作(例如生产消息)被认为成功之前,必须确认写入的最小同步副本(ISR)数量。
问题:
- 在外部网络能够正常使用
KafkaProducer
向kafka docker
集群生产消息,但KafkaConsumer不能正常使用group_id消费消息(而不指定group_id,却能消费消息)。问题无法复现,在解决NotLeaderForPartitionError
问题后,不在出现。 挂载卷问题(待解决):
kafka0 | mkdir: cannot create directory '/bitnami/kafka/config': Permission denied kafka2 | mkdir: cannot create directory '/bitnami/kafka/config': Permission denied kafka1 | mkdir: cannot create directory '/bitnami/kafka/config': Permission denied
NOTE: As this is a non-root container, the mounted files and directories must have the proper permissions for the UID
1001
.sudo chmod 776 -R kafka-data/
:为其他用户组给出可读可写权限。
生产者
NotLeaderForPartitionError
:KAFKA_CFG_ADVERTISED_LISTENERS配置错误:错误配置:
kafka-server1: image: bitnami/kafka:latest hostname: kafka1 container_name: kafka1 ports: - "9092:9094" environment: KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094 KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092,EXTERNAL://localhost:9094
正确配置:
kafka-server1: image: bitnami/kafka:latest hostname: kafka1 container_name: kafka1 ports: - "9092:9094" environment: KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://0.0.0.0:9094 KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092,EXTERNAL://192.168.60.134:9092
原因:
Note: To connect from an external machine, change
localhost
above to your host's external IP/hostname and includeEXTERNAL://0.0.0.0:9094
inKAFKA_CFG_LISTENERS
to allow for remote connections.KAFKA_CFG_ADVERTISED_LISTENERS:
PLAINTEXT://kafka1:9092,EXTERNAL://localhost:9094
修改为PLAINTEXT://kafka1:9092,EXTERNAL://192.168.60.134:9092
192.168.60.134
为docker宿主机IP,9092
为docker宿主机映射端口(.venv) ronie@ronie:~/PycharmProjects/evilbox$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f2509ff75469 bitnami/kafka:latest "/opt/bitnami/script…" 6 seconds ago Up 6 seconds 9092/tcp, 0.0.0.0:9092->9094/tcp, [::]:9092->9094/tcp kafka0
因为docker的网络拓扑是这样的
graph TD subgraph Docker_Host direction TB br0[Bridge Network: kafka-net] kafka0[Kafka Broker 0] kafka1[Kafka Broker 1] kafka2[Kafka Broker 2] br0 --- kafka0 br0 --- kafka1 br0 --- kafka2 end subgraph External_Network direction TB ext[External Client ] end ext --- br0
Comments | NOTHING