MyCat高可用負載均衡集羣實現

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

 

 

本節課程要解決的問題:

 

一、 軟件版本

操作系統: CentOS-6.6-x86_64
JDK 版本: jdk1.7.0_72
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

二、 部署環境規劃

名稱 IP 主機名 配置
HAProxy主機1 VIP:192.168.175.220|192.168.175.202 mini2 (默認 Master) -
HAProxy 主機 2 VIP:192.168.1.220|192.168.175.203 mini3(默認 Backup) -
MyCat 主機 1 192.168.175.200 huachao -
MyCat 主機 2 192.168.175.201 mini1 -
MySQL 主節點 192.168.175.200 huachao -
MySQL 從節點 192.168.175.201 mini1 -

三、MyCat 高可用負載均衡集羣部署架構圖如下:

MySQL高可用集羣分離架構

圖解說明:
(1)HAProxy 實現了 MyCat 多節點的集羣高可用和負載均衡, 而 HAProxy 自身的高可用則可以通過Keepalived 來實現。 因此, HAProxy 主機上要同時安裝 HAProxy 和 Keepalived, Keepalived 負責爲該服務器搶佔 vip(虛擬 ip),搶佔到 vip 後,對該主機的訪問可以通過原來的 ip 訪問,也可以直接通過 vip( 虛擬)訪問。
(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 來實現。

四、 HAProxy 節點 2 的部署

HAProxy 主機 2( edu-haproxy-02, 192.168.175.201) 請參考上一節課程《 高可用架構篇--第 16 節--
MyCat 集羣部署( HAProxy+MyCat)》 對進行對等部署和做相應配置。
注意配置文件的調整:
多節點部署時 haproxy.cfg 配置文件中的 node 、 description 配置的值要做相應調整。
HAProxy 節點 1 的狀態信息頁: http://192.168.175.202:48800/admin-status

HAProxy 節點 2 的狀態信息頁: http://192.168.175.203:48800/admin-status

五、 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 選舉狀態。

六、 Keepalived 的安裝( 192.168.1.191、 192.168.1.192)

Keepalived下載地址

  1. 上傳或下載 keepalived( keepalived-1.2.18.tar.gz) 到 /usr/local/src 目錄
  2. 解壓安裝
    安裝 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
  1. 將 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

  2. 修改 Keepalived 配置文件
    (1) MASTER 節點配置文件( 192.168.175.202)

# 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.175.220 ## 虛擬 ip,可以定義多個,每行一個
}
}

(2)BACKUP 節點配置文件( 192.168.175.203) :
# 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.175.220
}
}

特別注意: 如果非搶佔模式不生效, 在 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 eth0 -d 224.0.0.0/8 -p vrrp -j ACCEPT
# iptables -I OUTPUT -o eth0 -d 224.0.0.0/8 -p vrrp -j ACCEPT
( eth0 爲主機的網卡設備名稱,生產環境服務器可以用獨立網卡來處理組播和心跳檢測等)
# service iptables save
重啓防火牆:
# service iptables restart

  1. 編寫 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

  1. 啓動 Keepalived
    # service keepalived start
    Starting keepalived: [ OK ]

Keepalived 服務管理命令:
停止: service keepalived stop
啓動: service keepalived start
重啓: service keepalived restart
查看狀態: service keepalived status

七、 Keepalived + Haproxy 的高可用測試

  1. 關閉 192.168.1.191 中的 Haproxy, Keepalived 會將它重新啓動
    # service haproxy stop

  2. 關閉 192.168.1.191 中的 Keepalived, VIP( 192.168.1.190) 會被 192.168.1.192 搶佔
    # service keepalived stop

    image.png


    Keepalived 停止後, 192.168.1.191 節點的網絡接口中的 VIP( 192.168.1.190) 將消失

    image.png


    查看此時 VIP 對應的 MAC, Windows 下使用 CMD 命令查看:

    image.png


    說明此時 VIP 已經漂移到物理主機 192.168.1.192 上了
    再通過 VIP 來訪問 Haproxy 集羣, 訪問到的也是 192.168.1.192
    http://192.168.1.190:48800/admin-status
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章