需求

Flume是个单进程程序,会存在单点故障,所以需要有一个监控机制,发现Flume进程Down掉之后,需要重启。

思路

  1. 1. 首先需要有一个配置文件,配置文件中指定你现在需要监控哪些Agent
  2. 2. 有一个脚本负责读取配置文件中的内容,定时挨个检查Agent对应的进程还在不在,如果发现对应的 进程不在,则记录错误信息,然后告警(发短信或者发邮件) 并尝试重启

开发

1、创建配置文件monlist.conf,指定要监控哪些Agent

example=startExample.sh

第一列指定一个 Agent 的唯一标识,后期需要根据这个标识过滤对应的 Flume 进程,所以一定要保证至少在一台机器上是唯一的,等号后面是一个启动 Flume 进程的脚本,这个脚本和 Agent 的唯一标识是一一对应的,后期如果根据 Agent 标识没有找到对应的进程,那么就需要根据这个脚本启动进程

image.png
这个脚本的内容如下:startExample.sh

#!/bin/bash
flume_path=/data/soft/apache-flume-1.9.0-bin
nohup ${flume_path}/bin/flume-ng agent --name a1 --conf ${flume_path}/conf/ --conf-file ${flume_path}/conf/example.conf  &

2、写一个脚本来检查进程在不在,不在的话尝试重启,创建脚本 monlist.sh

#!/bin/bash
monlist=`cat monlist.conf`
echo "start check"
for item in ${monlist}
do
    # 设置字段分隔符
    OLD_IFS=$IFS
    IFS="="
    # 把一行内容转成多列[数组]
    arr=($item)
    # 获取等号左边的内容,即“example”
    name=${arr[0]}
    # 获取等号右边的内容,即“startExample.sh”
    script=${arr[1]}

    echo "time is:"`date +"%Y-%m-%d %H:%M:%S"`" check "$name
  # 统计该flume进程的数量
    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

jps -m|grep xxxxx | wc -l 统计xxxx进程的数量

[root@bigdata1 apache-flume-1.9.0-bin]# jps -m
96656 JobHistoryServer
96147 NodeManager
95751 SecondaryNameNode
95544 DataNode
17897 Jps -m
17290 Application --name a1 --conf-file conf/example.conf
95994 ResourceManager
95375 NameNode
[root@bigdata1 apache-flume-1.9.0-bin]# jps -m|grep example
17290 Application --name a1 --conf-file conf/example.conf
[root@bigdata1 apache-flume-1.9.0-bin]# jps -m|grep example | wc -l
1
[root@bigdata1 apache-flume-1.9.0-bin]# jps -m|grep example222 | wc -l
0
[root@bigdata1 apache-flume-1.9.0-bin]#

测试

上传脚本和配置文件
image.png
1、先停掉flume进程
image.png
2、执行脚本sh -x monlist.sh
image.png
可以看到flume又启动了

加入crontab

这个需要定时执行,所以可以使用 crontab 定时调度。

* * * * *  root /bin/bash /data/soft/monlist.sh