mysql+keepalived主从切换脚本 转

Keepalived MySQL故障自动切换脚本

MySQL架构为master-slave(主从),master故障自动切换到slave上。当然也可以设置为双master,但这里有个弊端:就是当主的压力很大时,从上延时很大,比如落后2000秒,此时主挂了,从接管(VIP漂移到从),用户刚才发表的文章,此时因为同步延时大,还没复制过来,于是用户又发表了一篇文章,当原来的master修好后,因从的IO和SQL线程还在开启状态,还会继续同步刚才没有同步复制完的数据,这时有可能把用户新发表的文章更改掉,造成用户数据丢失。

考虑到这种情况,我这里还是用的master-slave(主从)架构。

keepalive安装很简单,这里不再啰嗦。主要看下配置文件和脚本:


  1. # more /etc/keepalived/keepalived.conf
  2. global_defs {
  3. router_id KeepAlive_Mysql
  4. }
  5. vrrp_script check_run {
  6. script "/root/sh/mysql_check.sh"
  7. interval 300
  8. }
  9. vrrp_sync_group VG1 {
  10. group {
  11. VI_1
  12. }
  13. }
  14. vrrp_instance VI_1 {
  15. state BACKUP
  16. interface eth0
  17. virtual_router_id 51
  18. priority 100
  19. advert_int 1
  20. nopreempt
  21. authentication {
  22. auth_type PASS
  23. auth_pass 1111
  24. }
  25. track_script {
  26. check_run
  27. }
  28. notify_master /root/sh/master.sh
  29. notify_backup /root/sh/backup.sh
  30. notify_stop /root/sh/stop.sh
  31. virtual_ipaddress {
  32. 192.168.8.150
  33. }
  34. }
notify_master <STRING>|<QUOTED-STRING>    # 状态改变为MASTER后执行的脚本
notify_backup <STRING>|<QUOTED-STRING>    # 状态改变为BACKUP后执行的脚本
notify_fault <STRING>|<QUOTED-STRING>    # 状态改变为FAULT后执行的脚本
notify_stop <STRING>|<QUOTED-STRING>    # VRRP停止后后执行的脚本
notify <STRING>|<QUOTED-STRING>        # (1)任意状态改变后执行的脚本

下面解释下这4个脚本的用法:

mysql_check.sh(健康检查脚本,当发现mysql连接不上,会把keepalive进程关闭,并切换。)

  1. # more mysql_check.sh
  2. #!/bin/bash
  3. . /root/.bash_profile
  4. count=1
  5. while true
  6. do
  7. mysql -e "show status;" > /dev/null 2>&1
  8. i=$?
  9. ps aux | grep mysqld | grep -v grep > /dev/null 2>&1
  10. j=$?
  11. if [ $i = 0 ] && [ $j = 0 ]
  12. then
  13. exit 0
  14. else
  15. if [ $i = 1 ] && [ $j = 0 ]
  16. then
  17. exit 0
  18. else
  19. if [ $count -gt 5 ]
  20. then
  21. break
  22. fi
  23. let count++
  24. continue
  25. fi
  26. fi
  27. done
  28. /etc/init.d/keepalived stop
master.sh(状态改变为MASTER后执行的脚本)  (首先判断同步复制是否执行完毕,如果未执行完毕,等1分钟后,不论是否执行完毕,都跳过,并停止同步复制进程。) (其次,更改前端程序连接的业务账号admin的权限和密码,并记录当前切换以后的日志和POS点。)

  1. # more master.sh
  2. #!/bin/bash
  3. . /root/.bash_profile
  4. Master_Log_File=$(mysql -e "show slave status\G" | grep -w Master_Log_File | awk -F": " ‘{print $2}‘)
  5. Relay_Master_Log_File=$(mysql -e "show slave status\G" | grep -w Relay_Master_Log_File | awk -F": " ‘{print $2}‘)
  6. Read_Master_Log_Pos=$(mysql -e "show slave status\G" | grep -w Read_Master_Log_Pos | awk -F": " ‘{print $2}‘)
  7. Exec_Master_Log_Pos=$(mysql -e "show slave status\G" | grep -w Exec_Master_Log_Pos | awk -F": " ‘{print $2}‘)
  8. i=1
  9. while true
  10. do
  11. if [ $Master_Log_File = $Relay_Master_Log_File ] && [ $Read_Master_Log_Pos -eq $Exec_Master_Log_Pos ]
  12. then
  13. echo "ok"
  14. break
  15. else
  16. sleep 1
  17. if [ $i -gt 60 ]
  18. then
  19. break
  20. fi
  21. continue
  22. let i++
  23. fi
  24. done
  25. mysql -e "stop slave;"
  26. mysql -e "flush logs;GRANT ALL PRIVILEGES ON *.* TO ‘admin‘@‘%‘ IDENTIFIED BY ‘admin‘;flush privileges;"
  27. mysql -e "show master status;" > /tmp/master_status_$(date "+%y%m%d-%H%M").txt
backup.sh(状态改变为BACKUP后执行的脚本)

  1. # more backup.sh
  2. #!/bin/bash
  3. . /root/.bash_profile
  4. mysql -e "GRANT ALL PRIVILEGES ON *.* TO ‘admin‘@‘%‘ IDENTIFIED BY ‘1q2w3e4r‘;flush privileges;"
