Flume日志采集工具使用详解13(通过进程监控实现Agent自动重启修复)
Flume 的 Agent 服务是一个独立的进程。如果该采集进程因故障而退出,或者被误操作关闭,这将对数据收集和传输产生重大影响。为确保系统的稳定性和数据完整性,我们可以考虑引入自动恢复机制,使 Flume Agent 能够在意外退出后自动重新启动。下面我将通过样例进行演示。
(2)接着创建该文件里指定的脚本文件 startExample.sh:
(3)最后创建一个脚本 monlist.sh 来检查进程在不在,不在的话尝试重启:
(2)然后创建新 Agent 的脚本文件 startMytask.sh 即可:
十三、通过进程监控实现 Agent 自动重启修复
1,实现思路
(1)首先需要有一个配置文件,配置文件中指定我们现在需要监控哪些 Agent。
(2)接着有一个脚本负责读取配置文件中的内容,定时挨个检查 Agent 对应的进程还在不在,如果发现对应的进程不在,则记录错误信息,然后告警(发短信或者发邮件)并尝试重启。
2,创建脚本
(1)首先创建一个文件 monlist.conf:
mkdir -p /data/soft/ vi /data/soft/monlist.conf
- 文件内容如下:
- 文件中的第一列指定一个 Agent 的唯一标识,后期需要根据这个标识过滤对应的 Flume 进程,所以一定要保证至少在一台机器上是唯一的。这里建议使用 Flume 任务配置文件的文件名。
- 等号后面是一个启动 Flume 进程的脚本,这个脚本和 Agent 的唯一标识是一一对应的,后期如果根据 Agent 标识没有找到对应的进程,那么就需要根据这个脚本启动进程
example=startExample.sh
(2)接着创建该文件里指定的脚本文件 startExample.sh:
vi /data/soft/startExample.sh
- 脚本内容如下:
#!/bin/bash flume_path=/root/apache-flume-1.11.0-bin nohup ${flume_path}/bin/flume-ng agent --name a1 --conf ${flume_path}/conf/ --conf-file ${flume_path}/conf/example.conf &
(3)最后创建一个脚本 monlist.sh 来检查进程在不在,不在的话尝试重启:
vi /data/soft/monlist.sh
- 脚本内容如下:
#!/bin/bash #进入脚本目录 MON_DIR="/data/soft/" cd $MON_DIR monlist=`cat monlist.conf` echo "start check" for item in ${monlist} do # 设置字段分隔符 OLD_IFS=$IFS IFS="=" # 把一行内容转成多列[数组] arr=($item) # 获取等号左边的内容 name=${arr[0]} # 获取等号右边的内容 script=${arr[1]} echo "time is:"`date +"%Y-%m-%d %H:%M:%S"`" check "$name if [ `jps -m|grep $name | wc -l` -eq 0 ] then # 发短信或者邮件告警 echo `date +"%Y-%m-%d %H:%M:%S"` $name "is none" sh -x ./${script} fi done
- 保存后给该脚本设置权限:
chmod 777 /data/soft/monlist.sh
3,创建定时任务
(1)我们这里使用 crontab 定时调度来定时执行检测脚本。首先,我们使用以下命令编辑 crontab:
(2)这里我设置的是监测脚本每 1 分钟执行一次。同时我们还将脚本里面的打印信息输出到 log 文件中,方便后续的问题排查。
(3)保存后退出,执行 crontab -l 命令可以查看 crontab 服务是否创建成功:
crontab -e
(2)这里我设置的是监测脚本每 1 分钟执行一次。同时我们还将脚本里面的打印信息输出到 log 文件中,方便后续的问题排查。
* * * * * /bin/bash /data/soft/monlist.sh >> /data/soft/monlist.log 2>&1
(3)保存后退出,执行 crontab -l 命令可以查看 crontab 服务是否创建成功:
4,使用测试
(1)等待一会后,我们的 Agent 进程就会自动启动:
(2)将该进程杀死后,稍等一分钟,可以发现这个 Agent 又能自动启动了:
附:同一台服务器多个 Agent 自动重启样例
(1)有时我们在一台服务器上不止有 1 个 Agent,如果有多个 Agent 需要自动重启的话,首先修改 monlist.conf 文件:
vi /data/soft/monlist.conf
- 在里面添加新 Agent 的唯一标识,以及对应的 Flume 进程的脚本。这里建议使用 Flume 任务配置文件的文件名:
example=startExample.sh mytask=startMytask.sh
(2)然后创建新 Agent 的脚本文件 startMytask.sh 即可:
vi /data/soft/startMytask.sh
- 脚本内容如下:
#!/bin/bash flume_path=/root/apache-flume-1.11.0-bin nohup ${flume_path}/bin/flume-ng agent --name a1 --conf ${flume_path}/conf-mytask/ --conf-file ${flume_path}/conf-mytask/mytask.conf &