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

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

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

# more /etc/keepalived/keepalived.conf

global_defs {

router_id KeepAlive_Mysql

}

vrrp_script check_run {

script "/root/sh/mysql_check.sh"

interval 300

}

vrrp_sync_group VG1 {

group {

VI_1

}

}

vrrp_instance VI_1 {

state BACKUP

interface eth0

virtual_router_id 51

priority 100

advert_int 1

nopreempt

authentication {

auth_type PASS

auth_pass 1111

}

track_script {

check_run

}

notify_master /root/sh/master.sh

notify_backup /root/sh/backup.sh

notify_stop /root/sh/stop.sh

virtual_ipaddress {

192.168.8.150

}

}

notify_master | # 状态改变为MASTER后执行的脚本

notify_backup | # 状态改变为BACKUP后执行的脚本

notify_fault | # 状态改变为FAULT后执行的脚本

notify_stop | # VRRP停止后后执行的脚本

notify | # (1)任意状态改变后执行的脚本

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

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

# more mysql_check.sh

#!/bin/bash

. /root/.bash_profile

count=1

while true

do

mysql -e "show status;" > /dev/null 2>&1

i=$?

ps aux | grep mysqld | grep -v grep > /dev/null 2>&1

j=$?

if [ $i = 0 ] && [ $j = 0 ]

then

exit 0

else

if [ $i = 1 ] && [ $j = 0 ]

then

exit 0

else

if [ $count -gt 5 ]

then

break

fi

let count++

continue

fi

fi

done

/etc/init.d/keepalived stop

master.sh(状态改变为MASTER后执行的脚本)  (首先判断同步复制是否执行完毕,如果未执行完毕,等1分钟后,不论是否执行完毕,都跳过,并停止同步复制进程。) (其次,更改前端程序连接的业务账号admin的权限和密码,并记录当前切换以后的日志和POS点。)

# more master.sh

#!/bin/bash

. /root/.bash_profile

Master_Log_File=$(mysql -e "show slave status\G" | grep -w Master_Log_File | awk -F": " '{print $2}')

Relay_Master_Log_File=$(mysql -e "show slave status\G" | grep -w Relay_Master_Log_File | awk -F": " '{print $2}')

Read_Master_Log_Pos=$(mysql -e "show slave status\G" | grep -w Read_Master_Log_Pos | awk -F": " '{print $2}')

Exec_Master_Log_Pos=$(mysql -e "show slave status\G" | grep -w Exec_Master_Log_Pos | awk -F": " '{print $2}')

i=1

while true

do

if [ $Master_Log_File = $Relay_Master_Log_File ] && [ $Read_Master_Log_Pos -eq $Exec_Master_Log_Pos ]

then

echo "ok"

break

else

sleep 1

if [ $i -gt 60 ]

then

break

fi

continue

let i++

fi

done

mysql -e "stop slave;"

mysql -e "flush logs;GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY 'admin';flush privileges;"

mysql -e "show master status;" > /tmp/master_status_$(date "+%y%m%d-%H%M").txt

backup.sh(状态改变为BACKUP后执行的脚本)

# more backup.sh

#!/bin/bash

. /root/.bash_profile

mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY '1q2w3e4r';flush privileges;"

stop.sh(keepalived停止后后执行的脚本) (首先把admin密码更改掉) (其次,设置参数,保证不丢失数据) (最后,查看是否还有写操作,不论是否执行完毕,1分钟后都退出。)

# more stop.sh

#!/bin/bash

. /root/.bash_profile

mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY '1q2w3e4r';flush privileges;"

mysql -e "set global innodb_support_xa=1;"

mysql -e "set global sync_binlog=1;"

mysql -e "set global innodb_flush_log_at_trx_commit=1;"

M_File1=$(mysql -e "show master status\G" | awk -F': ' '/File/{print $2}')

M_Position1=$(mysql -e "show master status\G" | awk -F': ' '/Position/{print $2}')

sleep 1

M_File2=$(mysql -e "show master status\G" | awk -F': ' '/File/{print $2}')

M_Position2=$(mysql -e "show master status\G" | awk -F': ' '/Position/{print $2}')

i=1

while true

do

if [ $M_File1 = $M_File2 ] && [ $M_Position1 -eq $M_Position2 ]

then

echo "ok"

break

else

sleep 1

if [ $i -gt 60 ]

then

break

fi

continue

let i++

fi

done

