借助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系统的换行符不一样。

shell编程报错:“syntax error near unexpected token `” - xyp84的专栏 - 博客频道 - CSDN.NET

解决方法参考下面任意一个就行了:

Notepad++中Windows,Unix,Mac三种格式之间的转换 - 如月王子的个人空间 - 开源中国社区

dos格式的文件转换为unix格式 - leipei - 博客园

如果是用sublime编辑器还可以参考

Sublime Text2 默认语言格式(windows/unix)设置,快捷键 - 鸿网互联[68IDC.CN]

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

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()

参考:

shell脚本:监控MySQL服务是否正常_数据库技术_Linux公社-Linux系统门户网站

Linux下定时任务的查看及取消 - Brin的日志 - 网易博客

来自为知笔记(Wiz)

时间: 2024-11-07 17:22:47

借助mosquitto“实时”远程监控服务器数据库运行状态的相关文章

sql server 警报管理,实时监听数据库动向,运筹帷幄之中

原文:sql server 警报管理,实时监听数据库动向,运筹帷幄之中 工作这么多年了,无论是身边的同学还是同事,发现只要搞程序员的都有一个通病---懒.懒到谁都不愿意加班,尤其是"义务"加班.即使大家都不愿意加班,但是很多时候项目赶着上线或者上线之后出错啊什么的,总得有人看着,这时候就诞生了一种新的工作制度,叫做7*24.顾名思义就是这种岗位实时都得有人看着,这确实是一件让人头疼的事情.虽然说在项目刚上线不可避免的得有7*24,但是我们可以尽量减少7*24的工作量(ps:因为7*24

win7系统安装VS2013后,连不上远程sqlserver数据库解决办法

刚搬了地方,顺便把电脑重做了系统,把sql2012和vs2013装好,怎么弄也连不上远程的数据库了,用程序连IIS直接死掉,用ssms连也是直接失去响应,开始以为是网线端口被运营商封杀了,最后发现不是的,是程序的原因.解决办法和大家分享一下,供大家参考: 以管理员的身份运行“命令管理器”,输入:netsh winsock reset 然后重启一下电脑. 本人亲测,问题解决了.参考资料URL:http://social.msdn.microsoft.com/Forums/zh-CN/030f66b

Linux/CentOS下开启MySQL远程连接,远程管理数据库

当服务器没有运行PHP.没装phpMyAdmin的时候,远程管理MySQL就显得有必要了. 第一步:开启MySQL用户的远程访问权限 mysql -u root -p mysql # 第1个mysql是执行命令,第2个mysql是系统数据名称 在MySQL控制台执行: grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option; # root是用户名,%代表任意主机,'123456'指定的登

使用PL/SQL客户端连接远程oracle数据库

一直以来使用sql develope连接数据库,只要写上ip,用户名,密码,sid等就能连接,后来发现使用PL/SQL连接远程oracle数据库怎么连啊? 这里使用了修改oracle配置文件的方式: 配置文件路径为    D:\app\huyueyang\product\11.1.0\db_1\NETWORK\ADMIN 修改下面的tnsnames.ora,这个是你配置连接的配置文件,安装时候一般会有个默认的orcl实例 如: orcl= (DESCRIPTION = (ADDRESS = (P

Navicat备份远程Oracle数据库到本地

最近公司开发环境数据库服务器很不稳定,经常连不上,给开发造成很大影响,于是就想把数据库备份到本地. 因为一直在用Navicat操作数据库,这里就分享一下用Navicat备份远程oracle数据库导本地的过程.过程so easy! 1.首先本地肯定要装oracle吧~(废话!) 2.在本地建立一个用户并分配表空间: 创建表空间 create tablespace tbs_puhuilicai datafile 'D:\oracle\oracledata\puhuilicai\puhuilicai_

sql plus 和 pl/sql无法连接远程oracle数据库

前言:安装完oracle客户端后,可能会出现sql plus 和 pl/sql无法连接远程oracle数据库的情况,可能是以下原因: 针对sql plus连接不上: 1 可能原因:之前安装过oracle数据库客户端并且没有卸载干净,sql plus使用了之前oracle客户端的配置,导致连接不上 解决办法:在系统变量中,将有关之前的oracle客户端信息删除,如路径信息 针对sql plus可以连接的情况下,针对pl/sql连接不上 1 可能原因:之前安装过oracle数据库客户端并且没有卸载干

一、导入、导出远程Oracle数据库

一.导入.导出远程Oracle数据库  其语法实示例如下:    imp/exp [username[/password[@service]]]   其中service是服务实例名,关于如何创建服务实例名或者数据库SID在http://blog.sina.com.cn/s/blog_7ffb8dd501013e5v.html有记录 或者: imp/exp [username[/password[@hostIp:1521/DBsid]]]  DBsid是数据库sid   如:exp admin/[

oracle11g 远程登录数据库

oracle11g 远程登录数据库比以往的任何版本都要简单,什么也不用做 1.OEM登录 在浏览器中直接输入,远程数据库的OEM网址,当然要把localhost或者主机名改成ip地址   https://localhost:1158/em/console/logon/logon 2.sqlplus登录 命令:sqlplus 用户名/密码@ip地址[:端口]/service_name [as sysdba] 示例:sqlplus sys/[email protected]:1521/test as

【Oracle】数据库运行状态下物理删除所有redo日志恢复方法

实验环境: OEL5.6  Oracle11.2.0.1 实验开始: 数据库运行状态,删除所有日志: [[email protected] TEST]$ ls control01.ctl  redo01.log  sysaux01.dbf  undotbs01.dbf data_ol01.dbf  redo02.log  system01.dbf  users01.dbf example01.dbf  redo03.log  temp01.dbf [[email protected] TEST]