keepalived 實現mysql自動故障切換

環境:
        MySQL Master     192.168.135.139
        MySQL Slave       192.168.135.141
        VIP              192.168.135.188

先配置master-slave

https://blog.csdn.net/u010533511/article/details/88063523

master 和slave 都安裝 keepalived 

下載要安裝的包傳到服務器:http://www.keepalived.org/download.html

我測試目錄是:/www/package/keepalived-2.0.13.tar.gz

#tar -zxvf keepalived-2.0.13.tar.gz
#cd keepalived-2.0.13
#./configure
# make && make install

#cp /www/package/keepalived-2.0.13/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
#cp /www/package/keepalived-2.0.13/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

#mkdir /etc/keepalived

#cp /www/package/keepalived-2.0.13/keepalived/etc/keepalived/keepalived.conf  etc/keepalived/
#cp /usr/local/sbin/keepalived /usr/sbin/
#chkconfig --add keepalived
#chkconfig --level 345 keepalived on

安裝期間可能會需要一些依賴包,用yum直接安裝即可

主從的配置文件修改  

master的配置文件

#vim /etc/keepalived/keepalived.conf

global_defs {
   router_id MySQL-HA #運行Keepalived的機器的一個標識
} 

vrrp_script check_run {
script "/home/mysql/mysql_check.sh"  #配置業務進程監控腳本
interval 60  #設置腳本執行的時間間隔,秒
}

vrrp_sync_group VG1 {
group {
VI_1
}
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33 #要改爲當前服務器的值
    virtual_router_id 51
    priority 100  #權重
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    track_script {
    check_run
    }
    notify_master /home/mysql/master.sh
    notify_stop /home/mysql/stop.sh

    virtual_ipaddress {
        192.168.135.188
    }
}

 slave的keepalived配置文件:

#vim /etc/keepalived/keepalived.conf

global_defs {
   router_id MySQL-HA  #運行Keepalived的機器的一個標識
} 

vrrp_script check_run {
script "/home/mysql/mysql_check.sh"  #配置業務進程監控腳本
interval 60  #設置腳本執行的時間間隔,秒
}

vrrp_sync_group VG1 {
group {
VI_1
}
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33 #要改爲當前服務器的值
    virtual_router_id 51
    priority 90  #權重
    advert_int 1
    nopreempt 
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    track_script {
    check_run
    }
    notify_master /home/mysql/master.sh
    notify_stop /home/mysql/stop.sh

    virtual_ipaddress {
        192.168.135.188
    }
}

master與slave的keepalived配置文件中只有priority設置不同,master爲100,slave爲90,其它全一樣。

 /home/mysql/mysql_check.sh文件用以檢測MySQL服務是否正常,當發現連接不上mysql,自動把keepalived進程殺掉,讓VIP進行漂移.

vim /home/mysql/mysql_check.sh

#!/bin/bash
. /home/mysql/.bashrc
count=1

while true
do

mysql -uroot -S /data/mysql.sock -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

home/mysql/master.sh的作用是狀態改爲master以後執行的腳本。首先判斷複製是否有延遲,如果有延遲,等1分鐘後,不論是否有延遲,都並停止複製,並且記錄binlog和pos點.

vim /home/mysql/master.sh

#!/bin/bash

. /home/mysql/.bashrc