stop.sh(keepalived停止后后执行的脚本) (首先把admin密码更改掉) (其次,设置参数,保证不丢失数据) (最后,查看是否还有写操作,不论是否执行完毕,1分钟后都退出。)

  1. # more stop.sh
  2. #!/bin/bash
  3. . /root/.bash_profile
  4. mysql -e "GRANT ALL PRIVILEGES ON *.* TO ‘admin‘@‘%‘ IDENTIFIED BY ‘1q2w3e4r‘;flush privileges;"
  5. mysql -e "set global innodb_support_xa=1;"
  6. mysql -e "set global sync_binlog=1;"
  7. mysql -e "set global innodb_flush_log_at_trx_commit=1;"
  8. M_File1=$(mysql -e "show master status\G" | awk -F‘: ‘ ‘/File/{print $2}‘)
  9. M_Position1=$(mysql -e "show master status\G" | awk -F‘: ‘ ‘/Position/{print $2}‘)
  10. sleep 1
  11. M_File2=$(mysql -e "show master status\G" | awk -F‘: ‘ ‘/File/{print $2}‘)
  12. M_Position2=$(mysql -e "show master status\G" | awk -F‘: ‘ ‘/Position/{print $2}‘)
  13. i=1
  14. while true
  15. do
  16. if [ $M_File1 = $M_File2 ] && [ $M_Position1 -eq $M_Position2 ]
  17. then
  18. echo "ok"
  19. break
  20. else
  21. sleep 1
  22. if [ $i -gt 60 ]
  23. then
  24. break
  25. fi
  26. continue
  27. let i++
  28. fi
  29. done
时间: 2024-10-07 13:59:39

mysql+keepalived主从切换脚本 转的相关文章

MySQL数据库主从切换脚本自动化

#!/usr/bin/env python # -*- coding: utf-8 -*- import MySQLdb import time import sys class m_s: def __init__(self,host,user,password,port): self.host=host self.user=user self.passowrd=password self.port=port def getConn(self,db="mysql"): try: con

京东MySQL数据库主从切换自动化

1. 产生背景 随着京东业务的高速增长,数据的重要性对于京东来说重要程度不说自明,在信息时代,数据有着比人们更大的力量,数据库的价值可见一斑,数据库的存在为人们提供了更快的查询,那么为了更好地做到数据库的高可用,保证持续提供服务,简化DBA操作,节省数据库故障切换的时间,故开发此数据库主从切换自动化系统. 2. 实现原理 此系统基于MHA做数据库切换,结合京东数据库切换的特点,定制自己的切换系统.MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的

MySQL之主从切换

在一主多从的环境中,如主库为M,从库为S1.S2,当主库出现故障时,主从切换的详细步骤如下: 1 首先要保证所有从库已经执行了relay log中的全部更新,用以下语句查看: mysql> show processlist\G 直到看到下面的语句,表示全部更新执行完毕. Has read all relaylogwaiting for the slave I/O thread to update it 2 在所有从库上执行下面的语句: mysql> stop slave io_thread;

京东DBA 王伟 | MySQL数据库主从切换自动化

http://mp.weixin.qq.com/s?__biz=MjM5ODI5Njc2MA==&mid=2655808515&idx=1&sn=069d05a3bad6f67f400475ca6ad714c2&chksm=bd7421d48a03a8c274570da116945bfd6a2eb90615d8b7fba9d78e57890604bd1c415591f81d&mpshare=1&scene=23&srcid=01101Pn9HfMWE

mysql的主从切换

切换主从: 从库都已经执行完了relay log 中的全部更新: mysql> stop slave io_thread; Query OK, 0 rows affected (0.06 sec) mysql> show processlist\G *************************** 1. row *************************** Id: 6 User: system user Host: db: NULL Command: Connect Time:

mysql主从切换维护时的几点注意

随着业务量的不断增加,数据库的压力总是会越来越大的,如果是要对mysql数据库的硬件升级,势必是要对mysql主从做切换,mysql的主从复制的结构如果不借助第三方工具时做mysql的高可用,要做主从的切换是要做停机维护手动切换的,这里就以普通的一主一从的结构中简单的说一说mysql数据库主从切换的几个要注意的点: 1.server id以前看见很多人在做主从切换的时候没有注意到这一点,导致slave IO报错,包括自己也有过,这个还是要稍微注意下,尤其是在mysql的大规模集群下 2.在主从切

Keepalived 监控 mysql 主从切换

1).在两台机子上面分别安装 mysql , keepalived 2). keepalived 主从: 主:vim /etc/keepalived/keepalived.conf vrrp_instance VI_1 { state BACKUP    # 备用用 BACKUP interface eth2   #用的是哪个网卡 virtual_router_id 59  #虚拟路由地址必须一样,才能配置成一个组 priority 100   # 备用用 90 advert_int 1  #M

KeepAlived+MySQL互为主从

解决Master单点问题,两台mysql互为主备,双向replication.当一master挂了,则将slave切换为master,继续工作.好,给定两台机器 主机A:192.168.1.201 主机B:192.168.1.202 一.互为主从 1.配置 主机A上,vim /etc/my.cnf,添加: [mysqld] log-bin=mysql-bin server-id=1 #服务id要和B不同 binlog_do_db=db1 master-host = 192.168.1.202 #

Keepalived+Mysql互为主从高可用安装配置

Keepalived+Mysql互为主从高可用安装配置环境介绍:keepalived_vip=192.168.1.210    (写虚拟ip)mysql_master01      eth0:192.168.1.211  eth1:172.20.27.211 (1核1G)mysql_master02      eth0:192.168.1.212  eth1:172.20.27.212 (1核1G) 1.安装mysql数据库(所有节点安装)  //此处省略安装mysql服务2.编辑my.cnf配