keepalive之mysql故障自动切换脚本

MySQL架构为master-slave(主从),master故障自动切换到slave上。当然也可以设置为双master,但这里有个弊端:就是当主的压力很大时,从上延时很大,比如落后2000秒,此时主挂了,从接管(VIP漂移到从),用户刚才发表的文章,此时因为同步延时大,还没复制过来,于是用户又发表了一篇文章,当原来的master修好后,因从的IO和SQL线程还在开启状态,还会继续同步刚才没有同步复制完的数据,这时有可能把用户新发表的文章更改掉,造成用户数据丢失。
<wbr>考虑到这种情况,我这里还是用的master-slave(主从)架构。</wbr>
<wbr>keepalive安装很简单,这里不再啰嗦。主要看下配置文件和脚本:</wbr>
<wbr># more /etc/keepalived/keepalived.conf <wbr></wbr></wbr>
<wbr>global_defs {<wbr></wbr></wbr>
<wbr><wbr>router_id KeepAlive_Mysql<wbr></wbr></wbr></wbr>
<wbr>} <wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>vrrp_script check_run {<wbr></wbr></wbr>
<wbr>script "/root/sh/mysql_check.sh"<wbr></wbr></wbr>
<wbr>interval 300<wbr></wbr></wbr>
<wbr>}<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>vrrp_sync_group VG1 {<wbr></wbr></wbr>
<wbr>group {<wbr></wbr></wbr>
<wbr>VI_1<wbr></wbr></wbr>
<wbr>}<wbr></wbr></wbr>
<wbr>}<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>vrrp_instance VI_1 {<wbr></wbr></wbr>
<wbr><wbr><wbr>state BACKUP<wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>interface eth0 <wbr><wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>virtual_router_id 51<wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>priority 100 <wbr><wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>advert_int 1<wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>nopreempt<wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>authentication {<wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr>auth_type PASS<wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr>auth_pass 1111<wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>}<wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>track_script {<wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>check_run<wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>}<wbr></wbr></wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr><wbr><wbr>notify_master /root/sh/master.sh<wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>notify_backup /root/sh/backup.sh<wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>notify_stop /root/sh/stop.sh<wbr></wbr></wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr><wbr><wbr>virtual_ipaddress {<wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr>192.168.8.150<wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>}<wbr></wbr></wbr></wbr></wbr>
<wbr>}<wbr></wbr></wbr>
<wbr></wbr>
<wbr>notify_master &lt;STRING&gt;|&lt;QUOTED-STRING&gt; <wbr><wbr># 状态改变为MASTER后执行的脚本</wbr></wbr></wbr>
<wbr>notify_backup &lt;STRING&gt;|&lt;QUOTED-STRING&gt; <wbr><wbr># 状态改变为BACKUP后执行的脚本</wbr></wbr></wbr>
<wbr>notify_fault &lt;STRING&gt;|&lt;QUOTED-STRING&gt; <wbr><wbr># 状态改变为FAULT后执行的脚本</wbr></wbr></wbr>
<wbr>notify_stop &lt;STRING&gt;|&lt;QUOTED-STRING&gt; <wbr><wbr># VRRP停止后后执行的脚本</wbr></wbr></wbr>
<wbr>notify &lt;STRING&gt;|&lt;QUOTED-STRING&gt; <wbr><wbr><wbr><wbr># (1)任意状态改变后执行的脚本</wbr></wbr></wbr></wbr></wbr>
<wbr>下面解释下这4个脚本的用法:</wbr>
<wbr>mysql_check.sh(健康检查脚本,当发现mysql连接不上,会把keepalive进程关闭,并切换。)</wbr>
<wbr># more mysql_check.sh <wbr></wbr></wbr>
<wbr>#!/bin/bash<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>. /root/.bash_profile<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>count=1<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>while true<wbr></wbr></wbr>
<wbr>do<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>mysql -e "show status;" &gt; /dev/null 2&gt;&amp;1<wbr></wbr></wbr>
<wbr>i=$?<wbr></wbr></wbr>
<wbr>ps aux | grep mysqld | grep -v grep &gt; /dev/null 2&gt;&amp;1<wbr></wbr></wbr>
<wbr>j=$?<wbr></wbr></wbr>
<wbr>if [ $i = 0 ] &amp;&amp; [ $j = 0 ]<wbr></wbr></wbr>
<wbr>then<wbr></wbr></wbr>
<wbr><wbr>exit 0<wbr></wbr></wbr></wbr>
<wbr>else<wbr></wbr></wbr>
<wbr><wbr>if [ $i = 1 ] &amp;&amp; [ $j = 0 ]<wbr></wbr></wbr></wbr>
<wbr><wbr>then<wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>exit 0<wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr>else<wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr>if [ $count -gt 5 ]<wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr>then<wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>break<wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr>fi<wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr>let count++<wbr></wbr></wbr></wbr>
<wbr><wbr>continue<wbr></wbr></wbr></wbr>
<wbr><wbr>fi<wbr></wbr></wbr></wbr>
<wbr>fi<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>done<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>/etc/init.d/keepalived stop<wbr></wbr></wbr>
<wbr>master.sh(状态改变为MASTER后执行的脚本) <wbr>(首先判断同步复制是否执行完毕,如果未执行完毕,等1分钟后,不论是否执行完毕,都跳过,并停止同步复制进程。) (其次,更改前端程序连接的业务账号admin的权限和密码,并记录当前切换以后的日志和POS点。)</wbr></wbr>
<wbr># more master.sh<wbr></wbr></wbr>
<wbr>#!/bin/bash<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>. /root/.bash_profile<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>Master_Log_File=$(mysql -e "show slave status\G" | grep -w Master_Log_File | awk -F": " '{print $2}')<wbr></wbr></wbr>
<wbr>Relay_Master_Log_File=$(mysql -e "show slave status\G" | grep -w Relay_Master_Log_File | awk -F": " '{print $2}')<wbr></wbr></wbr>
<wbr>Read_Master_Log_Pos=$(mysql -e "show slave status\G" | grep -w Read_Master_Log_Pos | awk -F": " '{print $2}')<wbr></wbr></wbr>
<wbr>Exec_Master_Log_Pos=$(mysql -e "show slave status\G" | grep -w Exec_Master_Log_Pos | awk -F": " '{print $2}')<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>i=1<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>while true<wbr></wbr></wbr>
<wbr>do<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>if [ $Master_Log_File = $Relay_Master_Log_File ] &amp;&amp; [ $Read_Master_Log_Pos -eq $Exec_Master_Log_Pos ]<wbr></wbr></wbr>
<wbr>then<wbr></wbr></wbr>
<wbr><wbr>echo "ok"<wbr></wbr></wbr></wbr>
<wbr><wbr>break<wbr></wbr></wbr></wbr>
<wbr>else<wbr></wbr></wbr>
<wbr><wbr>sleep 1<wbr></wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr><wbr>if [ $i -gt 60 ]<wbr></wbr></wbr></wbr>
<wbr><wbr>then<wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>break<wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr>fi<wbr></wbr></wbr></wbr>
<wbr><wbr>continue<wbr></wbr></wbr></wbr>
<wbr><wbr>let i++<wbr></wbr></wbr></wbr>
<wbr>fi<wbr></wbr></wbr>
<wbr>done<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>mysql -e "stop slave;"<wbr></wbr></wbr>
<wbr>mysql -e "flush logs;GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY 'admin';flush privileges;"<wbr></wbr></wbr>
<wbr>mysql -e "show master status;" &gt; /tmp/master_status_$(date "+%y%m%d-%H%M").txt<wbr></wbr></wbr>
<wbr>backup.sh(状态改变为BACKUP后执行的脚本)</wbr>
<wbr># more backup.sh <wbr></wbr></wbr>
<wbr>#!/bin/bash<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>. /root/.bash_profile<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY '1q2w3e4r';flush privileges;"<wbr></wbr></wbr>
<wbr>stop.sh(keepalived停止后后执行的脚本) (首先把admin密码更改掉) (其次,设置参数,保证不丢失数据) (最后,查看是否还有写操作,不论是否执行完毕,1分钟后都退出。)</wbr>
<wbr># more stop.sh <wbr></wbr></wbr>
<wbr>#!/bin/bash<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>. /root/.bash_profile<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY '1q2w3e4r';flush privileges;"<wbr></wbr></wbr>
<wbr>mysql -e "set global innodb_support_xa=1;"<wbr></wbr></wbr>
<wbr>mysql -e "set global sync_binlog=1;"<wbr></wbr></wbr>
<wbr>mysql -e "set global innodb_flush_log_at_trx_commit=1;"<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>M_File1=$(mysql -e "show master status\G" | awk -F': ' '/File/{print $2}')<wbr></wbr></wbr>
<wbr>M_Position1=$(mysql -e "show master status\G" | awk -F': ' '/Position/{print $2}')<wbr></wbr></wbr>
<wbr>sleep 1<wbr></wbr></wbr>
<wbr>M_File2=$(mysql -e "show master status\G" | awk -F': ' '/File/{print $2}')<wbr></wbr></wbr>
<wbr>M_Position2=$(mysql -e "show master status\G" | awk -F': ' '/Position/{print $2}')<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>i=1<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>while true<wbr></wbr></wbr>
<wbr>do<wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr>if [ $M_File1 = $M_File2 ] &amp;&amp; [ $M_Position1 -eq $M_Position2 ]<wbr></wbr></wbr>
<wbr>then<wbr></wbr></wbr>
<wbr><wbr>echo "ok"<wbr></wbr></wbr></wbr>
<wbr><wbr>break<wbr></wbr></wbr></wbr>
<wbr>else<wbr></wbr></wbr>
<wbr><wbr>sleep 1<wbr></wbr></wbr></wbr>
<wbr><wbr></wbr></wbr>
<wbr><wbr>if [ $i -gt 60 ]<wbr></wbr></wbr></wbr>
<wbr><wbr>then<wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>break<wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr>fi<wbr></wbr></wbr></wbr>
<wbr><wbr>continue<wbr></wbr></wbr></wbr>
<wbr><wbr>let i++<wbr></wbr></wbr></wbr>
<wbr>fi<wbr></wbr></wbr>
<wbr>done</wbr>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值