mysql主从切换脚本_mysql+keepalived主从切换脚本 转相关推荐

  1. linux+mysql高并发测试_MySQL压力测试shell脚本

    MySQL自带了压力测试工具mysqlslap,所以我们可以不用自己编写程序来测试Mysql读取的压力.压力测试shell脚本如下: #!/bin/sh while true do mysqlslap ...

  2. mysql 5.72 安装_mysql 5.7安装脚本

    1 [root@HE2 ~]# cat mysql_auto_install.sh 2 ###### 二进制自动安装数据库脚本root密码MANAGER将脚本和安装包放在/root目录即可###### ...

  3. mysql主从数据库设计_mysql数据库主从库镜像原理及配置

    最近有个项目需要在vmware虚拟机上安装mysql,由于生产环境的要求需要有必要,如果做成VM虚机操作系统层HA,需要用到虚拟共享总线,而这将会使VM丧失vmtion特性.于是选择不做OS层的高可用 ...

  4. mysql搭建主从的目的_mysql搭建主从

    mysql主从搭建 搭建mysql主从的目的是让一台mysql作为主数据库,一台或多台mysql作为从数据库,主数据库只负责数据的写入,从数据库只负责数据的查询(读写分离),且主从数据库是实时同步的, ...

  5. mysql cluster 设置单向复制_mysql单向主从配置

    1.环境要求 操作系统:centOS6.5或以上 Mysql版本:mysql5.5 主机配置:4核CPU.4G内存 2.主从复制的方式 mysql5.6开始主从复制有两种方式:基于日志(binlog) ...

  6. mysql数据库主从不同步_mysql数据库主从不同步的解决方法

    故障描述: 进入从数据库 mysql> show slave status\G; 结果如下: ... Slave_IO_Running: Yes Slave_SQL_Running: No La ...

  7. mysql主从复制巡检脚本_mysql主从复制监控shell脚本

    ########本脚本应用在生产环境中,是运用mysql主从的基础上######## vi mysqlm-s.sh #!/bin/bash ip=`ifconfig eth0|sed -n 2p|aw ...

  8. mysql二进制日志管理_MYSQL二进制日志管理脚本

    MYSQL二进制日志管理脚本脚本原理是每小时对进行flush生成新的二进制日志,将二进制日志备份至NFS,并压缩存放:#!/bin/bash#Purpose:管理二进制日志,每小时刷新二进制日志,并将 ...

  9. mysql死锁检测算法_MySQL 8 死锁检测脚本

    MySQL 8 记录死锁关的几张表有所变化,重新写一个脚本,便于在出现问题的时候快速处置问题. 死锁示意图 死锁相关的表 information_schema.INNODB_TRX `performa ...

最新文章

  1. Django REST framework的一些奇巧淫技(干货!!!)
  2. SpringBoot使用JdbcTemplate
  3. 计算机如何改变沟通方式,雅思阅读模拟题:计算机改变沟通方式
  4. 多目标机器学习_NIPS2018 - 用多目标优化解决多任务学习
  5. 深度学习(五十一)变分贝叶斯自编码器(上)
  6. macbook历代_苹果MacBook Pro为什么越来越贵?历代回顾与新MBP简评
  7. Knockout事件传递参数的几种方式
  8. vc 调试mysql_MySQL数据库的安装调试和VC实现
  9. ubuntu18.04多版本opencv
  10. MySQL之Got fatal error 1236 from master when reading data from binary log
  11. 《机械制造工艺学》课程设计任务书
  12. struts2 中 Actionsupport类的作用
  13. 读博总结的总结:读博的那些事儿
  14. 开课吧 python与人工智能 下载_开课吧app|开课吧手机版下载v2.3.6安卓版 - 欧普软件下载...
  15. 【转】Mac下 如何配置虚拟机软件Parallel Desktop--超详细
  16. ObjectARX开发笔记(一)——分别使用AcEdInputPointFilter和AcEdInputPointMonitor实现光标提示功能
  17. WiFi的2.4G、5G、6G频段
  18. POJ3107 Godfather树的重心
  19. 技术一旦被用来作恶,究竟会有多可怕?
  20. QML控件类型:Menu

热门文章

  1. idea docker插件安装及使用
  2. 让你的网页引入思源字体
  3. 泼辣修图教程:如何通过Polarr Photo打造艳丽夕阳效果
  4. 如果程序员是士兵,编程语言是武器,那么每种语言都是什么武器?
  5. 成功使用Python制作家庭财务健康诊断
  6. js中date日期的使用总结
  7. 5个方法教你苹果手机怎么截长图!
  8. java_入门基础笔记
  9. php时间戳选取设置(选取地理位置不同时间不同)
  10. vue实现路由懒加载,react实现路由懒加载