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

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

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

    MySQL数据库主从切换脚本自动化 本文转载自:https://blog.csdn.net/weixin_36135773/article/details/79514507 在一些实际环境中,如何实现 ...

  2. Spring AOP实现Mysql数据库主从切换(一主多从)

    设置数据库主从切换的原因:数据库中经常发生的是“读多写少”,这样读操作对数据库压力比较大,通过采用数据库集群方案, 一个数据库是主库,负责写:其他为从库,负责读,从而实现读写分离增大数据库的容错率.  ...

  3. nginx keepalived 主从切换

    注:  LVS + Keepalived  不知道为什么出现一个很郁闷的问题....... ------------------------------------------------------ ...

  4. Keepalived与MySQL互为主从自动切换配置

    为解决Mysql数据库单点问题,实现两台MySQL数据库互为主备,双向replication.当一Master出现问题,则将Slave切换为Master继续工作. 环境说明 系统版本:CentOS L ...

  5. mysql传统主从、双主复制+keepalived配置步骤

    mysql主从.主主复制(双主复制)配置步骤 一:MySQL复制: MySQL复制简介: 将master服务器中主数据库的ddl和dml操作通过二进制日志传到slaves服务器上,然后在master服 ...

  6. KeepAlived+MySQL互为主从

    http://blog.csdn.net/socho/article/details/51804720 解决Master单点问题,两台mysql互为主备,双向replication.当一master挂 ...

  7. mysql mha 主从自动切换 高可用

    mha(Master High Availability)目前在MySQL多服务器(超过二台),高可用方面是一个相对成熟的解决方案. 一,什么是mha,有什么特性 1. 主服务器的自动监控和故障转移 ...

  8. master_pos_wait函数与MySQL主从切换

    背景 主从切换是高可用MySQL架构的必要步骤(即使用不发生,也要有备无患).一般设置为双M(M1.M2),假设当前状态为写M1,而M2只读,切换的大致流程如下: 1.  停止应用写M1,将M1设置为 ...

  9. linux下nginx结合keepalived实现主从切换的配置

    linux下nginx结合keepalived实现主从切换的配置   解决方法: 实现一个主nginx宕机,请求转到另一个nginx中. 1.确保两台nginx已启动,假如端口分别是192.168.0 ...

随机推荐

  1. linux截取指定字符shell cut awk

    [root@mylab demo]# echo $var939f61b61978a589d9873e9ea7fdf201b213dec2[root@mylab demo]# echo ${var:0: ...

  2. Speed-BI数据分析案例:2016年7月汽车销量排行榜

    据中国汽车工业协会统计分析,2016年7月,汽车产销比上月均呈下降,同比呈较快增长.1-7月,汽车产销保持稳定增长,增幅比上半年继续提升. 7月,汽车生产195.96万辆,环比下降4.38%,同比增长 ...

  3. 第四篇 Replication:事务复制-订阅服务器

    本篇文章是SQL Server Replication系列的第四篇,详细内容请参考原文. 订阅服务器就是复制发布项目的所有变更将传送到的服务器.每一个发布需要至少一个订阅,但是一个发布可以有多个订阅. ...

  4. Android中颜色的设置

    方案一:新建xml文件,然后在java中用代码访问(xml文件可以直接访问) 1.在res->values文件夹下新建color.xml(这个文件中定义的代码是#RRGGBB) 2.在java类 ...

  5. Java基础之线程——管理线程同步代码块(BankOperation4)

    控制台程序. 除了同步类对象的方法之外,还可以把程序中的语句或代码块制定为synchronized,这种方式更强大,因为可以指定哪个对象从语句或代码块的同步中获益,而不像同步方法那样仅仅是包含代码的对 ...

  6. 深入理解JAVA I/O系列六:Linux中的IO模型

    IO模型 linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大致描述了数据从外部磁盘向运行中程序的内存中移动的过程. 用户空间.内核空间 现在操作系统都是采用虚拟存储器, ...

  7. Jenkins自动构建

    Jenkins is an award-winning, cross-platform, continuous integration and continuous delivery applicat ...

  8. Swift实战-豆瓣电台(五)播放音乐

    观看地址 http://v.youku.com/v_show/id_XNzMwODM0MzI0.html 在这节里面,我们简单学习了一下MediaPlayer的使用 引入媒体框架 import Med ...

  9. PostgreSQL/bin

    pg_receivexlog pg_receivexlog—以流的方式从一个PostgreSQL集簇得到事务日志 pg_receivexlog被用来从一个运行着的PostgreSQL集簇以流的方式得到 ...

  10. Lintcode: O(1) Check Power of 2

    Using O(1) time to check whether an integer n is a power of 2. Example For n=4, return true For n=5, ...