zoukankan      html  css  js  c++  java
  • 借助mosquitto“实时”远程监控服务器数据库运行状态

    公司的项目还处于开发阶段,我把整个后台服务临时放在阿里云上供前端测试,用的阿里云的ECS云服务器,HTTP请求服务器和数据库服务都安装在一台机子上(穷啊,凑合用),做测试用,配置相当低:单核1Gb。其实我对服务器多大配置能承受多大访问压力并没有多大概念。前不久使用Jmeter进行http接口性能测试,发现短时间内访问量比较大时,总是会请求错误,根据返回的结果提示是数据库错误,查看一下数据库状态,果真数据库宕机了。
    1. service mysqld status


    只要数据库服务崩溃了,后面的请求就都会出错,所以想用一种方法来监控服务器数据库服务的状态。自己想了几种方案,大致分为两类
    1.当有请求到来时,如果发生数据库连接错误,就(通过邮件或者短息)推送信息给管理员,管理员手动去重启数据库服务。
    2.在系统中设置一个定时任务,每隔一段时间检查一次数据库服务状态,如果服务停了就重启并通知管理员。
    这里介绍的是第二种方法,主要通过shell脚本实现,下面具体说明如何实现。
    首先检测Mysql的状态
    1. #!/bin/bash
    2. pgrep -x mysqld &> /dev/null
    3. if [ $? -ne 0 ]
    4. then
    5. echo "At time: `date` :MySQL is stop .">> /var/log/mysql_messages
    6. service mysql start
    7. #echo "At time: `date` :MySQL server is stop."
    8. else
    9. echo "MySQL server is running ."
    10. fi

    将上述脚本保存到mysql.sh中,上传到服务器,运行该脚本可以发现输出数据库服务正在运行

    1. # sh mysql.sh
    2. MySQL server is running

    这里我还出现一个小插曲,就是shell脚本总是运行错误,可以参考下面。原来是windows系统和类Unix系统的换行符不一样。
    脚本如果还执行不了的可能性是文件没有执行权限

    每隔一定时间自动运行脚本

    linux上定期执行脚本用的是cron进程

    命令:
      1. crontab -e
    1. 输入(如果不能输入,按键盘上的Insert键就能输入了)
    2. */5 * * * * /your_dir/mysql.sh
    */5表示分钟能被5整除,及每5分钟执行一次,后面4个*号,分别表示 小时,日,月,星期。
    编辑完毕,按ESC键退出,输入:wq保存后退出。
    重启cron就可以了
      1. service cron restart
    这样就会每隔5分钟,执行一次检测mysql的脚本。
    使用上面的shell脚本并不会推送数据库状态消息给管理员,这里就要借助我以前写的一篇博客了。

    Centos7-mqtt消息中间件mosquitto的安装和配置

    借助mosquitto服务可以将消息推送到管理员客户端。

    1. #!/bin/bash
    2. pgrep -x mysqld &> /dev/null
    3. if [ $? -ne 0 ]
    4. then
    5. mosquitto_pub -t mysql_status -m "Failed"
    6. service mysql start
    7. #echo "At time: `date` :MySQL server is stop."
    8. else
    9. mosquitto_pub -t mysql_status -m "Running"
    10. fi
    服务器发布主题为“mysql_status”的消息,再使用客户端来接收该消息。
    1. import paho.mqtt.client as mqtt
    2. # The callback for when the client receives a CONNACK response from the server.
    3. def on_connect(client, userdata, flags, rc):
    4. print("Connected with result code "+str(rc))
    5. # Subscribing in on_connect() means that if we lose the connection and
    6. # reconnect then subscriptions will be renewed.
    7. client.subscribe("mysql_status")
    8. #订阅,第一个参数是订阅的主题
    9. # The callback for when a PUBLISH message is received from the server.
    10. def on_message(client, userdata, msg):
    11. print(msg.topic+" "+str(msg.payload))
    12. client = mqtt.Client()
    13. client.on_connect = on_connect
    14. client.on_message = on_message
    15. client.connect("主机名或ip", 1883, 60)
    16. #第一个参数为主机名,及Mosquitto所在服务器,第二个参数是端口
    17. # Blocking call that processes network traffic, dispatches callbacks and
    18. # handles reconnecting.
    19. # Other loop*() functions are available that give a threaded interface and a
    20. # manual interface.
    21. client.loop_forever()




    参考:








  • 相关阅读:
    winform_webApiSelfHost
    手机访问网站自动跳转到手机版
    Linux常用命令
    css居中
    固定菜单
    BOM操作写法实例
    表格(合并单元格)
    倒计时
    分享到插件
    jquery获得下拉框的值
  • 原文地址:https://www.cnblogs.com/star91/p/5059378.html
Copyright © 2011-2022 走看看