
Kafka是一种消息分发系统,它由Linkedin公司开发并开源,采用Apache-2.0开源协议,现由Apache基金会进行管理。因其高吞吐量、低延迟、可扩展性和可靠性,被广泛用于大规模消息分发和实时流处理场景。目前最新版本为4.0,这与之前在架构方面发生较大的变化,Kafka的4.0版本已完全移除对zookeeper的依赖,转而使用kRaft(Kafka Raft Metadata Mode)来实现集群共识协议和元数据管理。从而简化了Kafka架构的复杂度,因此集群的部署和运维复杂度也显著降低。
与传统 Kafka 的区别kafka native 对比传统依赖JVM的kafka,其区别如下表所示
特性对比:传统 Kafka 与 Kafka Native
特性 | 传统 Kafka | Kafka Native |
---|---|---|
运行环境 | 基于 JVM(Java 虚拟机) | 原生二进制文件(GraalVM 编译) |
启动速度 | 启动较慢(需初始化 JVM) | 启动极快(无需 JVM 初始化) |
资源消耗 | 内存占用高(JVM 开销) | 内存占用低(原生编译消除 JVM 开销) |
性能 | 依赖 JVM 的即时编译(JIT)优化 | AOT 编译直接优化代码路径,减少运行时开销 |
部署方式 | 依赖 JVM 环境(Docker 镜像含 JVM) | 原生二进制文件直接部署,更适合轻量化场景 |
适用场景 | 通用场景(如大数据处理、流式计算) | 微服务、云原生、边缘计算等对资源敏感的场景 |
部署命令
bash
# 拉取镜像
sudo docker pull apache/kafka-native:latest
或者x86
sudo docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/kafka-native:latest
ARM架构的
```bash
sudo docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/linux_arm64_kafka-native:latest
创建容器并运行
sudo docker run -d
-p 9092:9092
--name=kafka
-e CLUSTER_ID=4L6g3nShT-eMCtK--X86sw
-e KAFKA_NODE_ID=1
-e KAFKA_PROCESS_ROLES=broker,controller
-e KAFKA_LISTENERS=CONTROLLER://:29093,PLAINTEXT_HOST://:9092,PLAINTEXT://:19092
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT_HOST://172.16.17.110:9092,PLAINTEXT://kafka:19092
-e KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER
-e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
-e KAFKA_CONTROLLER_QUORUM_VOTERS=1@kafka:29093
-e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
-e KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=1
-e KAFKA_TRANSACTION_STATE_LOG_MIN_ISR=1
-e KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS=0
-e KAFKA_NUM_PARTITIONS=1
registry.cn-hangzhou.aliyuncs.com/qiluo-images/kafka-native:latest
如果你使用docker-compose来管理容器,那么创建docker-compose.yaml文件内容如下:
```bash
services:
kafka:
container_name:kafka
image:registry.cn-hangzhou.aliyuncs.com/qiluo-images/kafka-native:latest
ports:
-"9092:9092"
environment:
-LANG=C.UTF-8
# KRaft settings
# 集群ID,可以自定义任何字符串作为集群ID,同一个集群中所有节点的集群ID必须配置为一样
-CLUSTER_ID=4L6g3nShT-eMCtK--X86sw
-KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
# 节点ID,用于标识每个集群中的节点,需要是不小于1的整数,同一个集群中的节点ID不可重复
-KAFKA_NODE_ID=1
# 节点类型,broker,controller表示该节点是混合节点,通常单机部署时需要配置为混合节点
-KAFKA_PROCESS_ROLES=broker,controller
# 投票节点列表,通常配置为集群中所有的Controller节点,格式为节点id@节点外网地址:节点Controller端口,多个节点使用逗号,隔开
-KAFKA_CONTROLLER_QUORUM_VOTERS=1@kafka:29093
# Listeners
# Kafka的Broker地址前缀名称,固定为PLAINTEXT即可
-KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT
# Kafka的Controller地址前缀名称,固定为CONTROLLER即可
-KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER
# 表示Kafka要监听哪些端口,PLAINTEXT://:9092,CONTROLLER://:9093表示本节点作为混合节点,监听本机所有可用网卡的9092和9093端口,其中9092作为客户端通信端口,9093作为控制器端口
-KAFKA_LISTENERS=CONTROLLER://:29093,PLAINTEXT_HOST://:9092,PLAINTEXT://:19092
# Kafka的外网地址,需要是PLAINTEXT://外网地址:端口的形式,当客户端连接Kafka服务端时,Kafka会将这个外网地址广播给客户端
-KAFKA_ADVERTISED_LISTENERS=PLAINTEXT_HOST://172.16.17.110:9092,PLAINTEXT://kafka:19092
# 主题的副本数,默认为3,单节点时更改为1即可
-KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
# 允许消费者组在首次加入新成员时延迟触发 Rebalance(重新分配分区),默认值为 3000ms(3秒),此处设置为 0ms,表示取消延迟,立即触发 Rebalance
-KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS=0
# 事务日志的最小同步副本数,默认值为 1,此处设置为 1,表示只要有一个副本确认写入,事务即可提交
-KAFKA_TRANSACTION_STATE_LOG_MIN_ISR=1
# 事务日志主题的副本数,默认值为 3,此处设置为 1,表示事务日志只存储在一个副本中
-KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=1
# 共享协调器状态主题的副本数,默认值为 3,此处设置为 1,表示该主题只存储在一个副本中
-KAFKA_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR=1
# 共享协调器状态主题的最小同步副本数,默认值为 1,此处设置为 1,表示只要有一个副本确认写入,操作即可成功
- KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR=1
然后,执行以下命令启动容器
bash
sudo docker-compose -f docker-composer.yaml up -d
检查容器
bash
sudo docker ps
容器创建成功之后,就可以连接测试了,这里推荐一款可视化的连接工具kafka-king,这是一个用go语言实现的kafka ui客户端,开源免费。支持集群、topic、生产者和消费者创建与管理。
kafka-king客户端工具:https://github.com/Bronya0/Kafka-King
kafka-native Dockerhub:https://hub.docker.com/r/apache/kafka-native
Docker国内镜像站:https://docker.aityp.com