1、依賴博客文章html
https://my.oschina.net/u/3155476/blog/3070789前端
https://my.oschina.net/u/3155476/blog/3070799node
https://my.oschina.net/u/3155476/blog/3071307mysql
https://my.oschina.net/u/3155476/blog/3074563linux
本節課程要解決的問題:c++
2、軟件版本web
操做系統:CentOS-6.6-x86_64算法
JDK版本:jdk1.7.0_72sql
Keepalived版本:keepalived-1.2.18.tar.gz數據庫
HAProxy版本:haproxy-1.5.16.tar.gz
MyCat版本:Mycat-server-1.4-release-20151019230038-linux.tar.gz
MySQL版本:mysql-5.6.26.tar.gz
3、部署環境規劃
名稱 |
IP |
主機名 |
配置 |
|
HAProxy主機1 |
VIP:192.168.1.190 |
192.168.1.191 |
edu-haproxy-01 (默認Master) |
2核、2G |
HAProxy主機2 |
192.168.1.192 |
edu-haproxy-02 (默認Backup) |
2核、2G |
|
MyCat主機1 |
192.168.1.203 |
edu-mycat-01 |
4核、4G |
|
MyCat主機2 |
192.168.1.204 |
edu-mycat-02 |
4核、4G |
|
MySQL主節點 |
192.168.1.205 |
edu-mysql-01 |
4核、4G |
|
MySQL從節點 |
192.168.1.206 |
edu-mysql-02 |
4核、4G |
4、MyCat高可用負載均衡集羣部署架構圖以下:
圖解說明:
(1) HAProxy實現了MyCat多節點的集羣高可用和負載均衡,而HAProxy自身的高可用則能夠經過Keepalived來實現。所以,HAProxy主機上要同時安裝HAProxy和Keepalived,Keepalived負責爲該服務器搶佔vip(虛擬ip,圖中的192.168.1.190),搶佔到vip後,對該主機的訪問能夠經過原來的ip(192.168.1.191)訪問,也能夠直接經過vip(192.168.1.190)訪問。
(2) Keepalived搶佔vip有優先級,在keepalived.conf配置中的priority屬性決定。可是通常哪臺主機上的Keepalived服務先啓動就會搶佔到vip,即便是slave,只要先啓動也能搶到(要注意避免Keepalived的資源搶佔問題)。
(3) HAProxy負責將對vip的請求分發到MyCat集羣節點上,起到負載均衡的做用。同時HAProxy也能檢測到MyCat是否存活,HAProxy只會將請求轉發到存活的MyCat上。
(4) 若是Keepalived+HAProxy高可用集羣中的一臺服務器宕機,集羣中另一臺服務器上的Keepalived會馬上搶佔vip並接管服務,此時搶佔了vip的HAProxy節點能夠繼續提供服務。
(5) 若是一臺MyCat服務器宕機,HAPorxy轉發請求時不會轉發到宕機的MyCat上,因此MyCat依然可用。
綜上:MyCat的高可用及負載均衡由HAProxy來實現,而HAProxy的高可用,由Keepalived來實現。
5、HAProxy節點2的部署
HAProxy主機2(edu-haproxy-02,192.168.1.192)請參考上一節課程《高可用架構篇--第16節--MyCat集羣部署(HAProxy+MyCat)》對進行對等部署和作相應配置。
注意配置文件的調整:
多節點部署時haproxy.cfg 配置文件中的node 、 description配置的值要作相應調整。
HAProxy節點1的狀態信息頁:http://192.168.1.191:48800/admin-status
HAProxy節點2的狀態信息頁:http://192.168.1.192:48800/admin-status
6、Keepalived介紹 (官網:http://www.haproxy.org/ )
Keepalived 是一種高性能的服務器高可用或熱備解決方案,Keepalived能夠用來防止服務器單點故障的發生,經過配合Haproxy能夠實現web前端服務的高可用。
Keepalived以VRRP協議爲實現基礎,用VRRP協議來實現高可用性(HA)。VRRP(Virtual Router Redundancy Protocol)協議是用於實現路由器冗餘的協議,VRRP協議將兩臺或多臺路由器設備虛擬成一個設備,對外提供虛擬路由器IP(一個或多個),而在路由器組內部,若是實際擁有這個對外IP的路由器若是工做正常的話就是MASTER,或者是經過算法選舉產生。MASTER實現針對虛擬路由器IP的各類網絡功能,如ARP請求,ICMP,以及數據的轉發等;其餘設備不擁有該虛擬IP,狀態是BACKUP,除了接收MASTER的VRRP狀態通告信息外,不執行對外的網絡功能。當主機失效時,BACKUP將接管原先MASTER的網絡功能。
VRRP協議使用多播數據來傳輸VRRP數據,VRRP數據使用特殊的虛擬源MAC地址發送數據而不是自身網卡的MAC地址,VRRP運行時只有MASTER路由器定時發送VRRP通告信息,表示MASTER工做正常以及虛擬路由器IP(組),BACKUP只接收VRRP數據,不發送數據,若是必定時間內沒有接收到MASTER的通告信息,各BACKUP將宣告本身成爲MASTER,發送通告信息,從新進行MASTER選舉狀態。
7、Keepalived的安裝(192.168.1.191、192.168.1.192)
Keepalived ( http://www.keepalived.org/download.html )
一、上傳或下載keepalived(keepalived-1.2.18.tar.gz)到 /usr/local/src 目錄
二、解壓安裝
安裝keepalived須要用到openssl
# yum install gcc gcc-c++ openssl openssl-devel
# cd /usr/local/src
# tar -zxvf keepalived-1.2.18.tar.gz
# cd keepalived-1.2.18
# ./configure --prefix=/usr/local/keepalived
# make && make install
三、將keepalived安裝成Linux系統服務:
由於沒有使用keepalived的默認路徑安裝(默認是/usr/local),安裝完成以後,須要作一些工做
複製默認配置文件到默認路徑
# mkdir /etc/keepalived
# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
複製keepalived服務腳本到默認的地址
# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
設置keepalived服務開機啓動
# chkconfig keepalived on
四、修改Keepalived配置文件
(1) MASTER節點配置文件(192.168.1.191)
# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
## keepalived自帶的郵件提醒須要開啓sendmail服務。建議用獨立的監控或第三方SMTP
router_id edu-haproxy-01 ## 標識本節點的字條串,一般爲hostname
}
## keepalived會定時執行腳本並對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。
## 若是腳本執行結果爲0,而且weight配置的值大於0,則優先級相應的增長。
## 若是腳本執行結果非0,而且weight配置的值小於0,則優先級相應的減小。
## 其餘狀況,維持本來配置的優先級,即配置文件中priority對應的值。
vrrp_script chk_haproxy {
script "/etc/keepalived/haproxy_check.sh" ## 檢測haproxy狀態的腳本路徑
interval 2 ## 檢測時間間隔
weight 2 ## 若是條件成立,權重+2
}
## 定義虛擬路由,VI_1 爲虛擬路由的標示符,本身定義名稱
vrrp_instance VI_1 {
state BACKUP ## 默認主設備(priority值大的)和備用設備(priority值小的)都設置爲BACKUP,
## 由priority來控制同時啓動狀況下的默認主備,不然先啓動的爲主設備
interface eth1 ## 綁定虛擬IP的網絡接口,與本機IP地址所在的網絡接口相同,個人是eth1
virtual_router_id 91 ## 虛擬路由的ID號,兩個節點設置必須同樣,可選IP最後一段使用,
## 相同的VRID爲一個組,他將決定多播的MAC地址
priority 120 ## 節點優先級,值範圍0-254,MASTER要比BACKUP高
nopreempt ## 主設備(priority值大的)配置必定要加上nopreempt,不然非搶佔也不起做用
advert_int 1 ## 組播信息發送間隔,兩個節點設置必須同樣,默認1s
## 設置驗證信息,兩個節點必須一致
authentication {
auth_type PASS
auth_pass 1111 ## 真實生產,按需求對應該過來
}
## 將track_script塊加入instance 配置塊
track_script {
chk_haproxy ## 檢查HAProxy服務是否存活
}
## 虛擬IP池, 兩個節點設置必須同樣
virtual_ipaddress {
192.168.1.190 ## 虛擬ip,能夠定義多個,每行一個
}
}
(2)BACKUP節點配置文件(192.168.1.192):
# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id edu-haproxy-02
}
vrrp_script chk_haproxy {
script "/etc/keepalived/haproxy_check.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id 91
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_haproxy
}
virtual_ipaddress {
192.168.1.190
}
}
特別注意:若是非搶佔模式不生效,在Keepalived的故障節點恢復後會再次導搶佔vip,從而因vip切換而閃斷帶來的風險(視頻解說)。按以上配置,配置了Keepalived非搶佔模式,配置及注意點以下:
(1) 主設備、從設備中的 state 都設置爲 BACKUP
(2) 主設備、從設備中都不要配置 mcast_src_ip (本機IP地址)
(3) 默認主設備(priority值大的Keepalived節點)配置必定要加上 nopreempt,不然非搶佔不起做用
(4) 防火牆配置容許組播(主、備兩臺設備上都須要配置,keepalived使用224.0.0.18做爲Master和Backup健康檢查的通訊IP)
# iptables -I INPUT -i eth1 -d 224.0.0.0/8 -p vrrp -j ACCEPT
# iptables -I OUTPUT -o eth1 -d 224.0.0.0/8 -p vrrp -j ACCEPT
(eth1爲主機的網卡設備名稱,生產環境服務器能夠用獨立網卡來處理組播和心跳檢測等)
# service iptables save
重啓防火牆:
# service iptables restart
五、編寫Haproxy狀態檢測腳本 /etc/keepalived/haproxy_check.sh (已在keepalived.conf中配置)
腳本要求:若是haproxy中止運行,嘗試啓動,若是沒法啓動則殺死本機的keepalived進程,keepalied將虛擬ip綁定到BACKUP機器上。內容以下:
# mkdir -p /usr/local/keepalived/log
# vi /etc/keepalived/haproxy_check.sh
#!/bin/bash
START_HAPROXY="/etc/rc.d/init.d/haproxy start"
STOP_HAPROXY="/etc/rc.d/init.d/haproxy stop"
LOG_FILE="/usr/local/keepalived/log/haproxy-check.log"
HAPS=`ps -C haproxy --no-header |wc -l`
date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE
echo "check haproxy status" >> $LOG_FILE
if [ $HAPS -eq 0 ];then
echo $START_HAPROXY >> $LOG_FILE
$START_HAPROXY >> $LOG_FILE 2>&1
sleep 3
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
echo "start haproxy failed, killall keepalived" >> $LOG_FILE
killall keepalived
fi
fi
保存後,給腳本賦執行權限:
# chmod +x /etc/keepalived/haproxy_check.sh
六、啓動Keepalived
# service keepalived start
Starting keepalived: [ OK ]
Keepalived服務管理命令:
中止:service keepalived stop
啓動:service keepalived start
重啓:service keepalived restart
查看狀態:service keepalived status
8、Keepalived + Haproxy的高可用測試
一、關閉192.168.1.191中的Haproxy,Keepalived會將它從新啓動
# service haproxy stop
二、關閉192.168.1.191中的Keepalived,VIP(192.168.1.190)會被192.168.1.192搶佔
# service keepalived stop
Keepalived中止後,192.168.1.191節點的網絡接口中的VIP(192.168.1.190)將消失
查看此時VIP對應的MAC,Windows下使用CMD命令查看:
說明此時VIP已經漂移到物理主機192.168.1.192上了
再經過VIP來訪問Haproxy集羣,訪問到的也是192.168.1.192
http://192.168.1.190:48800/admin-status
三、從新啓動192.168.1.191中的Keepalived,vip(192.168.1.190)保留在192.168.1.192主機上,不會出現191啓動搶佔vip的狀況。
# service keepalived start
四、模擬搶佔了vip的節點(192.168.1.192)中的HAProxy故障或啓動失敗。
方式:把192節點中的haproxy.cfg文件重命名爲haproxy.cfg_bak,並把haproxy服務進行kill掉,此時keepalived會嘗試去啓動haproxy,會因爲找不到配置文件而啓動失敗,此時就會進行haproxy_check.sh腳本中的killall keepalived命令,結束keepalived進行。隨後就是192.168.1.191節點從新搶佔vip
http://192.168.1.190:48800/admin-status
http://192.168.1.191:48800/admin-status
9、經過vip訪問數據庫、驗證vip切換後的數據庫訪問
附上配置文件以及腳本
master節點上的keepalived.conf
################################################################################################### ! Configuration File for keepalived global_defs { ## keepalived自帶的郵件提醒須要開啓sendmail服務。建議用獨立的監控或第三方SMTP router_id edu-haproxy-01 ## 標識本節點的字條串,一般爲hostname } ## keepalived會定時執行腳本並對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。 ## 若是腳本執行結果爲0,而且weight配置的值大於0,則優先級相應的增長。 ## 若是腳本執行結果非0,而且weight配置的值小於0,則優先級相應的減小。 ## 其餘狀況,維持本來配置的優先級,即配置文件中priority對應的值。 vrrp_script chk_haproxy { script "/etc/keepalived/haproxy_check.sh" ## 檢測haproxy狀態的腳本路徑 interval 2 ## 檢測時間間隔 weight 2 ## 若是條件成立,權重+2 } ## 定義虛擬路由,VI_1 爲虛擬路由的標示符,本身定義名稱 vrrp_instance VI_1 { state BACKUP ## 默認主設備(priority值大的)和備用設備(priority值小的)都設置爲BACKUP, ##由priority來控制同時啓動狀況下的默認主備,不然先啓動的爲主設備 interface eth1 ## 綁定虛擬IP的網絡接口,與本機IP地址所在的網絡接口相同,個人是eth1 virtual_router_id 91 ## 虛擬路由的ID號,兩個節點設置必須同樣,可選IP最後一段使用, ## 相同的VRID爲一個組,他將決定多播的MAC地址 priority 120 ## 節點優先級,值範圍0-254,MASTER要比BACKUP高 nopreempt ## 主設備(priority值大的)配置必定要加上nopreempt,不然非搶佔也不起做用 advert_int 1 ## 組播信息發送間隔,兩個節點設置必須同樣,默認1s ## 設置驗證信息,兩個節點必須一致 authentication { auth_type PASS auth_pass 1111 ## 真實生產,按需求對應該過來 } ## 將track_script塊加入instance 配置塊 track_script { chk_haproxy ## 檢查HAProxy服務是否存活 } ## 虛擬IP池, 兩個節點設置必須同樣 virtual_ipaddress { 192.168.1.190 ## 虛擬ip,能夠定義多個,每行一個 } }
master節點上的haproxy_check.sh(LOG_FILE的路徑log以及日誌文件要自行建立)
#!/bin/bash START_HAPROXY="/etc/rc.d/init.d/haproxy start" STOP_HAPROXY="/etc/rc.d/init.d/haproxy stop" LOG_FILE="/usr/local/keepalived/log/haproxy-check.log" HAPS=`ps -C haproxy --no-header |wc -l` date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE echo "check haproxy status" >> $LOG_FILE if [ $HAPS -eq 0 ];then echo $START_HAPROXY >> $LOG_FILE $START_HAPROXY >> $LOG_FILE 2>&1 sleep 3 if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then echo "start haproxy failed, killall keepalived" >> $LOG_FILE killall keepalived fi fi
backup節點上的keepalived.conf
################################################################################################### ! Configuration File for keepalived global_defs { router_id edu-haproxy-02 } vrrp_script chk_haproxy { script "/etc/keepalived/haproxy_check.sh" interval 2 weight 2 } vrrp_instance VI_1 { state BACKUP interface eth1 virtual_router_id 91 priority 110 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_haproxy } virtual_ipaddress { 192.168.1.190 } }
backup上的haproxy_check.sh(LOG_FILE的路徑log以及日誌文件要自行建立)
#!/bin/bash START_HAPROXY="/etc/rc.d/init.d/haproxy start" STOP_HAPROXY="/etc/rc.d/init.d/haproxy stop" LOG_FILE="/usr/local/keepalived/log/haproxy-check.log" HAPS=`ps -C haproxy --no-header |wc -l` date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE echo "check haproxy status" >> $LOG_FILE if [ $HAPS -eq 0 ];then echo $START_HAPROXY >> $LOG_FILE $START_HAPROXY >> $LOG_FILE 2>&1 sleep 3 if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then echo "start haproxy failed, killall keepalived" >> $LOG_FILE killall keepalived fi fi