设为首页 收藏本站
查看: 845|回复: 0

[经验分享] mysql+keepalived主从切换脚本

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2018-12-30 11:14:15 | 显示全部楼层 |阅读模式
  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>
  •   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'@'%'>
  •   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'@'%'>
stop.sh(keepalived停止后后执行的脚本) (首先把admin密码更改掉) (其次,设置参数,保证不丢失数据) (最后,查看是否还有写操作,不论是否执行完毕,1分钟后都退出。)

  •   # more stop.sh
  •   #!/bin/bash

  •   . /root/.bash_profile


  •   mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%'>
  •   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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-657535-1-1.html 上篇帖子: keepalived vrrp_script的一些实例配置 下篇帖子: 编译keepalived时候(use ipvs framework:no)支持lvs的方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表