Kafka的Kraft模式简单来说就是基于raft协议重新实现了zookeeper的功能。传统的zookeeper集群已经被标记为弃用,将在kafka4.0中完全移除。由于去掉了zk组件,部署也简化了不少。我们基于Kraft模式和Docker Compose同时采用最新版Kafka v3.6.1来搭建集群。
Kraft模式集群由两种角色的节点组成,分别是broker和controller角色。角色类型在节点启动时通过process.roles
配置参数指定,允许指定broker
或controller
,或者同时指定二者,可就是一个节点兼顾两种角色。
Kafka集群带来的好处是允许横向扩展broker节点,并且在线就可以完成扩展。
我们在宿主机上搭建5个节点的Kafka集群,集群由两个[broker]节点,两个[broker,controller]节点和一个[controller]节点组成,并且使用Docker容器来部署这五个节点。
我们规划了三种流量路径:
kafka: 3.6.1
docker: 25.0.1
docker compose: v2.24.2
如果你的Docker环境已经备好,那么直接将下面的内容复制到yaml,稍作修改就能快速搭建起Kafka集群。
# docker-compose.yaml
services:
kafka1:
image: 'bitnami/kafka:3.6.1'
ports:
- '19092:19092'
environment:
- KAFKA_KRAFT_CLUSTER_ID=EX5bq5NfRe2IX1nhxrSO6g
- KAFKA_CFG_NODE_ID=1
- KAFKA_CFG_PROCESS_ROLES=broker
- KAFKA_CFG_LISTENERS=INTERNAL://:9092, EXTERNAL://:19092
- KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://kafka1:9092, EXTERNAL://192.168.56.103:19092
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT, EXTERNAL:PLAINTEXT, CONTROLLER:PLAINTEXT
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=3@kafka3:9093, 4@kafka4:9093, 5@kafka5:9093
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
networks:
- kfk-network
kafka2:
image: 'bitnami/kafka:3.6.1'
ports:
- '29092:19092'
environment:
- KAFKA_KRAFT_CLUSTER_ID=EX5bq5NfRe2IX1nhxrSO6g
- KAFKA_CFG_NODE_ID=2
- KAFKA_CFG_PROCESS_ROLES=broker
- KAFKA_CFG_LISTENERS=INTERNAL://:9092, EXTERNAL://:19092
- KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://kafka2:9092, EXTERNAL://192.168.56.103:29092
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT, EXTERNAL:PLAINTEXT, CONTROLLER:PLAINTEXT
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=3@kafka3:9093, 4@kafka4:9093, 5@kafka5:9093
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
networks:
- kfk-network
kafka3:
image: 'bitnami/kafka:3.6.1'
ports:
- '39092:19092'
environment:
- KAFKA_KRAFT_CLUSTER_ID=EX5bq5NfRe2IX1nhxrSO6g
- KAFKA_CFG_NODE_ID=3
- KAFKA_CFG_PROCESS_ROLES=broker,controller
- KAFKA_CFG_LISTENERS=INTERNAL://:9092, EXTERNAL://:19092, CONTROLLER://:9093
- KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://kafka3:9092, EXTERNAL://192.168.56.103:39092
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT, EXTERNAL:PLAINTEXT, CONTROLLER:PLAINTEXT
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=3@kafka3:9093, 4@kafka4:9093, 5@kafka5:9093
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
networks:
- kfk-network
kafka4:
image: 'bitnami/kafka:3.6.1'
ports:
- '49092:19092'
environment:
- KAFKA_KRAFT_CLUSTER_ID=EX5bq5NfRe2IX1nhxrSO6g
- KAFKA_CFG_NODE_ID=4
- KAFKA_CFG_PROCESS_ROLES=broker,controller
- KAFKA_CFG_LISTENERS=INTERNAL://:9092, EXTERNAL://:19092, CONTROLLER://:9093
- KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://kafka4:9092, EXTERNAL://192.168.56.103:49092
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT, EXTERNAL:PLAINTEXT, CONTROLLER:PLAINTEXT
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=3@kafka3:9093, 4@kafka4:9093, 5@kafka5:9093
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
networks:
- kfk-network
kafka5:
image: 'bitnami/kafka:3.6.1'
ports:
- '59092:19092'
environment:
- KAFKA_KRAFT_CLUSTER_ID=EX5bq5NfRe2IX1nhxrSO6g
- KAFKA_CFG_NODE_ID=5
- KAFKA_CFG_PROCESS_ROLES=controller
- KAFKA_CFG_LISTENERS=CONTROLLER://:9093
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT, EXTERNAL:PLAINTEXT, CONTROLLER:PLAINTEXT
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=3@kafka3:9093, 4@kafka4:9093, 5@kafka5:9093
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
networks:
- kfk-network
networks:
kfk-network:
name: kfk-network
external: true
我这边宿主机IP是192.168.56.103,你需要将它改为你IP地址,执行下面指令应该就能启动成功:
# 创建网络
docker network create kfk-network
# 拉取镜像
docker compose pull
# 运行容器
docker compose up -d
如果你的运行过程中遇到问题可以欢迎留言讨论。
我们不但要把集群运行起来,还要理解这些参数的含义。上面的compose文件中使用环境变量作为启动参数传递给Kafka,与直接修改配置文件效果一样。在Kraft模式下,Kafka有如下三个配置文件可以配置。
config/kraft/broker.properties
当节点作为[broker]角色运行时,会去读该文件中的配置项启动。config/kraft/controller.properties
当节点作为[controller]角色运行时,会去读该文件中的配置项启动。config/kraft/server.properties
当节点同时作为[broker, controller]角色运行时,会去读该文件中的配置项启动。接下来我们来看看这些文件内常用的配置项:
meta.properties
中,位置不固定,具体位置由bin/kafka-storage.sh
命令执行完打印的参数决定。该配置文件中定义了cluster.id
,即同一个集群中的所有节点都应该指定相同的集群ID。broker
或controller
,或者同时指定二者,可就是一个节点兼顾两种角色。{LISTENER_NAME}://{hostname}:{port}
,要搞懂它的配置策略你可以阅读一文搞懂Kafka中的listeners配置策略由上面这些配置可以看出,凡是以KAFKA_CFG_
开头的环境变量,在配置kraft配置文件中都有对应的配置项。例如KAFKA_CFG_NODE_ID
在配置文件中就是node.id
。
# 创建主题
bin/kafka-topics.sh --create --topic test-tip --bootstrap-server=192.168.56.103:19092
# 往cssyy主题推送消息
bin/kafka-console-producer.sh --bootstrap-server=192.168.56.103:19092 --topic cssyy
>程序饲养员放假啦
>程序饲养员上班啦
# 从头开始消费cssyy主题消息
bin/kafka-console-consumer.sh --bootstrap-server=192.168.56.103:19092 --topic cssyy --from-beginning
程序饲养员放假啦
程序饲养员上班啦
# 查看集群信息
bin/kafka-metadata-quorum.sh --bootstrap-server 192.168.56.103:19092:19092 desbe --status
ClusterId: EX5bq5NfRe2IX1nhxrSO6g
LeaderId: 4
LeaderEpoch: 1
HighWatermark: 2817
MaxFollowerLag: 0
MaxFollowerLagTimeMs: 341
CurrentVoters: [3,4,5]
CurrentObservers: [1,2]
# 查看节点复制信息
bin/kafka-metadata-quorum.sh --bootstrap-server 192.168.56.103:19092:19092 describe --replication
NodeId LogEndOffset Lag LastFetchTimestamp LastCaughtUpTimestamp Status
4 2959 0 1706702371530 1706702371530 Leader
3 2959 0 1706702371114 1706702371114 Follower
5 2959 0 1706702371114 1706702371114 Follower
1 2959 0 1706702371112 1706702371112 Observer
2 2959 0 1706702371113 1706702371113 Observer
最好的办法是有个图形化的工具来查看这些信息,Kafka免费的工具实在没有好用的,也就是Offset Explorer还勉强能用,如果你有更好用的工具可以分享一下。