【任务16】故障监控:1、用脚本监控 mysql + redis

本问题对应的项目链接:从0设计一个web项目

实现功能:监控我们服务器的 mysql + redis 是否处于正常运行状态,如果是,则不理,如果挂了,那么自动重启,并且打印下日志,记录一下具体时间,日志的文件名用 xxxx.log,具体要放在什么位置,随你便吧,mysql+redis用不同的文件哈。

另外,定时任务脚本,每分钟执行一次。

**要求**:给你的脚本代码

共以下 1 个回答

  • 秊 永久会员 2023年1月6日 上午1:49

    监控 MySQL 思路

    • 监听 3306 端口
    • 监控 mysqld 进程
    • 同时采用上述两种方法,进程和端口都存在才算 mysql 服务正常 ✓
    • 使用 mysqladmin ping 命令 ✓

    监控 Redis 思路

    • 监控 redis-server 进程 ✓
    • 使用 ping 命令

    设置定时脚本思路

    • 在脚本内采用 do while
    • 利用 linux 中的 corn 定时任务 ✓

    shell 代码如下:

    #!/bin/bash
    
    # 监控 MySQL
    # 使用第三种方法
    PROCESS_MySQL=`ps -ef | grep mysqld | grep -v grep | wc -l`
    PORT=`netstat -tlun tcp -p | grep mysql | grep -v grep | wc -l`
    
    if [ $PORT -lt 1 ] && [ $PROCESS_MySQL -lt 2 ]
    then
        echo "\n$(date): MySQL已停止运行,执行自动重启" >> ../log/check_wrong_MySQL.log
        echo "jiang" | sudo /usr/local/mysql/support-files/mysql.server start >> ../log/check_wrong_MySQL.log 2>&1
    fi
    
    
    # 使用第四种方法
    #
    #MYSQL_USER=jiang # 定义数据库相关变量
    #MYSQL_PASSWORD=jiang
    #MYSQL_PORT=3306
    #MYSQL_HOST=localhost
    #
    #MYSQL_ADMIN="/usr/local/mysql/bin/mysqladmin -u$MYSQL_USER -p$MYSQL_PASSWORD -P$MYSQL_PORT -h$MYSQL_HOST"
    #
    #$(${MYSQL_ADMIN}) ping >> /dev/null 2>&1
    #
    #if [ $? -ne 0 ]
    #then
    #    echo "\n$(date): MySQL已停止运行,执行自动重启" >> ../log/check_wrong_MySQL.log
    #    echo "jiang" | sudo /usr/local/mysql/support-files/mysql.server start >> ../log/check_wrong_MySQL.log 2>&1
    #fi
    
    
    # 监控 Redis
    PROCESS_Redis=`ps -ef | grep "redis-server 127.0.0.1:6379" | grep -v grep | wc -l`
    
    if [ $PROCESS_Redis -lt 1 ]
    then
        echo "\n$(date): Redis已停止运行,正在重启" >> ../log/check_wrong_Redis.log 2>&1
        redis-server /usr/local/etc/redis.conf
    fi
    
    

    测试结果(事先手动关闭了 MySQL 和 Redis 服务):

    服务器链接:http://124.223.184.187:8088/FromZerotoExpert
    Github仓库链接:https://github.com/jiangyklala/FromZerotoExpert/tree/dev

    1 赞同 4 条回复
    • ~棒棒的糖 普通 @ 秊 2023年2月21日 下午3:05

      大佬您好!如果不仅要在Linux服务器上打印并保存日志,还要能在网站上有所体现/展示的话可以怎么实现呢?这种需求不知道实际项目中有没有?

    • 秊 永久会员 @ ~棒棒的糖 2023年2月21日 下午6:17

      你好你好,我的思路是:写一个接口来查询 check_wrong_Redis.log 文件中服务的状态。

      具体的,可以用文件流操作读取这个日志文件中的每一行,用正则表达式提取其中的某些字段(如“Redis已停止运行”),如果能成功提取到,说明 Redis 已经寄了。前端页面只需要访问这个接口就能知道当前 Redis 服务的状态了。

      补充:这里其实不严谨,因为在监控脚本中,检测到 Redis 停止运行之后,我们除了打印日志之外,还会执行重启操作,无法确定这个重启是否成功,如果重启失败了才说明 Redis 真寄了。那么根据这个思路就可以在脚本的重启操作之后,再次检查是否有 Redis 进程(即是否重启成功),同时也可以设置最多能重启的次数,超过这个次数就认定 Redis 真寄,然后在日志文件中记录一个特定字段,再在接口中查询这个字段。

      其实我觉得,如果 MySQL/Redis 挂了,那网站也就挂了,那在网站上再显示这俩服务的状态就无意义了,不过倒是可以在脚本中设置 MySQL/Redis 挂了之后给自己发邮件,提醒自己。

    • ~棒棒的糖 普通 @ 秊 2023年2月21日 下午7:37

      感谢大佬的分享,后面我试试能不能把挂了后发邮件或短信这个功能给实现一下,也期待大佬的编码实现,前面有不少都有参考您的实现,例如自定义注解等等,自己第一次从0编码一个Demo项目,有很多不太懂,还需向大伙儿学习!

    • 秊 永久会员 @ ~棒棒的糖 2023年2月21日 下午9:11

      冲冲冲💪

# 回答此问题

后才能回答