keepalived实现定时任务,其实crontab更好用。。。但是有的魔改linux无法使用crontab,就很无奈可能这就是**麒麟系统吧!

实现思路

要定时去执行,不能用contab,那就只能用keepalived的检查服务 多少秒执行一次脚本,通过脚本去判断,如果当前时间等于这个时间那就执行

keeplived配置

keepalived主要是执行检查脚本,然后如果降权就跳备机 跳备机同时执行恢复数据库的操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11

vrrp_script chk_server1 { 
    script "/status.sh" #执行脚本
    interval 2 #间隔时间
    weight -40  # #优先级(如果脚本执行结果为0,并且weight配置的值大于0,则权重相应的增加,如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少)
}  
track_script { #调用上面定义的检查脚本
     chk_server1 
   }
     notify_backup "/etc/keepalived/regain.sh" #状态为backup执行脚本
}

检测脚本

获取当前时间,先删除三个月以前的备份数据库,如果为晚上2点就执行备份,并且检测该文件存不存在如果存在就执行备份存在就不备份,当不是2点时就检测 Mysql,Ngiinx,Tomcat服务down就写info里面记录,成功就清空该文件,统计超过三次就给keepalived降权,然后就跳备机。

第一次写shell,总感觉逻辑不是很通顺。。待改进吧,纯粹查命令写出来,

 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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/bin/sh
hours=`date +"%H%M"`
static=200
database=/opt/keepalived/info/database`date +"%Y-%m-%d"`.sql
status=/opt/keepalived/info/
find $status -mtime +91 -name "*.sql" -exec rm -rf {} \;
if [ $hours -eq $static ];
 then
   if [ ! -f "$database" ];
   then
   /opt/mariadb/bin/mysqldump -uroot -ppassword database > $database
   echo "导出成功!";
   else
   echo "文件已存在!";
   fi
else
   echo "开始服务检查";
   `exec >/dev/tcp/127.0.0.1/80`
    if [ $? -ne 0 ];
    then
    echo "nginx is down";
    `systemctl start nginx`
      [ $? -ne 0 ];
      echo "nginx 无法启动";
  
        echo 1 >> $status/nginx.info
    else
        echo "nginx 服务正常";
        
        echo  > $status/nginx.info
      fi
       `exec >/dev/tcp/127.0.0.1/8080`
          if [ $? -ne 0 ];
          then
             echo "tomcat is down";
             `systemctl start tomcat`
             [ $? -ne 0 ];
             echo "Tomcat 无法启动";
          
               echo 2 >> $status/Tomcat.info
             else
             echo "tomcat 服务正常";
             echo  > $status/tomcat.info
             fi 
               `exec >/dev/tcp/127.0.0.1/3306`
                 if [ $? -ne 0 ];
                 then 
                 echo "mysql is down";
                 `systemctl start mysql`
                 [ $? -gt 0 ];
                  echo "mysql 无法启动";
                   echo 3 >> $status/mysql.info
                 else
                 echo "mysql 服务正常";
              echo  > $status/mysql.info
          fi
        if [ `cat $status*.info|wc -w`  -ge 3 ]
        then
        exit 1
	else 
        exit 0
       fi
     fi

恢复脚本

最好记录下日志说明什么时候恢复过。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/sh
database=/opt/keepalived/info/database`date +"%Y-%m-%d"`.sql
time=`date "+%Y_%m_%d %H:%M:%S"`
update=/opt/keepalived/info/update.txt
/opt/mariadb/bin/mysql -hIP -uroot -ppassword database  < $database
 if   [ $? -ne 0 ];
    then
    echo "$time数据库以$database恢复失败" >> $update
    else
    echo "$time数据库以$database恢复成功" >> $update
fi