您的位置:首页 > 产品设计 > UI/UE

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

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

[/code]


[/b]
只要数据库服务崩溃了,后面的请求就都会出错,所以想用一种方法来监控服务器数据库服务的状态。自己想了几种方案,大致分为两类1.当有请求到来时,如果发生数据库连接错误,就(通过邮件或者短息)推送信息给管理员,管理员手动去重启数据库服务。2.在系统中设置一个定时任务,每隔一段时间检查一次数据库服务状态,如果服务停了就重启并通知管理员。这里介绍的是第二种方法,主要通过shell脚本实现,下面具体说明如何实现。首先检测Mysql的状态
#!/bin/bash

pgrep-xmysqld&>/dev/null

if[$?-ne0]

then

echo"Attime:`date`:MySQLisstop.">>/var/log/mysql_messages

servicemysqlstart

#echo"Attime:`date`:MySQLserverisstop."

else

echo"MySQLserverisrunning."

fi

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

#shmysql.sh

MySQLserverisrunning

[/code]

这里我还出现一个小插曲,就是shell脚本总是运行错误,可以参考下面。原来是windows系统和类Unix系统的换行符不一样。shell编程报错:“syntaxerrornearunexpectedtoken`”-xyp84的专栏-博客频道-CSDN.NET解决方法参考下面任意一个就行了:Notepad++中Windows,Unix,Mac三种格式之间的转换-如月王子的个人空间-开源中国社区dos格式的文件转换为unix格式-leipei-博客园如果是用sublime编辑器还可以参考SublimeText2默认语言格式(windows/unix)设置,快捷键-鸿网互联[68IDC.CN]脚本如果还执行不了的可能性是文件没有执行权限


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

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

命令:
crontab-e

[/code]
输入(如果不能输入,按键盘上的Insert键就能输入了)

*/5****/your_dir/mysql.sh

*/5表示分钟能被5整除,及每5分钟执行一次,后面4个*号,分别表示小时,日,月,星期。
编辑完毕,按ESC键退出,输入:wq保存后退出。
重启cron就可以了
servicecronrestart

[/code]
这样就会每隔5分钟,执行一次检测mysql的脚本。
使用上面的shell脚本并不会推送数据库状态消息给管理员,这里就要借助我以前写的一篇博客了。

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

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

pgrep-xmysqld&>/dev/null


if[$?-ne0]


then


mosquitto_pub-tmysql_status-m"Failed"


servicemysqlstart

#echo"Attime:`date`:MySQLserverisstop."


else


mosquitto_pub-tmysql_status-m"Running"


fi

[/code]服务器发布主题为“mysql_status”的消息,再使用客户端来接收该消息。
importpaho.mqtt.clientasmqtt

#ThecallbackforwhentheclientreceivesaCONNACKresponsefromtheserver.

defon_connect(client,userdata,flags,rc):

print("Connectedwithresultcode"+str(rc))

#Subscribinginon_connect()meansthatifwelosetheconnectionand

#reconnectthensubscriptionswillberenewed.

client.subscribe("mysql_status")

#订阅,第一个参数是订阅的主题

#ThecallbackforwhenaPUBLISHmessageisreceivedfromtheserver.

defon_message(client,userdata,msg):

print(msg.topic+""+str(msg.payload))

client=mqtt.Client()

client.on_connect=on_connect

client.on_message=on_message

client.connect("主机名或ip",1883,60)

#第一个参数为主机名,及Mosquitto所在服务器,第二个参数是端口

#Blockingcallthatprocessesnetworktraffic,dispatchescallbacksand

#handlesreconnecting.

#Otherloop*()functionsareavailablethatgiveathreadedinterfaceanda

#manualinterface.

client.loop_forever()

[/code]



参考:shell脚本:监控MySQL服务是否正常_数据库技术_Linux公社-Linux系统门户网站
Linux下定时任务的查看及取消-Brin的日志-网易博客

来自为知笔记(Wiz)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: