Mycat - 高可用與負載均衡實現,滿滿的乾貨!

前情回顧mysql

Mycat - 實現數據庫的讀寫分離與高可用中咱們實現了mysql的讀寫分離與高可用,有幾個點咱們回顧下nginx

若是想學習Java工程化、高性能及分佈式、深刻淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友能夠加個人Java高級交流:854630135,羣裏有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給你們。算法

一、數據的同步在mysql層面實現的,mycat不負責任何的數據同步,咱們須要配置mysql的主從複製來實現數據的同步;sql

二、數據庫的讀寫分離是mycat最經常使用的場景之一,咱們的應用代碼只須要關注業務代碼,而不須要處理數據庫讀寫、分片問題,這些都由Mycat實現,簡化了開發;數據庫

三、讀寫分離每每伴隨着高可用,而Mycat同時支持這二者;後端

那是否是就天衣無縫了呢? 顯然還有點小瑕疵,此時咱們的Mycat是單點部署的,若是Mycat服務掛了,那麼整個數據庫端就掛了,整個應用也就不能正常服務了,那怎麼辦了? 很明顯,咱們須要實現Mycat的高可用,具體實現咱們往下看。centos

keepalived實現Mycat高可用bash

centos7_1 (192.168.1.110)上搭建mycat服務器

上篇博文中,咱們搭建的讀寫分離各組件關係以下網絡

Mycat - 高可用與負載均衡實現,滿滿的乾貨!

 

 

此時仍是單節點的mycat,咱們還須要搭建一個mycat,搭建過程能夠參考192.168.1.212上mycat的搭建,具體我就不演示了,搭建好以後各組件關係以下

Mycat - 高可用與負載均衡實現,滿滿的乾貨!

 

 

昨天咱們測試了master mysql宕機的狀況,後續的DML SQL與Select SQL都是走的slave mysql,因此此時mysql的主從複製已經被破環、mycat的writeHost也切換到了192.168.1.211,咱們須要從新配置mysql的主從複製,192.168.1.210還是主,192.168.1.211回退爲slave,並將192.168.1.212上mycat的writeHost進行還原(只須要將mycat/conf/dnindex.properties文件刪了便可);生產環境不要這麼處理,按上篇說的處理。

咱們來看下測試結果

Mycat - 高可用與負載均衡實現,滿滿的乾貨!

 

 

能夠看到,192.168.1.110上的mycat與192.168.1.212上的mycat具備徹底同樣的功能,但此時二者尚未任何聯繫,彼此也互不影響。咱們能夠在應用代碼中集成兩個mycat,由代碼控制mycat的高可用,這種方式可行但不可取,代碼應該更多的關注業務層,而不是處理數據庫層面的高可用問題。mycat的高可用應該就由更專業的組件來處理。

keepalived實現vip對外提供服務

VIP:192.168.1.200、master:192.168.1.2十二、backup:192.168.1.110

keepalived的搭建過程可參考:主從熱備+負載均衡(LVS + keepalived),這裏就不作詳細的演示了。

192.168.1.212(master)上keepalived.conf

global_defs {
 notification_email {
 997914490@qq.com
 }
 notification_email_from sns-lvs@gmail.com
 #smtp_server smtp.hysec.com
 #smtp_connection_timeout 30
 router_id mycat_master # 設置mycat master的id,在一個網絡應該是惟一的
}
vrrp_script chk_mycat_alive {
 script "/usr/local/src/mycat/check_pid.sh" # 返回狀態碼爲0表示正常,檢測腳本爲true;返回狀態碼非0表示異常,檢測腳本爲false
 interval 2 # 檢測腳本執行的間隔,單位是秒
 weight 20
}
vrrp_instance VI_1 {
 state MASTER # 指定keepalived的角色,MASTER爲主,BACKUP爲備
 interface eth0 # 當前進行vrrp通信的網絡接口卡(當前centos的網卡)
 virtual_router_id 66 # 虛擬路由編號,同集羣,主備必須一致
 priority 100 # 優先級,數值越大,獲取處理請求的優先級越高
 advert_int 1 # 檢查間隔,默認爲1s(vrrp組播週期秒數)
 authentication {
 auth_type PASS
 auth_pass 1111
 }
 track_script {
 chk_mycat_alive # 調用檢測腳本
 }
 virtual_ipaddress {
 192.168.1.200 # 定義虛擬ip(VIP),可多設,每行一個
 }
}

 192.168.1.110(backup)上keepalived.conf

global_defs {
 notification_email {
 997914490@qq.com
 }
 notification_email_from sns-lvs@gmail.com
 #smtp_server smtp.hysec.com
 #smtp_connection_timeout 30
 router_id mycat_backup # 設置mycat backup的id,在一個網絡應該是惟一的
}
vrrp_script chk_mycat_alive {
 script "/usr/local/src/mycat/check_pid.sh" #mycat檢測腳本
 interval 2 #(檢測腳本執行的間隔,單位是秒)
 weight 20
}
vrrp_instance VI_1 {
 state BACKUP # 指定keepalived的角色,MASTER爲主,BACKUP爲備
 interface enp0s3 # 當前進行vrrp通信的網絡接口卡(當前centos的網卡)
 virtual_router_id 66 # 虛擬路由編號,同集羣,主備必須一致
 priority 90 # 優先級,數值越大,獲取處理請求的優先級越高
 advert_int 1 # 檢查間隔,默認爲1s(vrrp組播週期秒數)
 authentication {
 auth_type PASS
 auth_pass 1111
 }
 track_script {
 chk_mycat_alive #(調用檢測腳本)
 }
 virtual_ipaddress {
 192.168.1.200 # 定義虛擬ip(VIP),可多設,每行一個
 }
}

mycat存活檢測腳本check_pid.sh

#!/bin/bash
count=`/usr/local/mycat/bin/mycat status |grep 'Mycat-server is running' | wc -l`
time=$(date "+%Y-%m-%d %H:%M:%S")
if [ $count = 0 ]; then
 echo "$time : count=$count, mycat is not running..." >> /var/log/keepalived_check.log
 exit 1 # 返回1說明腳本非正常執行,mycat不在運行中
else
 echo "$time : count=$count, mycat is running..." >> /var/log/keepalived_check.log
 exit 0 # 返回0說明腳本正常執行,mycat正在運行中
fi

腳本目錄:/usr/local/src/mycat/,給腳本可執行權限:[root@centos7-01 src]# chmod -R 755 mycat/check_pid.sh

各組件關係圖以下

Mycat - 高可用與負載均衡實現,滿滿的乾貨!

 

 

如上圖所示,外部應用向192.168.1.200發送sql請求,keepalived完成VIP到ip的映射,請求會落到具體的某個mycat上,再由mycat轉發到具體的mysql上。同一時刻只會有一個keepavlied處理VIP,通常而言是優先級高的keepalived會成爲master,負責VIP的映射。各組件配置好以後,咱們來看看測試結果

一、vip的正常綁定與切換

Mycat - 高可用與負載均衡實現,滿滿的乾貨!

 

 

一開始212和110都沒有啓動mycat,優先級分別是100,90,因此vip在212上,212成爲master,110成爲backup;接着咱們啓動了110上的mycat,檢測腳本返回0,vrrp_script中script爲true,此時110的權重=90+20,大於212的100,110搶佔vip成爲master,而212則降級成爲backup;而後咱們啓動了212上的mycat,212的權重=100+20,大於110的110,vip漂浮到212上,212成爲master,110成爲backup;最後咱們停了212上的mycat,權重=100,vip又漂到了110上。若是咱們接着停了110上的mycat,則vip又會漂到212上。

權重 = priority + weight * script的結果(腳本執行返回0,script則爲true,不然script爲false),權重大的搶佔到vip,成爲master;殺掉keepalived進程,vip也會進行正確的轉移,具體我就不展現測試結果,你們能夠自行去測試。

二、mycat高可用

Mycat - 高可用與負載均衡實現,滿滿的乾貨!

 

 

咱們經過vip能夠進行正常的sql請求,當212上的mycat停了,vip漂到了110上,經過vip仍然能夠進行sql請求,應用端根本感知不到後端vip的漂移、mycat的切換,實現了mycat的高可用。

這種方案已經能夠知足大多數的應用場景了,master上的mycat對外服務,backup上的mycat僅做爲備用以防master宕機,backup上的mycat基本上不提供服務,就是起到一個以防萬一的做用,併發量不高的應用採用此種方案就能夠了。若是併發量高了,master上的mycat壓力太大,那咱們就須要考慮將backup上的mycat也利用起來了,並作一個負載均衡,減輕master上的mycat壓力,並充分利用backup上的mycat,具體實現請往下看。

lvs實現Mycat的負載均衡

Mycat的高可用是實現了,但美中不足的是沒有物盡其用,咱們不難發現,Mycat的兩個節點其實只有一個對外服務,另外一個徹底備用(以備基本不會發生的宕機),宕機的機率原本就小,備用機基本至關於沒用了,那可不能夠將備用機利用起來了? 咱們能夠將主備Mycat都利用起來,並進行負載均衡,減少主Mycat的壓力,若是其中一個節點宕機了,則由另外一個節點徹底接管,繼續正常提供服務。

Mycat - 高可用與負載均衡實現,滿滿的乾貨!

 

 

