背景
假如你是一名以python语言作为编程语言的程序员,
你想使用kafka这个功能强大的消息中间件来处理一些业务逻辑,你自己编写业务处理逻辑代码,比如生产环节,消费环节等.
因为你是使用python语言的, 所以你可能会用到confluent-kafka-python(基于C库librdkafka的高性能客户端client), 或者是kafka-python(纯Python实现的客户端client)
该库包的安装方式是 pip install kafka-python, 而不是pip install kafka),
但是不管你用的是哪一个库包, 它们都仅仅是一个客户端库,它本身不包含Kafka服务端的实现逻辑。
也就是说, 如果你仅仅使用kafka-python这个客户端, 你并不能把消息发送到kafka中, 因为没有地方来承接这个消息.
所以, 你还是需要有一个Kafka服务端, 并且启动该服务, 来接收生产者发送的消息并传递给消费者。
也就是说, 你需要在本地搭建kafka环境, 并且把kafka服务启动起来.
1/kafka服务本地安装
4.0.0版本以上的kafka, 不再依赖zookeeper,用的是kraft
因为你是通过网页下载的, 所以下载完之后, 应该是在电脑的Downloads目录下.
此时你可以把下载下来的kafka目录, 移动到你的家目录下, 或者其他的目录下.
然后再通过tar -zxvf 命令进行解压.
然后再把kafka/bin添加到环境变量(注意绝对路径), 比如是macos电脑, 就是.zshrc文件.
export KAFKA_HOME=~/kafka
export PATH:$KAFKA_HOME/bin:$PATH
2/kafka服务启动
把以下内容, 添加到kafka目录下的config目录下的server.properties文件的最后:
node.id=1
controller.quorum.voters=1@localhost:9093
listeners=PLAINTEXT://:9092,CONTROLLER://:9093
advertised.listeners=PLAINTEXT://localhost:9092
注意修改该配置文件(server.properties)中的log.dirs参数, 一般来说, log.dirs=/tmp/kafka-logs
把以下内容, 添加到/tmp/kafka-logs/meta.properties中(若没有该文件, 则手动创建, 该文件的权限是644)
cluster.id=your-cluster-id #可以用bin/kafka-storage.sh random-uuid命令来生成.
version=1
node.id=1 # 必须与 server.properties 中的 node.id 一致
kafka-server-start.sh ../config/server.properties
最后,kafka服务启动成功!!!
3/创建topic:
kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic topic_11_test
4/停止kafka服务:
kafka-server-stop.sh
在 Kafka 4.0.0(使用 KRaft 模式,不依赖 ZooKeeper)的单机 macOS 部署中,以下是 server.properties 的关键配置参数及说明:
核心必填参数
# ========== 节点基础配置 ==========
# 节点角色(同时作为控制器和代理)
process.roles=controller,broker
# 节点唯一ID(单机部署建议设为1)
node.id=1
# 监听地址(控制器和代理使用不同端口)
listeners=CONTROLLER://:19092,PLAINTEXT://:9092
# 控制器监听器名称(必须与listeners中的CONTROLLER对应)
controller.listener.names=CONTROLLER
# ========== 集群配置 ==========
# 投票成员列表(单节点配置)
controller.quorum.voters=1@localhost:19092
# ========== 存储配置 ==========
# 数据存储目录(需确保目录存在且有权限)
log.dirs=/tmp/kraft-logs
完整推荐配置
# 基础节点配置
process.roles=controller,broker
node.id=1
listeners=CONTROLLER://:19092,PLAINTEXT://:9092
controller.listener.names=CONTROLLER
advertised.listeners=PLAINTEXT://localhost:9092
# 集群配置
controller.quorum.voters=1@localhost:19092
# 存储配置
log.dirs=/tmp/kraft-logs
# 开发环境优化
num.partitions=1 # 默认分区数
default.replication.factor=1 # 单副本模式
min.insync.replicas=1 # 最小同步副本数
offsets.topic.replication.factor=1 # __consumer_offsets 副本数
transaction.state.log.replication.factor=1
# 日志管理(可选)
log.retention.hours=168 # 日志保留7天
log.segment.bytes=1073741824 # 日志段大小1GB
关键参数说明
-
process.rolescontroller,broker:单节点需同时承担两个角色
-
listenersCONTROLLER://:19092:控制器通信端口PLAINTEXT://:9092:客户端通信端口
-
controller.quorum.voters- 格式:
节点ID@主机:端口 - 单机示例:
1@localhost:19092
- 格式:
-
advertised.listeners- 客户端连接时使用的地址(必须设为
localhost:9092)
- 客户端连接时使用的地址(必须设为
-
log.dirs- 建议改为持久化路径(如
~/kafka-data) /tmp目录在重启时会被清空
- 建议改为持久化路径(如
启动步骤
-
生成集群ID
bin/kafka-storage.sh random-uuid # 输出示例:jx9Z3dM5QZ6XJ7jKv0JgUw -
格式化存储目录
bin/kafka-storage.sh format \ -t <上一步生成的UUID> \ -c config/server.properties -
启动Kafka
bin/kafka-server-start.sh config/server.properties -
验证服务
# 创建Topic bin/kafka-topics.sh --create \ --topic test \ --bootstrap-server localhost:9092 \ --partitions 1 \ --replication-factor 1 # 生产消息 bin/kafka-console-producer.sh \ --topic test \ --bootstrap-server localhost:9092 # 消费消息 bin/kafka-console-consumer.sh \ --topic test \ --from-beginning \ --bootstrap-server localhost:9092
故障排查
-
端口冲突
- 确保
19092(控制器)和9092(代理)端口空闲
lsof -i :19092 lsof -i :9092 - 确保
-
目录权限问题
# 若使用自定义目录 mkdir -p ~/kafka-data chmod 755 ~/kafka-data -
格式化错误
- 如果启动失败,删除
log.dirs目录内容后重新执行格式化和启动
- 如果启动失败,删除
-
无法连接
- 检查
advertised.listeners是否设置为PLAINTEXT://localhost:9092
- 检查
通过此配置,您可以在单机 macOS 上运行无 ZooKeeper 的 Kafka 4.0.0 服务,适合本地开发和测试。