技术开发 频道

DBA减赋 甩掉盯着屏幕监控MySQL的时代

  项目实战

  我们依然以南风公司为例,但需要将真实的情况缩小为一个便于大家理解的模型,所以我们假设该公司分别在北京和上海各有 1 组服务器(真实情况有更多组服务器),北京网通 1 区机房这组服务器里有 2 台服务器(真实情况是每组有更多的服务器),上海电信 1 区机房也有 2 台服务器(真实情况是每组有更多的服务器)。

  程序目录结构及说明如下:

  1、.profile文件说明

  配置文件,存储常量信息、短信收发方相关信息及数据库服务器配置信息等,具体如下:

  清单 6. .profile 文件

[root@localhost MySQL_Monitor]$ more .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 文件

[root@localhost server_group_cfg]$ more 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 日产生的日志。

  程序框架,如下: 

#!/bin/bash
# 此处是一些初始化的工作
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 文件

#!/bin/bash
# 此处是一些初始化的工作
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 bj_cnc1
*/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 更加智能,更加方便为用户服务。

0
相关文章