MyCat高可用負載均衡集羣的實現(HAProxy + Keepalived + MyCat)

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
相關文章
相關標籤/搜索