探索MySQL高可用架構之MHA(6)

            探索MySQL高可用架探索MySQL高可用架構之MHA(6)

-----構建mysql高可用系列(共9篇)

    上一篇文章介紹了本次架構的Atlas讀寫分離!

    本篇文章主要介紹本次架構中的keepalive部分!


    什麼是Keepalived呢????

        keepalived是一款c語言寫的實現在linux系統上實現負載均衡和高可用的軟件。它遵從於GNU是一款優秀的開源軟件。keepalived觀其名可知,保持存活,在網絡裏面就是保持在線了,也就是所謂的高可用或熱備,用來防止單點故障的發生。

    兩個關鍵詞的解釋

        負載均衡

        keepalived內置了對ipvs函數的調用支持。可以直接在keepalived中按照語法配置ipvs然後keepalived就可以實現對ipvs的配置。

        高可用

        keepalived是以VRRPVirtual Router Redundancy Protocol協議爲實現基礎的即虛擬路由冗餘協議。虛擬路由冗餘協議可以認爲是實現路由器高可用的協議即將N臺提供相同功能的路由器組成一個路由器組這個組裏面有一個master和多個backupmaster上面有一個對外提供服務的vip該路由器所在局域網內其他機器的默認路由爲該vipmaster會發組播當backup收不到vrrp包時就認爲master宕掉了這時就需要根據VRRP的優先級來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。

        本套架構中keepalive的作用????

        由於mysql+replication方案中master和slave的關係是一對多的關係,整個系統中只有一個master節點(寫入節點),多個slave節點,那麼master節點一旦down機後,整個系統的數據寫入操作將癱瘓,對系統造成嚴重後果。爲此引入了keepalive工具,讓這個系統的master和slave關係是多對多的關係,對master節點進行雙機熱備,以達到整個系統的高可用性。其中keepalive工具負責對兩個master節點進行不間斷監聽,一旦工作中的master節點停止工作後,那麼備份master節點就會接管 ,讓這個系統正常工作。向外提供一個虛擬ip以供proxy訪問master,虛擬ip對應了兩個實ip的maser節點。

    下面就讓我們開始操作吧:

        源碼包安裝keepalive

tar zxf keepalived-1.2.2.tar.gz     #解壓源碼包
cd keepalived-1.2.2        #進入目錄
./configure --sysconf=/etc --with-kernel-dir=/usr/src/kernels/2.6.18-164.el5-x86_64
#configure編譯
make && make install      #安裝
cp /usr/local/sbin/keepalived /sbin/keepalived    #拷貝可執行命令
service keepalived start        #啓動keepalive服務
service keepalived stop    #關閉keepalive服務

        make時可能報錯如下:

wKioL1TcGB-CFiMXAAKsBC9pdvs569.jpg

        解決方法:

cd keepalived-1.2.2    #進入源碼目錄
vi keepalived/libipvs-2.6/ip_vs.h    #修改如下
(1)#include <linux/types.h>        /* For __beXX types in userland */
#找到上面這一行
(2)#include <sys/types.h>
#把(1)這一行,放在(2)代碼下面,接下來順利make了。
vim /etc/keepalived/keepalived.conf    #修改如下

       編輯keepalived資源配置文件

! Configuration File for keepalived
global_defs {
   router_id MYSQL-ha       #爲router_id命名
}
vrrp_script check_running {
       script"/etc/keepalived/keepalived_check_mysql.sh"   #判斷實例是running的腳本
       interval 5           #每5秒執行一次,判斷實例是running的腳本
}
vrrp_instance PWRD_1 {      #指定vrrp_instance實例
       state BACKUP         #指定狀態爲備份
       interface bond0      #網絡端口爲bond0
      virtual_router_id 88   
       priority 150 #[另一臺是100]   #本機權重
       advert_int 1
       nopreempt             #[另一臺不加]    #當主機恢復時,不搶佔
       authentication{
       auth_type PASS        #密碼驗證
       auth_pass 99999
           }
      virtual_ipaddress {
             10.142.132.49   #指定VIP
       }
       track_script {
             check_running
       }
       notify_master/etc/keepalived/master.sh      #當前服務器爲主時,觖發執行的腳本
       notify_backup/etc/keepalived/slave.sh       #當前服務器爲備時,觖發執行的腳本
       notify_fault/etc/keepalived/notify_fault.sh #當前服務器出現問題時,觖發執行的腳本
       notify_stop/etc/keepalived/down.sh          #當前服務器爲down時,觖發執行的腳本
}

        編寫判斷mysql服務是否正常的腳本

