Kafka:监控与故障自愈

1. 自动重启脚本 (autoRestart.sh)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/bash

# 环境变量
source /etc/profile

# 配置参数
PROC_DIR="/opt/kafka_2.13-2.8.0" # Kafka安装目录
PROC_NAME="kafka.Kafka" # 进程名
LOG_FILE="$PROC_DIR/cron.log" # 日志文件
JMX_PORT="9988" # JMX监控端口
CONFIG_FILE="$PROC_DIR/config/server.properties" # 配置文件

# 检查进程是否存在
proc_num() {
num=$(ps -ef | grep $PROC_NAME | grep -v grep | wc -l)
return $num
}

# 获取进程ID
proc_id() {
pid=$(ps -ef | grep $PROC_NAME | grep -v grep | awk '{print $2}')
}

# 检查进程状态
proc_num
number=$?

# 如果进程不存在则重启
if [ $number -eq 0 ]; then
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Kafka进程不存在,尝试重启..." >> $LOG_FILE

# 清理可能存在的旧日志(谨慎操作)
# rm -rf /tmp/kafka-logs/*

# 启动Kafka服务
JMX_PORT=$JMX_PORT $PROC_DIR/bin/kafka-server-start.sh -daemon $CONFIG_FILE

# 获取新进程ID
proc_id
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Kafka已重启,新PID: $pid" >> $LOG_FILE

# 检查端口监听
netstat -tunlp | grep $JMX_PORT >> $LOG_FILE
else
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Kafka运行正常,PID: $(ps -ef | grep $PROC_NAME | grep -v grep | awk '{print $2}')" >> $LOG_FILE
fi

exit 0

2. 设置脚本权限

1
chmod 777 /opt/kafka_2.13-2.8.0/autoRestart.sh

3. 配置定时任务 (Crontab)

1
2
3
4
5
# 编辑定时任务
crontab -e

# 添加以下内容(每5分钟检查一次)
*/5 * * * * /opt/kafka_2.13-2.8.0/autoRestart.sh >/dev/null 2>&1

4. 手动管理命令参考

强制停止Kafka服务

1
2
# 查找并杀死Kafka进程
ps -ef | grep kafka.Kafka | awk '{print $2}' | xargs -i kill -9 {}

启动Kafka服务(前台模式)

1
JMX_PORT=9988 /opt/kafka_2.13-2.8.0/bin/kafka-server-start.sh /opt/kafka_2.13-2.8.0/config/server.properties &

启动Kafka服务(后台模式)

1
nohup /opt/kafka_2.13-2.8.0/bin/kafka-server-start.sh /opt/kafka_2.13-2.8.0/config/server.properties &

检查JMX端口

1
netstat -tunlp | grep 9988

5. 注意事项

  1. 日志清理:脚本中的rm -rf /tmp/kafka-logs/*操作已被注释,生产环境慎用
  2. 权限管理:确保脚本有执行权限,但777权限可能过高,建议设置为755
  3. JMX监控:确保防火墙开放9988端口以便监控
  4. 资源限制:Kafka对内存要求较高,建议配置合适的JVM参数
  5. 集群环境:在集群中每台服务器都需要部署此脚本

6. 增强建议

  1. 添加邮件报警功能,当服务重启时发送通知
  2. 增加日志轮转功能,防止日志文件过大
  3. 结合监控系统(如Prometheus)实现更全面的监控
  4. 对脚本执行结果进行更详细的日志记录
  5. 考虑使用systemd或supervisor等工具管理服务