Kafka39:kafka-Kraft模式

Kafka39:kafka-Kraft模式

Kafka-Kraft 架构

notion image
 
左图为Kafka 现有架构 元数据在 zookeeper 中 运行时动态选举 controller 由controller 进行 Kafka 集群管理 。 右图为 kraft 模式架构 实验性 不再依赖 zookeeper 集群而是用三台 controller 节点代替 zookeeper 元数据保存在 controller 中 由 controller 直接进行 Kafka 集群管理 。
 
这样做的好处有以下几个:
  • Kafka 不再依赖外部框架,而是能够独立运行;
  • controller 管理集群时 不再需要从 zookeeper 中 先读取数据 集群性能上升;
  • 由于不依赖 zookeeper 集群扩展时不再受到 zookeeper 读写能力限制;
  • controller 不再动态选举 而是由配置文件规定 。 这样我们可以有针对性的加强controller 节点的配置 而不是像以前一样对随机 controller 节 点的高负载束手无策 。

Kafka-Kraft 集群部署

  • 注意关闭原来的Kafka集群、ZK集群

安装

  1. 解压
root@redis01:/usr/local# tar -zxvf kafka_2.13-3.1.0.tgz -C /usr/local/
  1. 重命名
root@redis01:/usr/local# mv kafka_2.13-3.1.0 kafka2
  1. 修改redis01上的/usr/local/kafka2/config/kraft/server.properties 配置文件
      • 注意:以前使用zookeeper时配置的是/usr/local/kafka/config/server.properties
      • 现在采用/usr/local/kafka2/config/kraft/server.properties ,配置的是kraft目录下的server.properties
root@redis01:/usr/local# vim /usr/local/kafka2/config/kraft/server.properties
  • 修改如下四个参数
    • node.id
    • controller.quorum.voters
    • advertised.listeners
    • log.dirs
# The node id associated with this instance's roles node.id=2 # The connect string for the controller quorum controller.quorum.voters=2@redis01:9093,3@redis02:9093,4@redis03:9093 # returned from java.net.InetAddress.getCanonicalHostName(). advertised.listeners=PLAINTEXT://redis01:9092 # A comma separated list of directories under which to store log files log.dirs=/usr/local/kafka2/data
  1. 分发kafka2到redis02、redis03机器
root@redis01:/usr/local# xsync kafka2/
  • 在redis02机器修改
vim /usr/local/kafka2/config/kraft/server.properties
# The node id associated with this instance's roles node.id=3 # returned from java.net.InetAddress.getCanonicalHostName(). advertised.listeners=PLAINTEXT://redis02:9092
  • 在redis03机器修改
vim /usr/local/kafka2/config/kraft/server.properties
# The node id associated with this instance's roles node.id=4 # returned from java.net.InetAddress.getCanonicalHostName(). advertised.listeners=PLAINTEXT://redis03:9092
  1. 初始化集群数据目录
  • 生成存储目录唯一ID
root@redis01:/usr/local/kafka2# bin/kafka-storage.sh random-uuid kbUb-pw-TuKsBTM2fRLHBw
  • 用该 ID 格式化 kafka 存储目录三台节点
# redis01 root@redis01:/usr/local/kafka2# bin/kafka-storage.sh format -t kbUb-pw-TuKsBTM2fRLHBw -c /usr/local/kafka2/config/kraft/server.properties # redis02 root@redis02:/usr/local/kafka2# bin/kafka-storage.sh format -t kbUb-pw-TuKsBTM2fRLHBw -c /usr/local/kafka2/config/kraft/server.properties # redis03 root@redis03:/usr/local/kafka2# bin/kafka-storage.sh format -t kbUb-pw-TuKsBTM2fRLHBw -c /usr/local/kafka2/config/kraft/server.properties
notion image
  1. 启动 kafka 集群
root@redis01:/usr/local/kafka2# bin/kafka-server-start.sh -daemon config/kraft/server.properties root@redis02:/usr/local/kafka2# bin/kafka-server-start.sh -daemon config/kraft/server.properties root@redis03:/usr/local/kafka2# bin/kafka-server-start.sh -daemon config/kraft/server.properties
notion image
  1. 创建topic测试
root@redis01:/usr/local/kafka2# bin/kafka-topics.sh --bootstrap-server redis01:9092 --create --topic first --partitions 3 --replication-factor 3
notion image
查看
root@redis01:/usr/local/kafka2# bin/kafka-topics.sh --bootstrap-server redis01:9092 --list
notion image
 
 
  1. 数据测试
  • 生产者发送数据测试
root@redis01:/usr/local/kafka2# bin/kafka-console-producer.sh --bootstrap-server redis01:9092 --topic first
  • 消费者接收数据测试
root@redis02:/usr/local/kafka2# bin/kafka-console-consumer.sh --bootstrap-server redis01:9092 --topic first
notion image
notion image
 
 
  1. 停止
root@redis01:/usr/local/kafka2# bin/kafka-server-stop.sh root@redis02:/usr/local/kafka2# bin/kafka-server-stop.sh root@redis03:/usr/local/kafka2# bin/kafka-server-stop.sh
 
 

集群脚本

创建脚本

# 在目录下创建脚本 root@redis01:# cd /home/bigdata/bin/ root@redis01:/home/bigdata/bin# vim kf2.sh
  • kf2.sh
#!/bin/bash case $1 in "start"){ for i in redis01 redis02 redis03 do echo ------------ kafka2 $i 启动 ---------- ssh $i "/usr/local/kafka2/bin/kafka-server-start.sh -daemon /usr/local/kafka2/config/kraft/server.properties" done };; "stop"){ for i in redis01 redis02 redis03 do echo ------------ kafka2 $i 停止 ---------- ssh $i "/usr/local/kafka2/bin/kafka-server-stop.sh" done };; esac

赋予权限

# 赋予权限 root@redis01:/home/bigdata/bin# chmod 777 kf2.sh

使用脚本

# 开启kafka集群 root@redis01:/home/bigdata/bin# ./kf2.sh start # 停止kafka集群 root@redis01:/home/bigdata/bin# ./kf2.sh stop # 任意位置启动、停止 /home/bigdata/bin/kf2.sh start /home/bigdata/bin/kf2.sh stop