项目实战
我们依然以南风公司为例,但需要将真实的情况缩小为一个便于大家理解的模型,所以我们假设该公司分别在北京和上海各有 1 组服务器(真实情况有更多组服务器),北京网通 1 区机房这组服务器里有 2 台服务器(真实情况是每组有更多的服务器),上海电信 1 区机房也有 2 台服务器(真实情况是每组有更多的服务器)。
程序目录结构及说明如下:
1、.profile文件说明
配置文件,存储常量信息、短信收发方相关信息及数据库服务器配置信息等,具体如下:
清单 6. .profile 文件
LOG_DIR=log
SENDER_ID=137********
SENDER_PWD=pwd********
RECEIVER_LIST=Tom~137********
SERVER_GROUP_CFG_DIR=server_group_cfg
EXPIRED_DAY=2
变量名 | 变量描述 |
LOG_DIR | 表示 monitor.sh 产生的日志文件的路径 |
SENDER_ID | 短信发送方手机号 |
SENDER_PWD | 短信发送方飞信密码 |
RECEIVER_LIST | 短信接收方列表 |
SERVER_GROUP_CFG_DIR | 服务器组配置文件的路径 |
EXPIRED_DAY | 用于 monitor_helper.sh 清理日志时用,此处为 2 表示清除 2 天前的日志 |
2、bj_cnc1 文件说明
服务器组配置文件,存储每组服务器中所有数据库的配置信息,具体如下:
清单 7. bj_cnc1 文件
第100号MySQL:86.160.1.100:1521:test_user0:test_pwd0:test_db_100
第101号MySQL:86.160.1.101:1522:test_user1:test_pwd1:test_db_101
表示北京网通1区中所有数据库的配置信息,本例仅以 2 个库为例,每个字段的含义如下:
列号 | 描述 |
第1列 | 数据库的中文描述 |
第2列 | 数据库的 IP 地址 |
第3列 | 数据库的监听端口 |
第4列 | 数据库用户名 |
第5列 | 数据库用户密码 |
第6列 | 服务器的名字 |
3、bj_cnc1_20091017 文件说明
这个是日志文件,表示 2009 年 10 月 17 日北京网通1区 monitor.sh 主监控程序产生的日志。
4、monitor.sh 文件说明
主监控程序,每 1 分钟运行一次,它接受一个输入参数,用于指定监控哪个服务器组(如 monitor.sh -s bj_cnc1,表示监控“北京网通1区”下的 2 个数据库“第100号MySQL”和“第101号MySQL”),并将日志写入 log 目录下,并且 log 命名为“bj_cnc1_20091017”,表示是“北京网通1区”服务器组在 2009 年 10 月 17 日产生的日志。
程序框架,如下:
# 此处是一些初始化的工作
function echo_usage(){
# 打印程序的用法
}
function send_msg(){
# 发送短消息
}
function check_mysql_instance_status(){
# 检查点 1, 用于检查此数据库监听器是否启动,同时写日志
# 如果失败则调用“send_msg()”给 DBA 发短信提醒
}
# 可以自定义多个检查点
function check_***(){
# 检查点 n,同时写日志
# 如果失败则调用“send_msg()”给 DBA 发短信提醒
}
function main(){
# 主函数
check_mysql_instance_status
# 可以调用多个检查点
check_***
}
# 此处检查输入的参数是否合理,如果不合理则调用“echo_usage”,并退出程序
# 主函数调用
main
5、monitor_helper.sh 文件说明
由于主监控程序每 1 分钟运行一个,那么如果主监控程序在 2009 年 10 月 17 日是运行的,那么它将在 log 目录下会产生一个 bj_cnc1_20091017,正是这个文件可以代表主监控程序是运行良好的。
助手程序循环读取“server_group_cfg”文件夹下面的文件名(如“bj_cnc1”),然后在文件名后加上当前日期(如 “bj_cnc1_20091017”),再到 log 目录下去找该文件,如果找到则说明正常,如果找不到就说明有主监控程序没有正常运行。
程序框架如下:
清单 9. monitor_helper.sh 文件
# 此处是一些初始化的工作
function send_msg(){
# 发送短消息
}
function check_monitor(){
# 检查主监控程序是否运行,如果失败则调用“send_msg()”给 DBA 发短信提醒
}
function del_expired_log(){
# 删除主监控程序产生的过期日志
}
function main(){
# 主函数
}
# 主函数调用
main
6、Cron 定时器配置文件说明
我们将主程序和助手程序放到定时器里,他们的运行频率分别是:主监控程序, 每 1 分钟运行一次;助手程序,每天 10 点运行一次;具体代码如下:
清单 10. Cron 定时器配置文件
*/1 * * * * /home/mysql1/MySQL_Monitor/monitor.sh -s sh_ct1
0 10 * * * /home/mysql1/MySQL_Monitor/monitor_helper.sh
7、程序运行演示
如果“北京网通1区”的“第100号MySQL”所属实例意外停止了,那么 DBA 会马上收到这样一条短信,如下:
结论
本文对传统的 MySQL 监控工作方式进行了优化和升级,使其搭上了移动互联的快车,让 DBA 可以更高效的工作。我们需要做的还很多,伴随互联网和移动互联的兴起,将会有更多的技术可以让 MySQL 更加智能,更加方便为用户服务。