Master_Log_File=$(mysql -uroot -S /data/mysql.sock -e "show slave status\G" | grep -w Master_Log_File | awk -F": " '{print $2}')
Relay_Master_Log_File=$(mysql -uroot -S /data/mysql.sock -e "show slave status\G" | grep -w Relay_Master_Log_File | awk -F": " '{print $2}')
Read_Master_Log_Pos=$(mysql -uroot -S /data/mysql.sock -e "show slave status\G" | grep -w Read_Master_Log_Pos | awk -F": " '{print $2}')
Exec_Master_Log_Pos=$(mysql -uroot -S /data/mysql.sock -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 -uroot -S /data/mysql.sock -e "stop slave;"
mysql -uroot -S /data/mysql.sock -e "reset slave all;"
mysql -uroot -S /data/mysql.sock -e "reset master;"
mysql -uroot -S /data/mysql.sock -e "show master status;" > /tmp/master_status_$(date "+%y%m%d-%H%M").txt

home/mysql/stop.sh表示Keepalived停止以後需要執行的腳本。檢查是否還有複製寫入操作,最後無論是否執行完畢都退出。文件內容如下。

vim /home/mysql/stop.sh

#!/bin/bash

. /home/mysql/.bashrc

M_File1=$(mysql -uroot -S /data/mysql.sock -e "show master status\G" | awk -F': ' '/File/{print $2}')
M_Position1=$(mysql -uroot -S /data/mysql.sock -e "show master status\G" | awk -F': ' '/Position/{print $2}')
sleep 1
M_File2=$(mysql -uroot -S /data/mysql.sock -e "show master status\G" | awk -F': ' '/File/{print $2}')
M_Position2=$(mysql -uroot -S /data/mysql.sock -e "show master status\G" | awk -F': ' '/Position/{print $2}')

i=1

while true
do

if [ $M_File1 = $M_File1 ] && [ $M_Position1 -eq $M_Position2 ]
then
   echo "ok"
   break
else
   sleep 1

   if [ $i -gt 60 ]
   then
      break
   fi
   continue
   let i++
fi
done

 

分別在master上和slave上啓動keepalived進程。

/etc/init.d/keepalived start (開啓)

/etc/init.d/keepalived stop (開啓)

查看進程

查看vip

客戶端使用VIP連接數據庫,創建測試庫,插入數據。

當master的mysql掛掉後

會自動切換到slave 然後手動啓動 master 後

重新啓動keepalived(兩個服務器的都要重啓) 然後又會主從自動同步 可以配置成雙主結構,保證數據完整


keepalived.conf配置文件參數說明

group:設置同一組中的VRRP實例名,這裏只有一個實例VI_1。
        vrrp_instance配置VRRP實例。VRRP實例表示在上面開啓了VRRP協議。這個實例說明了VRRP的一些特性,比如主從、VRID等等。可以在每個網卡上開啓一個實例。VRRP實例主要定義vrrp_sync_group裏面的每個組的漂移IP等。

state:指定實例的初始狀態。在兩臺路由都啓動後,馬上會發生競爭,高priority的會競選爲Master,所以這裏的state並不表示這臺就一直是Backup。
interface:實例綁定的網卡。
virtual_router_id:VRID標記,值爲0..255,這裏使用默認的51。
priority:高優先級競選爲Master,Master要高於Backup至少50。這裏MySQL主從庫兩個優先級分別設置爲100和90,因此當Keepalived啓動後,MySQL主庫會被選爲Master。
advert_int:檢查間隔,這裏設置爲默認的1秒。
nopreempt:設置爲不搶佔,注意這個配置只能設置在state爲BACKUP的主機上。當MASTER出現問題後,BACKUP會競選爲新的MASTER,那麼當之前的MASTER重新在線後,是繼續成爲MASTER還是變成BACKUP呢?默認不設置不搶佔,那麼之前的MASTER起來後會繼續搶佔成爲MASTER。這樣的頻繁切換對於業務是不能容忍的,我們希望MASTER起來後成爲BACKUP,所以要設置不搶佔。又因爲nopreempt配置只能用在state爲BACKUP的主機上,因此MASTER的state也得設置爲BACKUP,也就是說192.168.135.139和192.168.135.141都要將state設置爲BACKUP。通過在兩臺BACKUP上面設置不同的priority,讓它們一起來就搶佔,高priority的192.168.135.139成爲最初的MASTER。
authentication:設置認證類型和認證密碼。 
auth_type:認證類型,支持PASS、AH兩種,通常使用PASS類型。
auth_pass:明文認證密碼。同一VRRP實例的MASTER與BACKUP使用相同的密碼才能正常通信。
track_script:設置追蹤腳本,這裏爲check_run,即調用vrrp_script中定義的腳本。 
notify_master:指定當切換到MASTER時執行的腳本。
notify_stop:VRRP停止以後執行的腳本。
virtual_ipaddress:指定漂移地址(VIP),也就是切換到MASTER時,這些IP或被添加,切換到BACKUP時,這些IP會被刪除。因此每臺服務器上可以不綁定任何虛擬地址,而都把它們放到virtual_ipaddress裏面,可以都多個。Keepalived會自動使用ip addr進行綁定。

參考:https://blog.csdn.net/wzy0623/article/details/80916567

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章