組件結構圖如上所示,keepalived負責lvs的健康檢測與高可用,lvs負責mycat的負載均衡與心跳檢測。若是服務器不夠,keepalived、lvs和mycat能夠部署在一塊兒,但不推薦,組件都部署在同一個服務器上,風險太大,分散部署,能夠下降風險。keepalived + lvs的具體部署過程可參考主從熱備+負載均衡(LVS + keepalived),具體配置文件以下

192.168.1.214(master)上keepalived.conf

global_defs {
 notification_email {
 997914490@qq.com
 }
 notification_email_from sns-lvs@gmail.com
 #smtp_server smtp.hysec.com
 #smtp_connection_timeout 30
 router_id lvs_master # 設置lvs master的id,在一個網絡應該是惟一的
}
vrrp_instance VI_1 {
 state MASTER # 指定keepalived的角色,MASTER爲主,BACKUP爲備
 interface eth0 # 當前進行vrrp通信的網絡接口卡(當前centos的網卡)
 virtual_router_id 66 # 虛擬路由編號,主從要一致
 priority 100 # 優先級,數值越大,獲取處理請求的優先級越高
 advert_int 1 # 檢查間隔,默認爲1s(vrrp組播週期秒數)
 authentication {
 auth_type PASS
 auth_pass 1111
 }
 virtual_ipaddress {
 192.168.1.200 # 定義虛擬ip(VIP),可多設,每行一個
 }
}
virtual_server 192.168.1.200 8066 { #設置虛擬服務器,須要指定虛擬IP地址和服務端口,IP與端口之間用空格隔開
 delay_loop 6 #設置運行狀況檢查時間,單位是秒
 lb_algo rr #設置負載調度算法,這裏設置爲rr,即輪詢算法
 lb_kind DR #設置LVS實現負載均衡的機制,有NAT、TUN、DR三個模式可選
 nat_mask 255.255.255.0
 persistence_timeout 0 #會話保持時間,單位是秒;同一IP x秒內的請求都發到同個real server
 protocol TCP #指定轉發協議類型,有TCP和UDP兩種
 
 real_server 192.168.1.212 8066 { #配置服務節點1,須要指定real server的真實IP地址和端口,IP與端口之間用空格隔開
 weight 3 #配置服務節點的權值,權值大小用數字表示,數字越大,權值越高,設置權值大小能夠爲不一樣性能的服務器
 TCP_CHECK { #realserver的狀態檢測設置部分
 connect_timeout 10 #表示10秒無響應超時
 nb_get_retry 3 #表示重試次數
 delay_before_retry 3 #表示重試間隔
 }
 }
 real_server 192.168.1.110 8066 {
 weight 3
 TCP_CHECK {
 connect_timeout 10
 nb_get_retry 3
 delay_before_retry 3
 }
 }
}

192.168.1.213(backup)上keepalived.conf

若是想學習Java工程化、高性能及分佈式、深刻淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友能夠加個人Java高級交流:854630135,羣裏有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給你們。

global_defs {
 notification_email {
 997914490@qq.com
 }
 notification_email_from sns-lvs@gmail.com
 #smtp_server smtp.hysec.com
 #smtp_connection_timeout 30
 router_id lvs_backup # 設置lvs backup的id,在一個網絡應該是惟一的
}
vrrp_instance VI_1 {
 state MASTER # 指定keepalived的角色,MASTER爲主,BACKUP爲備
 interface eth0 # 當前進行vrrp通信的網絡接口卡(當前centos的網卡)
 virtual_router_id 66 # 虛擬路由編號,主從要一致
 priority 100 # 優先級,數值越大,獲取處理請求的優先級越高
 advert_int 1 # 檢查間隔,默認爲1s(vrrp組播週期秒數)
 authentication {
 auth_type PASS
 auth_pass 1111
 }
 virtual_ipaddress {
 192.168.1.200 # 定義虛擬ip(VIP),可多設,每行一個
 }
}
virtual_server 192.168.1.200 8066 { #設置虛擬服務器,須要指定虛擬IP地址和服務端口,IP與端口之間用空格隔開
 delay_loop 6 #設置運行狀況檢查時間,單位是秒
 lb_algo rr #設置負載調度算法,這裏設置爲rr,即輪詢算法
 lb_kind DR #設置LVS實現負載均衡的機制,有NAT、TUN、DR三個模式可選
 nat_mask 255.255.255.0
 persistence_timeout 0 #會話保持時間,單位是秒;同一IP x秒內的請求都發到同個real server
 protocol TCP #指定轉發協議類型,有TCP和UDP兩種
 
 real_server 192.168.1.212 8066 { #配置服務節點1,須要指定real server的真實IP地址和端口,IP與端口之間用空格隔開
 weight 3 #配置服務節點的權值,權值大小用數字表示,數字越大,權值越高,設置權值大小能夠爲不一樣性能的服務器
 TCP_CHECK { #realserver的狀態檢測設置部分
 connect_timeout 10 #表示10秒無響應超時
 nb_get_retry 3 #表示重試次數
 delay_before_retry 3 #表示重試間隔
 }
 }
 real_server 192.168.1.110 8066 {
 weight 3
 TCP_CHECK {
 connect_timeout 10
 nb_get_retry 3
 delay_before_retry 3
 }
 }
}

 192.168.2十二、192.168.1.110上的realserver.sh內容一致

