MYSQL双主同步+同步检查脚本+邮件报警脚本
第一篇博客,不知道写点什么,平常都是用有道云笔记去记录一些工作中的内容,从今天开始写博客吧;
环境:centos6.6
源:epel
由于本次测试mysql是yum直接安装的
mysql版本
两台机器同时安装mysql 设置密码
setpasswordfor'root''localhost'password'newpasswd'进入Mysql
show master status\G;
报错:(配置文件中没有开启开启二进制日志)
解决办法:开启二进制 或者从其他机器拷贝my.cnf
然后进入数据库,查看状态,发现有值了
两台机器分别授权同步用户
grant replication slave on *.* to 'replication'@'192.168.1.9' identified by 'replication.rzrk';
flush privileges;
两台机器分别上读锁
flush tables with read lock;#防止进入新的数据
两台机器分别执行同步
change master to master_host='192.168.1.9',master_user='replication',
master_password='replication.rzrk',master_log_file='mysql-bin.000004',master_log_pos=361;
全部执行s
start slave;
show slave status\G;
成功
解锁
测试 在一台机器建库
另一台机器查看
由于是双主同步 所以在另外一台机器建库也会同步(同理)
双主同步有一个特点,你把A数据库的slave先给停掉 在B机器数据库创建一个库,这时A机器是没有显示新建的库的,
检查主从同步脚本
脚本设计思路:
1、此脚本应该能适应各种各样不同的内外网环境,即IP不同的环境;
2、让脚本也顺便监控下MySQL是否正常运行;
3、Slave机器的IO和SQL状态都必须为YES,缺一不可,这里用到了多重条件判断-a。
脚本产生的背景环境:
我有不少基于公网类型的网站(没有硬件防火墙,直接置于IDC机房)做的都是MySQL主从架构,从机主要起备份数据库和冷备份的作用,虽然从机宕机了问题不大,但也影响数据的备份工作;这样的网站有数十个,如果一个一个手动的检查,每天都要浪费不少时间,所以玩了下脚本控,设计了如上脚本。
脚本实践:
此脚本我已用于了生产环境,大家可以放在我们的从MySQL机器上,用来监控;另外建议有时也手动检查下
后期应用:
后期公司的MySQL数据库准备由一主一从架色升级成一主多从,读写分离的架构,LVS作从数据库的负载均衡器,此脚本自动监控从MySQL的replication状态,如果不能同步则自动关闭本机的MySQL服务,免得影响整个网站的正常业务访问。当然了,到时脚本的运行周期肯定也需要更改,由10分钟变成秒级的,这个可以通过while循环来实现。
每分钟执行一次
优化:使用python发送邮件(linux自带的mail发送邮件并不好用,所以决定使用python写一个邮件脚本)
1 #!/usr/bin/python 2 # -*- coding: UTF-8 -*- 3 4 import smtplib 5 from email.mime.text import MIMEText 6 from email.header import Header 7 8 # 第三方 SMTP 服务 9 mail_host="smtp.exmail.qq.com" #设置服务器 10 mail_user="shenjianyu@thinktrader.net" #用户名 11 mail_pass="s2105" #口令 12 13 14 sender = 'shenjianyu@thinktrader.net' 15 receivers = ['976299670@qq.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱 16 17 message = MIMEText('warn!server: mysql is down', 'plain', 'utf-8') 18 message['From'] = Header("172.30.1.207", 'utf-8') 19 message['To'] = Header("测试", 'utf-8') 20 21 subject = 'MYSQL故障' 22 message['Subject'] = Header(subject, 'utf-8') 23 24 25 try: 26 smtpObj = smtplib.SMTP() 27 smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号 28 smtpObj.login(mail_user,mail_pass) 29 smtpObj.sendmail(sender, receivers, message.as_string()) 30 print "邮件发送成功" 31 except smtplib.SMTPException: 32 print "Error: 无法发送邮件"
在检查主从同步脚本中添加一行
发送邮件成功