应用服务监控-2
场景:应用服务域名对应多台负载机,当某台出现CPU或RAM资源阻塞时,如果服务器并未死机,根据负载策略(类似 ping或telnet),服务器可能仍然是可用的,新的访问仍然有分配到这台机器处理的可能,但实际又不可用,体验不好,且不能及时发送故障通知。新的负载策略是访问指定页面(类似curl命令),检查返回结果中是否有关键字,来判断服务是否正常,如果不正常,则从应用集群中踢掉这台机器,待恢复正常后再加入。但当时踢掉后没有邮件通知功能,就做了个脚本来监控。
上一版脚本在每一台上部署,当出现机器资源耗尽时,邮件阻塞,出现重复发送的情况,故而改进了一下脚本,将其部署到一台不提供负载的服务器上。
1.通知脚本-notice.sh
1 #!/bin/bash
2 dir=/root/myhome
3 hosts=("192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.4")
4 keyword="记住用户"
5 users=("11@qq.com 22@qq.com")
6
7 # 发送邮件的函数
8 send_email() {
9 to=$users
10 subject="$j service unreachable"
11 body="URL: $url\n服务异常,\n断言关键字: $keyword\n"
12 echo -e "$body" | mail -s "$subject" "$to"
13 }
14
15 disable_flag(){
16 sed -i "s/$j=\(y\)/$j=n/" "$dir/s.flag"
17 echo "`date`:$j===>>>alter flag to n"
18 }
19
20 enable_flag(){
21 sed -i "s/$j=\(n\)/$j=y/" "$dir/s.flag"
22 echo "`date`:$j===>>>alter flag to y"
23 }
24
25 # 使用 curl 请求 URL 并检查返回结果是否包含关键字
26 for j in $hosts;do
27 sendFlag=`cat $dir/s.flag | grep ^$j | rev | cut -c 1`
28 if [[ $sendFlag = y ]];then
29 url="http://$j:8888/mydemo/home"
30 response=$(curl -s "$url")
31 if [[ $response =~ $keyword ]];then
32 echo "`date`:$j===>>>curl 找到关键字"
33 else
34 echo "`date`:$j===>>>curl 未找到关键字"
35 disable_flag
36 for i in "$users"
37 do
38 send_email
39 done
40 fi
41 else
42 echo "`date`:$j===>>>发送标志是$sendFlag,不再重复发送"
43 fi
44 done
2.开启发送标志的shell
1 #!/bin/bash
2 hosts=("192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.4")
3 dir=/root/myhome
4 enable_flag(){
5 sed -i "s/$j=\(n\)/$j=y/" "$dir/s.flag"
6 echo "`date`:$j===>>>alter flag to y"
7 }
8
9 for j in $hosts;do
10 sendFlag=`cat $dir/s.flag | grep ^$j | rev | cut -c 1`
11 if [[ $sendFlag = n ]];then
12 enable_flag
13 else
14 echo "`date`:$j===>>> flag is y,nothing to do"
15 fi
16 done
3. s.flag文件内容
192.168.1.1=y 192.168.1.2=y 192.168.1.3=y 192.168.1.4=y
4.crondtab配置
*/2 3-23,0-1 * * * sh /root/myhome/notice2.sh >> /root/myhome/check.log 2>&1 0 7 * * * sh /root/myhome/enable_flag.sh >> /root/myhome/check.log 2>&1


浙公网安备 33010602011771号