最近在项目中碰到Kafka自己关闭的事件,为保证Kafka的高效可用,因此考虑使用Shell加系统定时任务检查,保证服务的高可用
检查Zookeeper
bash
#!/bin/bash
# 配置参数
TARGET_PORT=2181 # 监控端口
SERVICE_NAME="zookeeper" # 服务名称(用于日志记录)
CHECK_INTERVAL=5 # 检测间隔(秒)
LOG_FILE="/data/public/kafka/check.log"
# 获取当前时间戳
timestamp() {
date "+%Y-%m-%d %H:%M:%S"
}
# 检查端口状态(推荐方法)
check_port() {
# 使用ss命令检测(兼容性更好)
sudo ss -tuln | grep -q ":${TARGET_PORT}"
return $?
}
# 重启服务函数
restart_service() {
echo "[$(timestamp)] 检测到端口 ${TARGET_PORT} 异常,尝试重启 ${SERVICE_NAME}..." >> $LOG_FILE
nohup /data/public/kafka/kafka_2.13-2.5.1/bin/zookeeper-server-start.sh /data/public/kafka/kafka_2.13-2.5.1/config/zookeeper.properties > /dev/null 2>&1 &
}
# 主监控逻辑
main() {
if ! check_port; then
restart_service
else
echo "[$(timestamp)] 端口 ${TARGET_PORT} 正常" >> $LOG_FILE
fi
}
# 执行主函数
main
检查Kafka
bash
#!/bin/bash
# 配置参数
TARGET_PORT=9092 # 监控端口
SERVICE_NAME="kafka" # 服务名称(用于日志记录)
CHECK_INTERVAL=5 # 检测间隔(秒)
LOG_FILE="/data/public/kafka/check.log"
# 获取当前时间戳
timestamp() {
date "+%Y-%m-%d %H:%M:%S"
}
# 检查端口状态(推荐方法)
check_port() {
# 使用ss命令检测(兼容性更好)
sudo ss -tuln | grep -q ":${TARGET_PORT}"
return $?
}
# 重启服务函数
restart_service() {
echo "[$(timestamp)] 检测到端口 ${TARGET_PORT} 异常,尝试重启 ${SERVICE_NAME}..." >> $LOG_FILE
nohup /data/public/kafka/kafka_2.13-2.5.1/bin/kafka-server-start.sh /data/public/kafka/kafka_2.13-2.5.1/config/server.properties > /dev/null 2>&1 &
}
# 主监控逻辑
main() {
if ! check_port; then
restart_service
else
echo "[$(timestamp)] 端口 ${TARGET_PORT} 正常" >> $LOG_FILE
fi
}
# 执行主函数
main
配置定时任务
bash
[root@server kafka]# crontab -e
# 检查Kafka,2分钟
*/2 * * * * /data/public/kafka/check_kafka.sh
*/2 * * * * /data/public/kafka/check_zookeeper.sh
日志检查
关闭9092端口,然后等待2分钟,检查日志,看是否有重新拉起服务。
bash
[root@server kafka]# cat check.log
[2025-07-21 10:46:01] 端口 2181 正常
[2025-07-21 10:46:01] 端口 9092 正常
[2025-07-21 10:48:01] 检测到端口 9092 异常,尝试重启 kafka...
[2025-07-21 10:48:01] 端口 2181 正常
[2025-07-21 10:50:01] 端口 2181 正常
[2025-07-21 10:50:01] 端口 9092 正常
经过检查服务均已正常启动
bash
[root@server kafka]# netstat -nltp | grep 9092
tcp6 0 0 10.16.39.121:9092 :::* LISTEN 233104/java
[root@server kafka]# netstat -nltp | grep 2181
tcp6 0 0 :::2181 :::* LISTEN 471696/java