vim keepalived_check_mysql.sh #增加如下內容
#!/bin/bash
MYSQL=/app/mysql/bin/mysql #指定mysql命令
MYSQL_HOST=localhost       #指定主機IP
MYSQL_USER=root            #指定Mysql登錄用戶
MYSQL_PASSWORD=mysql       #指定Mysql登錄密碼
CHECK_COUNTS=3             #控制循環次數變量
  
#mysql is working MYSQL_OK is 0 , mysql isnot working MYSQL_OK is 1
MYSQL_OK=0                 #標識mysql狀態變量
  
function check_Mysql_Runing (){
  
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD}-e "show grants;" >/dev/null 2>&1
 #在操作系統層面,調用mysql命令
if [ $? = 0 ] ;then
        MYSQL_OK=0         #如果上面操作成功,證明Mysql正常
  
else
        MYSQL_OK=1         #如果上面操作不成功,證明Mysql不正常
  
fi
return $MYSQL_OK           #返回Mysql狀態
  
}
  
while [ $CHECK_COUNTS -ne 0 ]           #循環控制
  
do
        let"CHECK_COUNTS -= 1"          #CHECK_COUNTS變量做自減1
  
       check_Mysql_Runing               #調用上面的函數
  
        if [ $MYSQL_OK= 0 ] ; then      #MYSQL_OK=0,mysql工作正常
          
             echo "mysql is runing!"
  
             exit 0
        fi
  
        if [ $MYSQL_OK-eq 1 ] && [ $CHECK_COUNTS -eq 0 ]  
 #MYSQL_OK=1和CHECK_COUNTS=0,mysql沒有正常運行
        then
  
               echo "mysql is not runing!"
    
               exit 1
        fi
  
        sleep 1   #休眠1秒
done

        編寫當前服務器爲主時的腳本

vim /etc/keepalived/master.sh   #增加如下內容
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` change master status!!! " >> /etc/keepalived/change.log #輸出當前時間到日誌中

        編寫當前服務器爲備時的腳本

vim /etc/keepalived/slave.sh
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` change slave status!!!" >> /etc/keepalived/change.log #輸出當前時間到日誌中

         編寫當前服務器不正常時的腳本

vim /etc/keepalived/notify_fault.sh
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` change notify_fault status!!!" >>/etc/keepalived/change.log#輸出當前時間到日誌中
sleep 3   #休眠3秒
echo "#`date +"%Y-%m-%d%H:%M"` try startup mysql!!!" >> /etc/keepalived/change.log #輸出當前時間到日誌中     
service mysql start     #啓動Mysql服務器

         編寫當前服務器wodn時的腳本

vim /etc/keepalived/down.sh
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` keepalived is down!!!" >> /etc/keepalived/change.log #輸出當前時間到日誌中

         爲所有腳本授予可執行權限

chmod +x keepalived_check_mysql.sh
chmod +x /etc/keepalived/master.sh
chmod +x /etc/keepalived/slave.sh
chmod +x /etc/keepalived/notify_fault.sh
chmod +x /etc/keepalived/down.sh


        通過vip登錄Mysql服務器

(1) mysql -h10.142.132.49 -ulipengfei-plipengfei
SHOW VARIABLES LIKE 'server_id';  #查看當前是哪個mysql主機,當前mysql主庫
(2) 把mysql主庫停止
(3) mysql -h10.142.132.49 -ulipengfei-plipengfei
SHOW VARIABLES LIKE 'server_id';  #查看當前是哪個mysql主機,當前是mysql備主