#!/bin/bash
VIP=192.168.1.200
/etc/rc.d/init.d/functions
 
case "$1" in
start)
 ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
 /sbin/route add -host $VIP dev lo:0 
 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
 echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
 echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
 echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
 sysctl -p >/dev/null 2>&1
 echo "RealServer Start OK"
 ;;
stop)
 ifconfig lo:0 down
 route del $VIP >/dev/null 2>&1 
 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
 echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
 echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
 echo "RealServer Stoped"
 ;;
*)
 echo "Usage: $0 {start|stop}"
 exit 1
esac
 
exit 0

在/usr/local/src/目錄下,給腳本可執行權限:[root@centos212 ~]# chmod -R 755 /usr/local/src/realserver.sh

按照上述結構圖,從右往左逐個啓動組件:先啓動mysql,接着啓動mycat,而後啓動realserver.sh,再啓動keepalived。咱們來看下負載均衡效果

Mycat - 高可用與負載均衡實現,滿滿的乾貨!

 

若是想學習Java工程化、高性能及分佈式、深刻淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友能夠加個人Java高級交流:854630135,羣裏有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給你們。

 

負載均衡效果咱們能夠經過ipvsadm -l命令來查看,具體體如今ActiveConn和InActConn值,ActiveConn是活動鏈接數,也就是tcp鏈接狀態的ESTABLISHED,而InActConn是指除了ESTABLISHED之外的,全部的其它狀態的tcp鏈接。由於./mysql -h192.168.1.200 -P8066 -uroot -p123456 -DTESTDB -e 'select @@hostname'是瞬時的,這個鏈接就歸爲InActConn,若是咱們想測試ActiveConn,咱們能夠用./mysql -h192.168.1.200 -P8066 -uroot -p123456 -DTESTDB,其實與咱們平時操做mysql是同樣的。從上圖中能夠看出,是達到了負載均衡效果的,192.168.1.110:8066與192.168.1.212:8066輪着來處理。

可能會有人對上圖中./mysql -h192.168.1.200 -P8066 -uroot -p123456 -DTESTDB -e 'select @@hostname'的返回值有疑問:爲何老是centos211? 這個sql其實就是查詢mysql的主機名,注意是mysql服務器的主機名,不是mycat的主機名!sql最終的執行者是mysql! 而咱們知道mycat對mysql作了讀寫分離,也就是說./mysql -h192.168.1.200 -P8066 -uroot -p123456 -DTESTDB -e 'select @@hostname'始終會在mysql slave上執行,而咱們的mysql slave的ip是192.168.1.211,其hostname是centos211,因此看到的hostname老是centos211。

總結

一、不少時候咱們都只須要實現mycat的高可用,而不須要實現mycat的負載均衡;組件越多,越容易出錯,也更難以維護;沒有一成不變的最優方案,只有在合適時機的最佳方案;

二、keepalived的做用,有沒有lvs,keepalived啓動的做用是有所區別的。沒有lvs時,keepalived負責vip的映射與轉移、mycat的存活檢測;有lvs時,Keepalived負責vip的映射與轉移、RealServer的健康狀態檢查。無論有沒有lvs,keepalived都會負責VIP的映射與轉移,實現master和slave主機之間failover,達到高可用目的;

三、各個組件的職責都很明顯,mysql負責sql的執行,mycat負責mysql的讀寫分離與高可用,lvs負責mycat的負載均衡與高可用,keepalived負責vip相關工做以及lvs的高可用。各個組件的角色弄清楚了,搭建起來也就不難了;

四、《Mycat權威指南》中採用haproxy + keepalived實現mycat的高可用和負載均衡,我就再也不重複講了,有興趣的能夠去實踐一把;另外留個疑問:nginx可不可實現mycat的負載均衡?

若是想學習Java工程化、高性能及分佈式、深刻淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友能夠加個人Java高級交流:854630135,羣裏有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給你們。

加羣直通車:854630135

相關文章
相關標籤/搜索