基於主主復制的mysql雙機熱備+keepalived實現高可用性


雙機熱備特指基於高可用系統中的兩台服務器的熱備,在國內基於兩台服務器的復制使用較多,故得名雙機熱備,雙機高可用按工作中的切換方式分為:主-備方式 (Active-Standby方式)和雙主機方式(Active-Active方式),主-備方式即指的是一台服務器處於某種業務的激活狀態(即 Active狀態),另一台服務器處於該業務的備用狀態(即Standby狀態)。而雙主機方式即指兩種不同業務分別在兩台服務器上互為主備狀態(即 Active-Standby和Standby-Active狀態)。

1、環境
Master1 192.168.1.135
Master2 192.168.1.136
Client 192.168.1.137


2、Master1操作授權
mysql->grant replication slave on *.* to 'admin'@'192.168.1.136' identified by 'aixocm'; 授權操作
mysql->flush privileges; 刷新權限
mysql->show master status\G; 查看此時的binlog日志文件名和pos號


3、Master2操作授權
mysql->grant replication slave on *.* to 'backup'@'192.168.1.135' identified by 'aixocm'; 授權操作
mysql->flush privileges; 同上
mysql->show master status\G; 同上


4、主1-135上操作
mysql->stop slave;
mysql->change master to master_host='192.168.1.136', master_user='backup', master_password='aixocm', master_log_file='mysql-bin.000006',master_log_pos=411; 這里的文件名和pos號就是上面Master1查看的具體內容
mysql->start slave;
mysql->show slave status\G;

開啟復制功能之后,如果你能看到Slave_IO_Runing:和slave_SQL_Running:這兩個都顯示yes,表示復制功能開啟正常,缺一不可


5、主2-136上操作
mysql->stop slave;
mysql->change master to master_host='192.168.1.135', master_user='admin', master_password='aixocm', master_log_file='mysql-bin.000002',master_log_pos=242;
mysql->start slave;
mysql->show slave status\G;
這里和上面的原理一致,就不累述了


6、主135 和136同時安裝keepalived
這是keepalived的官方網站:www.keepalived.org
# tar -xvf keepalived-1.1.20.tar.gz
# cd keepalived-1.1.20
#./configure --prefix=/usr/local/keepalived
#yum install openssl* 如果沒有安裝openssl請安裝
# make && make install
# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ 移動啟動腳本
# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# mkdir /etc/keepalived
# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ 復制配置文件
# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ 修改可執行二進制文件路徑


7、在Master上對keepalived配置文件進行相關配置
! Configuration File for keepalived

global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id master #此處填本機的主機名
}

vrrp_script check_mysqld {
script "/etc/keepalived/mysqlcheck/check_mysql.sh" #檢查MYSQL 復制狀態腳本
interval 2
weight 2
}

vrrp_instance VI_1 {
state BACKUP #這里主135和主136都寫上BACKUP
interface eth0 #vip對外的網絡接口
virtual_router_id 80 #標識號,主主要統一起來
priority 100 #優先級,越大優先級越高,主136上改成90
advert_int 2
nopreempt #不搶占模式,在優先級高的那台設置此參數

authentication {
auth_type PASS
auth_pass 1111
}

track_script {
check_mysqld #調用MYSQL腳本的函數
}

virtual_ipaddress {
192.168.1.200 dev eth0 ;設置vip,即虛擬ip地址,我的是在eth0網卡上
}
}
當Master1 down了,Master2接管了,Master1再次起來了,不會再成為master,也就是說不會再次搶占VIP。
否則master恢復了再接管的話,如果出現問題了,則切換兩次對業務來說並不好。
解決方法是:
state 都設置為Backup,在優先級高的那台設置參數nopreempt.
同樣,還要在在Maste2配置該文件,需要修改主機名,優先級等參數。


8、監控MYSQL 復制狀態的腳本,在Master1上,腳本位置在keepalived配置文件上有記錄。
#!/bin/bash
#function:監視mysql主從服務器狀態
#written by:alec

user=admin
host=192.168.1.135
password=aixocm

check_mysql() {
IO=`/usr/local/mysql/bin/mysql -u$user -p$password -h$host -e 'show slave status\G'|grep IO_Running|tr -s ' '|awk '{print $2}'|grep Yes|wc -l`
SQL=`/usr/local/mysql/bin/mysql -u$user -p$password -h$host -e 'show slave status\G'|grep SQL_Running|tr -s ' '|sed -n '1p'|awk '{print $2}'|grep Yes|wc -l`
if [ "$IO" -eq 1 ]&&[ "$SQL" -eq 1 ]
then
service keepalived status|grep pid
if [ $? -eq 0 ]
then
echo "服務已經啟動"
else
service keepalived start
if [ $? -eq 0 ]
then
echo "服務啟動成功"
else
echo "服務啟動失敗"
fi
fi
else
service keepalived status|grep pid
if [ $? -eq 0 ]
then
service keepalived stop
if [ $? -eq 0 ]
then
echo "服務關閉成功"
else
echo "服務關閉失敗"
fi
else
echo "服務已經關閉"
fi
fi
}
main(){
check_mysql
}
main;
同樣,在Master2上也需要該監控腳本,監控腳本需要能夠登陸到本地mysql的用戶名和密碼,在Master2上只需修改用戶名,主機名和密碼。需要注意的是,需要給腳本加上可執行的權限。


9、在Master1和Master2上遠程授權VIP登陸用戶
>grant all on *.* to test@'%' identified by 'aixocm';
擁有VIP地址的主機才是真正對外提供服務主機,遠程用戶通過VIP連接到真實的服務器上來
/etc/init.d/keepalived start ;兩台主機都啟動keepalived這個服務
VIP會首先出現在優先級高的Master1上,如下圖所示:



10 最后測試
用客戶機登錄服務器,讓擁有VIP的那台服務器也就是Master1宕機,我們這里只需要停止slave復制功能即可。
# mysql –utest –paixocm –h192.168.1.200 –P 3306
# stop slave;
# quit;
然后此時在查看ip地址,VIP這時候應該是沒有了的,跑到Master2下查看VIP地址,如果能夠看到VIP地址,說明你成功了,如下圖:






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM