最近一個項目需要做一個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