下载压缩包
Kafka官网下载地址:http://kafka.apache.org/downloads
点击即可下载
安装前准备工作
- 准备三台虚拟机
- zookeeper集群
- Java环境
搭建Kafka集群(重置)
第一步:解压缩
tar zxvf kafka_2.12-3.4.0.tgz
第二步:创建data目录
mkdir data
第三步:修改配置文件
修改 config 目录下的 server.properties。
vim server.properties
broker.id 是 kafka 节点的唯一标识,这里暂时先不用改。
listeners 这里解除注释,然后写上本服务器的ip,让其他 kafka 节点能够感知到本节点。
log.dirs 改成刚刚创建的data目录路径。
zookeeper.connect 改成zk集群的所有节点,后面加上/kafka,让其在zk的kafka节点上操作。
第四步:把kafka分发到每台服务器
rsync -rc kafka_2.12-3.4.0 root@192.168.59.129:/kafka/
rsync -rc kafka_2.12-3.4.0 root@192.168.59.130:/kafka/
分别修改一下config的server.properties配置文件,只需修改broker.id和listeners即可。
broker.id改成唯一标识。
listeners改成本机ip地址。
Kafka集群脚本
启动的时候需要加一段“source /etc/profile”重新加载环境变量,不然会报一个java环境变量的异常。
#!/bin/bash
case $1 in
"start")
for i in 192.168.59.128 192.168.59.129 192.168.59.130
do
echo "-- Starting $i kafka server --"
sshpass -p "1" ssh $i "source /etc/profile; /kafka/kafka_2.12-3.4.0/bin/kafka-server-start.sh -daemon /kafka/kafka_2.12-3.4.0/config/server.properties"
done
;;
"stop")
for i in 192.168.59.128 192.168.59.129 192.168.59.130
do
echo "-- Stoping $i kafka server --"
sshpass -p "1" ssh $i "/kafka/kafka_2.12-3.4.0/bin/kafka-server-stop.sh"
done
;;
esac
如果jps看不到有kafka的进程,可以到kafka目录下的/logs/kafkaServer.out查看日志。
如果看到类似于如下报错信息:
kafka.common.InconsistentClusterIdException: The Cluster ID 8EemcRWsSLuZJlvD0yVEmw doesn't match stored clusterId Some(THdUEwKFTQiyNzSmy4RWkA) in meta.properties. The broker is trying to join the wrong cluster. Configured zookeeper.connect may be wrong.
at kafka.server.KafkaServer.startup(KafkaServer.scala:234)
at kafka.Kafka$.main(Kafka.scala:115)
at kafka.Kafka.main(Kafka.scala)
原因是之前运行kafka在该目录下创建了一些主题信息(kafka内部会在用户指定目录下存储许多与保证服务正常工作的相关文件),后来清理了zookeeper的数据及日志后,但是没有对kafka-logs目录位置下的数据进行清理,新启的kafka服务The Cluster ID 8EemcRWsSLuZJlvD0yVEmw 与 meta.properties的旧的cluster.id=THdUEwKFTQiyNzSmy4RWkA 匹配不上,所以报错。
解决办法:删除掉data目录下的meta.properties文件。
所以为了确保脚本运行成功,启动kafka前先删掉meta.properties
最终版本的脚本为:
#!/bin/bash
case $1 in
"start")
for i in 192.168.59.128 192.168.59.129 192.168.59.130
do
echo "-- Starting $i kafka server --"
sshpass -p "1" ssh $i "rm -rf /kafka/kafka_2.12-3.4.0/data/meta.properties; source /etc/profile; /kafka/kafka_2.12-3.4.0/bin/kafka-server-start.sh -daemon /kafka/kafka_2.12-3.4.0/config/server.properties"
done
;;
"stop")
for i in 192.168.59.128 192.168.59.129 192.168.59.130
do
echo "-- Stoping $i kafka server --"
sshpass -p "1" ssh $i "/kafka/kafka_2.12-3.4.0/bin/kafka-server-stop.sh"
done
;;
"status")
for i in 192.168.59.128 192.168.59.129 192.168.59.130
do
echo "-- $i kafka status: --"
sshpass -p "1" ssh $i "netstat -nalpt | grep 9092"
done
esac
修改脚本权限
chmod 777 kf.sh
把脚本发到每一台服务器
rsync -rc kf.sh root@192.168.59.129:/kafka/kf.sh
rsync -rc kf.sh root@192.168.59.130:/kafka/kf.sh
kafka脚本测试
启动kafka集群之前,记得先把zookeeper集群先启动好,不然会启动失败!!!
启动集群
查看集群状态
如果能看到9092的状态是ESTABLISHED,LISTEN,证明节点正在正常运行。
如果是TIME_WAIT,或者没有信息,就说明节点没有在运行。
关闭集群
验证kafka集群是否能相互感知
验证的方法非常简单,创建一个topic。
./kafka-topics.sh --bootstrap-server 192.168.59.128:9092 --topic mytopic1 --create --partitions 1 --replication-factor 3
命令中的参数--replication-factor是关键,其作用是指定在多少个节点备份副本。
我这里有3个节点,像这样能够创建成功topic,说明该topic已经在3个节点都有备份副本,证明集群节点之前能够相互感知,kafka集群搭建成功。
如果不成功的话,会报这样一个异常:InvalidReplicationFactorException: Replication factor: 2 larger than available brokers: 0.