Kafka-Kraft 架构
左图为Kafka 现有架构 元数据在 zookeeper 中 运行时动态选举 controller 由controller 进行 Kafka 集群管理 。 右图为 kraft 模式架构 实验性 不再依赖 zookeeper 集群而是用三台 controller 节点代替 zookeeper 元数据保存在 controller 中 由 controller 直接进行 Kafka 集群管理 。
这样做的好处有以下几个:
- Kafka 不再依赖外部框架,而是能够独立运行;
- controller 管理集群时 不再需要从 zookeeper 中 先读取数据 集群性能上升;
- 由于不依赖 zookeeper 集群扩展时不再受到 zookeeper 读写能力限制;
- controller 不再动态选举 而是由配置文件规定 。 这样我们可以有针对性的加强controller 节点的配置 而不是像以前一样对随机 controller 节 点的高负载束手无策 。
Kafka-Kraft 集群部署
- 注意关闭原来的Kafka集群、ZK集群
安装
- 解压
root@redis01:/usr/local# tar -zxvf kafka_2.13-3.1.0.tgz -C /usr/local/
- 重命名
root@redis01:/usr/local# mv kafka_2.13-3.1.0 kafka2
- 修改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
- 分发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
- 初始化集群数据目录
- 生成存储目录唯一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
- 启动 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
- 创建topic测试
root@redis01:/usr/local/kafka2# bin/kafka-topics.sh --bootstrap-server redis01:9092 --create --topic first --partitions 3 --replication-factor 3
查看
root@redis01:/usr/local/kafka2# bin/kafka-topics.sh --bootstrap-server redis01:9092 --list
- 数据测试
- 生产者发送数据测试
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
- 停止
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