[SHELL]mysql主從+keepalived線上恢複解決方案

來源:互聯網
上載者:User

最近一個項目需要做一個mysql+keepalived高可用主從同步,配起來當然輕車熟路,但想到如何在主庫掛掉,從庫接管後,以最快的速度恢複資料,並讓主庫重新接管,所以整理了下思路,編寫了如下指令碼,供大家參考

mysql主從,以及keepalived高可用配置本博傳送門:

http://showerlee.blog.51cto.com/2047005/1220801

http://showerlee.blog.51cto.com/2047005/1188549


一.備份從庫當前資料庫

注:以下的所有配置需要在資料庫未運轉狀態下進行,建議做一個iptables規則禁止非管理員IP訪問主從伺服器IP,以及VIP,這樣既能保證管理員可SSH遠程登陸配置,又能恢複主從環境,待配置完成後解除禁止即可。

# vi /etc/rc.d/mysql_bak.sh

-------------------------

#!/bin/bash


# 環境變數

PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH

export LANG=C


# 日常備份目錄

basedir=/backup/daily/


# 資料庫賬戶

user=root

passwd=123456


# mysql備份目錄

mysql_db_bak=$basedir/$(date +%F_%H%M)

[ ! -d "$mysql_db_bak" ] && mkdir -p $mysql_db_bak


# mysql下所有庫名稱

db_name=("information_schema" "mysql" "test_db1" "test_db2" "test_db3" "test_db4")


# 1.備份MySQL資料庫

for((i=0; i!=${#db_name[@]}; ++i))

{

mysqldump -u $user -p$passwd --opt --skip-lock-tables --flush-logs --database ${db_name[i]} > $mysql_db_bak/${db_name[i]}.sql

}

-------------------------


二.複製從192.168.7.9)Database Backup到主庫192.168.7.12)

# vi /etc/rc.d/scp_mysql.sh

----------------------

#/bin/bash

# 環境變數

PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH

scp /backup/daily/2013-09-10_1258/* 192.168.7.9:/tmp

----------------------


三.恢複主庫192.168.7.9)

# vi /etc/rc.d/recover_mysql.sh

------------------------------------

#/bin/bash

# 環境變數

PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH

export LANG=C


# 資料庫賬戶

user=root

passwd=123456


# # mysql下所有庫名稱

db_name=("information_schema" "mysql" "test_db1" "test_db2" "test_db3" "test_db4")


# 恢複MySQL資料庫

cd /tmp

for((i=0; i!=${#db_name[@]}; ++i))

{

mysql -u $user -p$passwd -e "drop database ${db_name[i]};"

mysql -u $user -p$passwd -e "create database ${db_name[i]};"

mysql -u $user -p$passwd ${db_name[i]} < ${db_name[i]}.sql

}


# 開啟從庫

mysql -u $user -p$passwd -e "stop slave;"

mysql -u $user -p$passwd -e "reset slave;"

# 設定從庫串連主庫的相關參數,可利用相關命令查看

mysql -u $user -p$passwd -e "change master to master_host='192.168.7.9',master_user='slave',master_password='123456#',master_log_file='bin.000029',master_log_pos=106 ";

mysql -u $user -p$passwd -e "start slave;"

# 查看主從是否串連成功

mysql -u $user -p$passwd -e "show slave status\G;"

------------------------------------


四.查看主從同步資訊

1.查看主庫binlog日誌以及位移量

# mysql -u root -p123456 -e "show master status"

2.查看從庫是否串連到主庫

# mysql -u root -p123456 -e " show slave status\G;"


注:實際操作中發現,一旦VIP切換後有一定幾率造成主從伺服器都會同時擷取到該虛IP,導致主從資料庫衝突,無論重啟keepalived與否都無法幹掉該VIP,目前我的臨時解決方案是將兩台伺服器均重新啟動,大家如果有更好的方法請留言告知我,不勝感謝。


後續:

在網上翻閱大量資料,初步判斷VIP切換後造成的衝突是因為在觸發切換動作時使用的pkill keepalived 來殺掉keepaliaved進程,造成系統只是殺掉keepalived自身進程,並未來得及切換VIP,

目前的解決方案是使用正規的keepalived啟動指令碼/etc/init.d/keepalived stop 來關閉

初步測試未發現異常。。。


如果出現主從在切換VIP時,出現了主的VIP未自動關閉,從的正常開啟,導致都擷取到VIP,造成互相衝突的情況,可手動輸入如下命令刪除一方的VIP地址

# ip addr del "虛擬ip" dev eth0

但此方法只是一個臨時的解決方案,當手動刪除VIP後,重啟keepalived服務會無法正常開啟vip,需要重啟伺服器方能恢複。


-----------大功告成------------

本文出自 “一路向北” 部落格,請務必保留此出處http://showerlee.blog.51cto.com/2047005/1298160

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.