如上图所示,左侧的图片是Kafka现有架构,元数据存储在zookeeper中,运行时动态选举controller,由Controller进行Kafka集群管理。右图是Kraft模式(目前仍在实验性阶段),不再依赖zookeeper集群,而是用三台controller节点代替zookeeper,元数据保存在zookeeper中,由controller直接进行kafka集群管理。
这样做是由很多好处的:
- Kafka不再依赖外部框架,就能独立运行
- controller管理集群,不再需要从zookeeper中先读取数据,集群性能会提高
- 由于不依赖zookeeper,集群扩展时不再受到zookeeper读写能力限制
- controller不再动态选举,而是由配置文件规定。这样就可以有针对性地加强controller节点地配置,而不是像以前一样对随机controller节点地高负载束手无策
在开始集群先关掉kafka:
[wzq@hadoop102 ~]$ kf.sh stop
[wzq@hadoop102 ~]$ zk.sh stop
[wzq@hadoop102 ~]$ jpsall
=============== hadoop102 ===============
5395 Jps
=============== hadoop103 ===============
5484 Jps
=============== hadoop104 ===============
5515 Jps
新解压一份kafka:
[wzq@hadoop102 ~]$ cd /opt/software/
[wzq@hadoop102 software]$ ll | grep kafka
-rw-r--r--. 1 wzq wzq 86486610 3月 31 19:11 kafka_2.12-3.0.0.tgz
drwxrwxr-x. 2 wzq wzq 39 10月 13 00:00 kafka-eagle-bin-2.0.8
-rw-r--r--. 1 wzq wzq 81074069 2月 9 15:23 kafka-eagle-bin-2.0.8.tar.gz
[wzq@hadoop102 software]$ tar -zxvf kafka_2.12-3.0.0.tgz -C /opt/module/
为新解压的kafka更名:
[wzq@hadoop102 software]$ cd /opt/module/
[wzq@hadoop102 module]$ ll | grep kafka
drwxr-xr-x. 7 wzq wzq 105 9月 9 2021 kafka_2.12-3.0.0
drwxr-xr-x. 9 wzq wzq 196 4月 2 23:06 kafka-3.0.0
[wzq@hadoop102 module]$ mv kafka_2.12-3.0.0/ kafka-kraft
进入到这个目录,然后修改kraft对应的配置文件:
[wzq@hadoop102 kafka-kraft]$ vim config/kraft/server.properties
修改以下内容:
# node.id全局位唯一,这里配置hadoop102为2,hadoop103为3,hadoop104为4
node.id=2
# 配置controller选举,把三台主机都写上,注意前面的234对应node.id
controller.quorum.voters=2@hadoop102:9093,3@hadoop103:9093,4@hadoop104:9093
# 对外暴露的端口号,这里修改localhost为当前主机名
advertised.listeners=PLAINTEXT://hadoop102:9092
# 修改日志存储位置
log.dirs=/opt/module/kafka-kraft/data
分发:
[wzq@hadoop102 module]$ xsync kafka-kraft/
分发完毕之后,到hadoop103和104修改配置的node.id和对外暴露的地址:
[wzq@hadoop103 ~]$ cd /opt/module/kafka-kraft/
[wzq@hadoop103 kafka-kraft]$ vim config/kraft/server.properties
# 在Hadoop103修改这个
node.id=3
advertised.listeners=PLAINTEXT://hadoop103:9092
# 同理在Hadoop104也修改一下
[wzq@hadoop104 ~]$ cd /opt/module/kafka-kraft/
[wzq@hadoop104 kafka-kraft]$ vim config/kraft/server.properties
node.id=4
advertised.listeners=PLAINTEXT://hadoop104:9092
改完之后就可以启动集群了,回到Hadoop102主机,首先进行初始化
先生产一个UUID,存储目录的唯一id:
[wzq@hadoop102 kafka-kraft]$ bin/kafka-storage.sh random-uuid
zECZhe_CRP2bEYnCYX6O_w
用该UUID格式化kafka存储目录,在三台节点上都要初始化一下:
[wzq@hadoop102 kafka-kraft]$ bin/kafka-storage.sh format -t zECZhe_CRP2bEYnCYX6O_w -c /opt/module/kafka-kraft/config/kraft/server.properties
[wzq@hadoop103 kafka-kraft]$ bin/kafka-storage.sh format -t zECZhe_CRP2bEYnCYX6O_w -c /opt/module/kafka-kraft/config/kraft/server.properties
[wzq@hadoop104 kafka-kraft]$ bin/kafka-storage.sh format -t zECZhe_CRP2bEYnCYX6O_w -c /opt/module/kafka-kraft/config/kraft/server.properties
然后就可以启动kafka了:
[wzq@hadoop102 kafka-kraft]$ bin/kafka-server-start.sh -daemon config/kraft/server.properties
[wzq@hadoop103 kafka-kraft]$ bin/kafka-server-start.sh -daemon config/kraft/server.properties
[wzq@hadoop104 kafka-kraft]$ bin/kafka-server-start.sh -daemon config/kraft/server.properties
停止Kafka:
[wzq@hadoop102 kafka-kraft]$ bin/kafka-server-stop.sh
[wzq@hadoop103 kafka-kraft]$ bin/kafka-server-stop.sh
[wzq@hadoop104 kafka-kraft]$ bin/kafka-server-stop.sh
ok,这样就算部署成功啦
为了方便同意启动停止kafka-kraft,可以编写一个脚本:
来到家目录,新建一个shell脚本:
[wzq@hadoop102 bin]$ pwd
/home/wzq/bin
[wzq@hadoop102 bin]$ vim kf2.sh
填入以下内容:
#! /bin/bash
case $1 in
"start"){
for i in hadoop102 hadoop103 hadoop104
do
echo "---------启动 $i Kafka-Kraft---------"
ssh $i "/opt/module/kafka-kraft/bin/kafka-server-start.sh -daemon /opt/module/kafka-kraft/config/kraft/server.properties"
done
};;
"stop"){
for i in hadoop102 hadoop103 hadoop104
do
echo "---------停止 $i Kafka-Kraft---------"
ssh $i "/opt/module/kafka-kraft/bin/kafka-server-stop.sh"
done
};;
esac
使该文件具有可执行权限:
[wzq@hadoop102 bin]$ chmod +x kf2.sh
测试一下:
# 启动
[wzq@hadoop102 bin]$ kf2.sh start
---------启动 hadoop102 Kafka-Kraft---------
---------启动 hadoop103 Kafka-Kraft---------
---------启动 hadoop104 Kafka-Kraft---------
[wzq@hadoop102 bin]$ jpsall
=============== hadoop102 ===============
7321 Kafka
7401 Jps
=============== hadoop103 ===============
7079 Jps
7003 Kafka
=============== hadoop104 ===============
7108 Jps
7032 Kafka
# 停止,停止的过程有点慢,稍微等一下再看j
[wzq@hadoop102 bin]$ kf2.sh stop
---------停止 hadoop102 Kafka-Kraft---------
---------停止 hadoop103 Kafka-Kraft---------
---------停止 hadoop104 Kafka-Kraft---------
[wzq@hadoop102 bin]$ jpsall
=============== hadoop102 ===============
7494 Jps
=============== hadoop103 ===============
7173 Jps
=============== hadoop104 ===============
7201 Jps