探索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時可能報錯如下:
解決方法:
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時可能報錯如下:
解決方法:
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會自動漂移到備主上。