shell脚本实现kafka相关操作
配置环境变量:
#配置zookeeper和kafka安装目录
export ZOOKEEPER_HOME=/opt/apache-zookeeper-3.6.2-bin
export KAFKA_HOME=/opt/kafka_2.12-2.7.0
source /etc/profile
脚本名称k_start.sh
./k_start.sh start:启动kafka
./k_start.sh stop:关闭kafka
./k_start.sh create test p1 r1:创建topic
./k_start.sh list:查询topic列表
./k_start.sh send test :向指定topic发送消息
zookeeper="${ZOOKEEPER_HOME}/bin/zkServer.sh"
kafka="${KAFKA_HOME}/bin/"
kafka_conf="$KAFKA_HOME/config/server.properties"
#printf "%s\n" "zookeeper file dir: ${zookeeper}"
#printf "%s\n" "kafka file dir: ${kafka}"
case $1 in
start)#启动
#启动zookeeper
#判断zookeeper是否启动
if [[ $(pgrep -f "zookeeper*"|wc -l) -gt 0 ]];then
#zookeeper已启动,直接启动kafka
printf "%s\n" "zookeeper已启动!"
#判断kafka是否已启动
if [[ $(pgrep -f "kafka*"|wc -l) -gt 0 ]];then
#kafka已启动
printf "%s\n" "kafka已启动!"
else
#启动kafka
cd ${kafka}
nohup ./kafka-server-start.sh ${kafka_conf} &
sleep 8
printf "%s\n" $(pgrep -f "kafka*"|wc -l)
if [[ $(pgrep -f "kafka*"|wc -l) -gt 0 ]];then
printf "%s\n" "kafka启动成功!"
else
printf "%s\n" "kafka启动失败!"
fi
fi
else
#启动zookeeper
results=`. ${zookeeper} start 2>&1`
#printf "%s\n" "${results}"
if [[ $(echo ${results} | grep "STARTED") != "" ]];then
#zookeeper启动成功,启动kafka
printf "%s\n" "zookeeper启动成功!"
#启动kafka...
cd ${kafka}
nohup ./kafka-server-start.sh ${kafka_conf} &
sleep 8
if [[ $(pgrep -f "kafka*"|wc -l) -gt 0 ]];then
printf "%s\n" "kafka启动成功!"
else
printf "%s\n" "kafka启动失败!"
fi
else
printf "%s\n" "zookeeper启动失败!"
printf "%s\n" "${results}"
fi
fi
;;
stop)#终止
#判断kafka是否启动
if [[ $(pgrep -f "kafka*"|wc -l) -gt 0 ]];then
#kafka已启动,关闭kafka
cd ${kafka}
nohup ./kafka-server-stop.sh ${kafka_conf} &
sleep 5
#判断kafka是否关闭
if [[ $(pgrep -f "kafka*"|wc -l) -eq 0 ]];then
#kafka关闭成功
printf "%s\n" "kafka关闭成功!"
#判断zookeeper是否启动
if [[ $(pgrep -f "zookeeper*"|wc -l) -gt 0 ]];then
#zookeeper已启动,关闭zookeeper
close_results=`. ${zookeeper} stop 2>&1`
#判断zookeeper是否关闭成功
if [[ $(echo ${close_results}|grep "STOPPED") != "" ]];then
#zookeeper关闭成功
printf "%s\n" "zookeeper关闭成功!"
else
printf "%s\n" "zookeeper关闭失败!"
printf "%s\n" "${close_results}"
fi
else
#zookeeper未启动
printf "%s\n" "zookeeper未启动!"
fi
else
printf "%s\n" "kafka关闭失败!"
fi
else
#kafka未启动,判断zookeeper是否已启动
printf "%s\n" "kafka未启动!"
if [[ $(pgrep -f "zookeeper*"|wc -l) -gt 0 ]];then
#zookeeper已启动,关闭zookeeper
close_results=`. ${zookeeper} stop 2>&1`
#判断zookeeper是否关闭成功
if [[ $(echo ${close_results}|grep "STOPPED") != "" ]];then
#关闭成功
printf "%s\n" "zookeeper关闭成功!"
else
#关闭失败
printf "%s\n" "zookeeper关闭失败!"
printf "%s\n" "${close_results}"
fi
else
#zookeeper未启动
printf "%s\n" "zookeeper未启动!"
fi
fi
;;
create)#创建topic
if [[ $(pgrep -f "kafka*"|wc -l) -gt 0 ]];then
topic_name=$2
a=$3
a1=${a:1}
partitions=${a1:-1}
b=$4
b1=${b:1}
replication=${b1:-1}
cd "${kafka}"
topic_created=$(./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor ${replication} --partitions ${partitions} --topic ${topic_name} 2>&1)
printf "%s\n" "${topic_created}"
else
printf "%s\n" "kafka未启动!"
fi
;;
list)#查看topic列表
#判断kafka是否启动,没启动直接返回
if [[ $(pgrep -f "kafka*"|wc -l) -gt 0 ]];then
cd "${kafka}"
topic_list=$(./kafka-topics.sh --list --zookeeper localhost:2181 2>$1)
printf "%s\n" "topic列表如下:"
printf "%s\n" "${topic_list}"
else
printf "%s\n" "kafka未启动!"
fi
;;
send)#发送kafka消息
if [[ $(pgrep -f "kafka*"|wc -l) -gt 0 ]];then
topic_name=$2
cd "${kafka}"
topic_list=$(./kafka-topics.sh --list --zookeeper localhost:2181 2>$1)
#判断topic是否存在
if [[ $(echo ${topic_list}|grep ${topic_name}) != "" ]];then
#存在,发送消息到指定kafka
./kafka-console-producer.sh --broker-list localhost:9092 --topic ${topic_name}
else
flag=0
while (( ${flag} == 0 ))
do
#不存在,询问是否创建对应topic,是则创建
read -p "topic 不存在,是否创建该名称topic[y/n]:" res
case $res in
y | Y)
flag=1
read -p "请输入分区数以及副本数/以空格分隔:" p r
partitions=$p
replication=$r
cd "${kafka}"
topic_created=$(./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor ${replication} --partitions ${partitions} --topic ${topic_name} 2>&1)
printf "%s\n" "${topic_created}"
;;
n | N)
flag=1
;;
*)
printf "%s\n" "输入不合法!"
;;
esac
done
fi
else
printf "%s\n" "kafka未启动!"
fi
;;
*)#无匹配项
printf "%s\n" "无匹配项,请携带入参"
printf "%s\n" "start:启动kafka"
printf "%s\n" "stop:关闭kafka"
printf "%s\n" "create [topic名称] [p..] [r..]:创建topic p:分区数例如 p1为1个分区 r:分区副本例如 r1为1个副本"
printf "%s\n" "list [topic名称]:查询kafka列表"
printf "%s\n" "send [topic名称]:发送kafka消息"
;;
esac