[消息中间件]kafka(单机模式+启动)

232 阅读4分钟

背景

假如你是一名以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服务本地安装

官网:kafka.apache.org/downloads

4.0.0版本以上的kafka, 不再依赖zookeeper,用的是kraft

图片.png

因为你是通过网页下载的, 所以下载完之后, 应该是在电脑的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

关键参数说明

  1. process.roles

    • controller,broker:单节点需同时承担两个角色
  2. listeners

    • CONTROLLER://:19092:控制器通信端口
    • PLAINTEXT://:9092:客户端通信端口
  3. controller.quorum.voters

    • 格式:节点ID@主机:端口
    • 单机示例:1@localhost:19092
  4. advertised.listeners

    • 客户端连接时使用的地址(必须设为 localhost:9092
  5. log.dirs

    • 建议改为持久化路径(如 ~/kafka-data
    • /tmp 目录在重启时会被清空

启动步骤

  1. 生成集群ID

    bin/kafka-storage.sh random-uuid
    # 输出示例:jx9Z3dM5QZ6XJ7jKv0JgUw
    
  2. 格式化存储目录

    bin/kafka-storage.sh format \
      -t <上一步生成的UUID> \
      -c config/server.properties
    
  3. 启动Kafka

    bin/kafka-server-start.sh config/server.properties
    
  4. 验证服务

    # 创建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
    

故障排查

  1. 端口冲突

    • 确保 19092(控制器)和 9092(代理)端口空闲
    lsof -i :19092
    lsof -i :9092
    
  2. 目录权限问题

    # 若使用自定义目录
    mkdir -p ~/kafka-data
    chmod 755 ~/kafka-data
    
  3. 格式化错误

    • 如果启动失败,删除 log.dirs 目录内容后重新执行格式化和启动
  4. 无法连接

    • 检查 advertised.listeners 是否设置为 PLAINTEXT://localhost:9092

通过此配置,您可以在单机 macOS 上运行无 ZooKeeper 的 Kafka 4.0.0 服务,适合本地开发和测试。