可以看出主庫停了,vip會自動漂移到備主上。



構之MHA(6)


-----構建mysql高可用系列(共9篇)

    上一篇文章介紹了本次架構的Atlas讀寫分離!

    本篇文章主要介紹本次架構中的keepalive部分!


    什麼是Keepalived呢????

        keepalived是一款c語言寫的實現在linux系統上實現負載均衡和高可用的軟件。它遵從於GNU是一款優秀的開源軟件。keepalived觀其名可知,保持存活,在網絡裏面就是保持在線了,也就是所謂的高可用或熱備,用來防止單點故障的發生。

    兩個關鍵詞的解釋

        負載均衡

        keepalived內置了對ipvs函數的調用支持。可以直接在keepalived中按照語法配置ipvs然後keepalived就可以實現對ipvs的配置。

        高可用

        keepalived是以VRRPVirtual Router Redundancy Protocol協議爲實現基礎的即虛擬路由冗餘協議。虛擬路由冗餘協議可以認爲是實現路由器高可用的協議即將N臺提供相同功能的路由器組成一個路由器組這個組裏面有一個master和多個backupmaster上面有一個對外提供服務的vip該路由器所在局域網內其他機器的默認路由爲該vipmaster會發組播當backup收不到vrrp包時就認爲master宕掉了這時就需要根據VRRP的優先級來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。

        本套架構中keepalive的作用????

        由於mysql+replication方案中master和slave的關係是一對多的關係,整個系統中只有一個master節點(寫入節點),多個slave節點,那麼master節點一旦down機後,整個系統的數據寫入操作將癱瘓,對系統造成嚴重後果。爲此引入了keepalive工具,讓這個系統的master和slave關係是多對多的關係,對master節點進行雙機熱備,以達到整個系統的高可用性。其中keepalive工具負責對兩個master節點進行不間斷監聽,一旦工作中的master節點停止工作後,那麼備份master節點就會接管 ,讓這個系統正常工作。向外提供一個虛擬ip以供proxy訪問master,虛擬ip對應了兩個實ip的maser節點。

    下面就讓我們開始操作吧:

        源碼包安裝keepalive

tar zxf keepalived-1.2.2.tar.gz #解壓源碼包
cd keepalived-1.2.2             #進入目錄
./configure --sysconf=/etc --with-kernel-dir=/usr/src/kernels/2.6.18-164.el5-x86_64#configure編譯
make && make install            #安裝 
cp /usr/local/sbin/keepalived /sbin/keepalived    #拷貝可執行命令
service keepalived start        #啓動keepalive服務
service keepalived stop         #關閉keepalive服務

        make時可能報錯如下:


wKioL1TcGB-CFiMXAAKsBC9pdvs569.jpg

        解決方法:

cd keepalived-1.2.2    #進入源碼目錄
vi keepalived/libipvs-2.6/ip_vs.h    #修改如下
(1)#include <linux/types.h>        /* For __beXX types in userland */
#找到上面這一行
(2)#include <sys/types.h>
#把(1)這一行,放在(2)代碼下面,接下來順利make了。

        編輯keepalived資源配置文件

vim /etc/keepalived/keepalived.conf    #修改如下
! Configuration File for keepalived
global_defs {
   router_id MYSQL-ha    #爲router_id命名
}
vrrp_script check_running {
       script"/etc/keepalived/keepalived_check_mysql.sh"   #判斷實例是running的腳本
       interval 5        #每5秒執行一次,判斷實例是running的腳本
}
vrrp_instance PWRD_1 {      #指定vrrp_instance實例
       state BACKUP         #指定狀態爲備份
       interface bond0      #網絡端口爲bond0
      virtual_router_id 88   
       priority 150 #[另一臺是100]   #本機權重
       advert_int 1
       nopreempt #[另一臺不加]       #當主機恢復時,不搶佔
       authentication{
       auth_type PASS        #密碼驗證
       auth_pass 99999
           }
      virtual_ipaddress {
             10.142.132.49   #指定VIP
       }
       track_script {
             check_running
       }
       notify_master/etc/keepalived/master.sh      #當前服務器爲主時,觖發執行的腳本
       notify_backup/etc/keepalived/slave.sh       #當前服務器爲備時,觖發執行的腳本
       notify_fault/etc/keepalived/notify_fault.sh #當前服務器出現問題時,觖發執行的腳本
       notify_stop/etc/keepalived/down.sh          #當前服務器爲down時,觖發執行的腳本
}


        編寫判斷mysql服務是否正常的腳本

vim keepalived_check_mysql.sh   #增加如下內容
#!/bin/bash
MYSQL=/app/mysql/bin/mysql   #指定mysql命令
MYSQL_HOST=localhost         #指定主機IP
MYSQL_USER=root              #指定Mysql登錄用戶
MYSQL_PASSWORD=mysql         #指定Mysql登錄密碼
CHECK_COUNTS=3               #控制循環次數變量
  
#mysql is working MYSQL_OK is 0 , mysql isnot working MYSQL_OK is 1
MYSQL_OK=0                   #標識mysql狀態變量
  
function check_Mysql_Runing (){
  
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD}-e "show grants;" >/dev/null 2>&1
 #在操作系統層面,調用mysql命令
if [ $? = 0 ] ;then
        MYSQL_OK=0           #如果上面操作成功,證明Mysql正常
  
else
        MYSQL_OK=1           #如果上面操作不成功,證明Mysql不正常
  
fi
return $MYSQL_OK             #返回Mysql狀態
  
}
  
while [ $CHECK_COUNTS -ne 0 ]      #循環控制
  
do
        let"CHECK_COUNTS -= 1"     #CHECK_COUNTS變量做自減1
  
       check_Mysql_Runing          #調用上面的函數
  
        if [ $MYSQL_OK= 0 ] ; then #MYSQL_OK=0,mysql工作正常
          
             echo "mysql is runing!"
  
             exit 0
        fi
  
        if [ $MYSQL_OK-eq 1 ] && [ $CHECK_COUNTS -eq 0 ]  
 #MYSQL_OK=1和CHECK_COUNTS=0,mysql沒有正常運行
        then
  
               echo "mysql is not runing!"
    
               exit 1
        fi
  
        sleep 1   #休眠1秒
done

        編寫當前服務器爲主時的腳本

vim /etc/keepalived/master.sh   #增加如下內容
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` change master status!!! " >> /etc/keepalived/change.log #輸出當前時間到日誌中

        編寫當前服務器爲備時的腳本

vim /etc/keepalived/slave.sh
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` change slave status!!!" >> /etc/keepalived/change.log #輸出當前時間到日誌中

         編寫當前服務器不正常時的腳本

vim /etc/keepalived/notify_fault.sh
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` change notify_fault status!!!" >>/etc/keepalived/change.log#輸出當前時間到日誌中
sleep 3   #休眠3秒
echo "#`date +"%Y-%m-%d%H:%M"` try startup mysql!!!" >> /etc/keepalived/change.log #輸出當前時間到日誌中     
service mysql start     #啓動Mysql服務器
vim /etc/keepalived/down.sh
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` keepalived is down!!!" >> /etc/keepalived/change.log
#輸出當前時間到日誌中

       爲所有腳本授予可執行權限

chmod +x keepalived_check_mysql.sh
chmod +x /etc/keepalived/master.sh
chmod +x /etc/keepalived/slave.sh
chmod +x /etc/keepalived/notify_fault.sh
chmod +x /etc/keepalived/down.sh

        通過vip登錄Mysql服務器 

(1) mysql -h10.142.132.49 -ulipengfei-plipengfei
SHOW VARIABLES LIKE 'server_id';  #查看當前是哪個mysql主機,當前mysql主庫
(2) 把mysql主庫停止
(3) mysql -h10.142.132.49 -ulipengfei-plipengfei
SHOW VARIABLES LIKE 'server_id';  #查看當前是哪個mysql主機,當前是mysql備主

    可以看出主庫停了,vip會自動漂移到備主上。

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