高可用Mysql架構_Haproxy+keepalived+mycat叢集的配置

OldBoy~發表於2018-01-18

接上一篇文章http://www.cnblogs.com/wt645631686/p/8310891.html,雖然已經在原有兩臺mycat基礎上增加了Haproxy作為mycat的中間伺服器,不足的是,如果僅僅的一臺Haproxy伺服器當機掉,整個架構也就沒法執行。

一、準備兩臺Haproxy伺服器

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

關於haproxy的配置這裡不作說明,根據上一篇文章的步驟配置完成之後,以最快的方式clone一臺haproxy就可以了,本篇文章分別是192.168.9.174和192.168.9.175,然後修改一下第二臺的配置檔案

# vim /usr/local/haproxy/conf/haproxy.cfg
//把global組中的node和description分別修改為02
node edu-haproxy-02 ## 定義當前節點的名稱,用於HA場景中多haproxy程式共享同一個IP地址時
description edu-haproxy-02 ## 當前例項的描述資訊

訪問一下haproxy的管理頁面,發現兩個都正常

二、在已安裝好 Haproxy 的兩個虛擬機器上分別安裝 Keepalived

# yum install -y keepalived //這裡是yum方式
# keepalived -v  //檢視版本
Keepalived v1.2.13 (03/19,2015)
# chkconfig keepalived on //設定開機啟動

三、編寫 Haproxy 監控指令碼

該指令碼檢測 Haproxy 的執行狀態,並在 Haproxy 程式不存在時嘗試重新啟動 Haproxy ,如果啟動失敗則停止 keepalived,準備讓其它機器接管。

# vim /etc/keepalived/check_haproxy.sh  //新增如下內容儲存
#!/bin/sh
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg
fi

sleep 2
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
killall keepalived
fi
# chmod +x /etc/keepalived/check_haproxy.sh  //給指令碼授權

四、Haproxy + Keepalived 的配置

將192.168.9.174這臺伺服器上執行的 Haproxy 作為主要的 Haproxy
將192.168.9.175這臺伺服器上執行的 Haproxy 作為備用的 Haproxy

分別檢視一下網路卡,我這裡主機是eth4,備機是eth5,會用在keepalived配置中

修改主機的keepalived配置檔案

! Configuration File for keepalived

global_defs {
   #notification_email {
   #  acassen@firewall.loc
   #  failover@firewall.loc
   #  sysadmin@firewall.loc
   #}
   #notification_email_from Alexandre.Cassen@firewall.loc
   #smtp_server 192.168.200.1
   #smtp_connect_timeout 30
   router_id edu-haproxy-01  ##在當前的haproxy服務配置中有命名
}

## keepalived會定時執行指令碼並對指令碼執行的結果進行分析,動態調整vrrp_instance的優先順序。
## 如果指令碼執行結果為0,並且weight配置的值大於0,則優先順序相應的增加。
## 如果指令碼執行結果非0,並且weight配置的值小於0,則優先順序相應的減少。
## 其他情況,維持原本配置的優先順序,即配置檔案中priority對應的值。

vrrp_script chk_haproxy {
    script "/etc/keepalived/check_haproxy.sh"  ## 檢測haproxy狀態的指令碼路徑
    interval 2  ## 檢測時間間隔
    weight 2  ## 如果條件成立,權重+2 
}


## 定義虛擬路由,VI_1 為虛擬路由的標示符,自己定義名稱
vrrp_instance VI_1 {
    state BACKUP ##這一項主從都用BACKUP,MASTER會出現問題,會出現搶佔的問題,如果主節點當機掉,然後切換到備節點,如果主節點起來的話主節點就會把VIP搶佔。這樣就由優先順序(priority)來控制同時啟動情況下的預設主備,否則先啟動的為主裝置
    interface eth4 ## 繫結虛擬IP的網路介面,與本機IP地址所在的網路介面相同,我的是eth4
    virtual_router_id 51 ## 虛擬路由的ID號,兩個節點設定必須一樣,因為屬於同一個組,不同組的id一定不要一樣,否則衝突
    priority 120  ## 節點優先順序,值範圍0-254,MASTER要比BACKUP高,萬一同時啟動呢,一定要有一個高低之分
    nopreempt  ## 主裝置(priority值大的)配置一定要加上nopreempt,否則非搶佔也不起作用
    advert_int 1  ## 組播資訊傳送間隔,就是兩個虛擬路由節點之間會通過組播檢測對方是否正常,如果一個有問題,另一個會搶佔vip,這裡間隔1秒,時間太長可能會出現系統中斷
    
    ## 設定驗證資訊,兩個節點必須一致
    authentication { 
        auth_type PASS
        auth_pass 1111
    }

    ## 將track_script塊加入instance 配置塊
    track_script {
        chk_haproxy  ## 檢查HAProxy服務是否存活
    }

    ## 虛擬IP池, 兩個節點設定必須一樣
    virtual_ipaddress {
        192.168.9.190  ## 虛擬ip,可以定義多個,每行一個
    }
}

修改備機的keepalived配置檔案

! Configuration File for keepalived

global_defs {
   #notification_email {
   #  acassen@firewall.loc
   #  failover@firewall.loc
   #  sysadmin@firewall.loc
   #}
   #notification_email_from Alexandre.Cassen@firewall.loc
   #smtp_server 192.168.200.1
   #smtp_connect_timeout 30
    router_id edu-haproxy-02 ##在當前的haproxy服務配置中有命名
}

## keepalived會定時執行指令碼並對指令碼執行的結果進行分析,動態調整vrrp_instance的優先順序。
## 如果指令碼執行結果為0,並且weight配置的值大於0,則優先順序相應的增加。
## 如果指令碼執行結果非0,並且weight配置的值小於0,則優先順序相應的減少。
## 其他情況,維持原本配置的優先順序,即配置檔案中priority對應的值。

vrrp_script chk_haproxy {
    script "/etc/keepalived/check_haproxy.sh"  ## 檢測haproxy狀態的指令碼路徑
    interval 2  ## 檢測時間間隔
    weight 2  ## 如果條件成立,權重+2 
}


## 定義虛擬路由,VI_1 為虛擬路由的標示符,自己定義名稱
vrrp_instance VI_1 {
    state BACKUP ##這一項主從都用BACKUP,MASTER會出現問題,會出現搶佔的問題,如果主節點當機掉,然後切換到備節點,如果主節點起來的話主節點就會把VIP搶佔。這樣就由優先順序(priority)來控制同時啟動情況下的預設主備,否則先啟動的為主裝置
    interface eth5 ## 繫結虛擬IP的網路介面,與本機IP地址所在的網路介面相同,我的是eth4
    virtual_router_id 51 ## 虛擬路由的ID號,兩個節點設定必須一樣,因為屬於同一個組,不同組的id一定不要一樣,否則衝突
    priority 110  ## 節點優先順序,值範圍0-254,MASTER要比BACKUP高,萬一同時啟動呢,一定要有一個高低之分 //這裡一定要比主機小
    advert_int 1  ## 組播資訊傳送間隔,就是兩個虛擬路由節點之間會通過組播檢測對方是否正常,如果一個有問題,另一個會搶佔vip,這裡間隔1秒,時間太長可能會出現系統中斷
    
    ## 設定驗證資訊,兩個節點必須一致
    authentication { 
        auth_type PASS
        auth_pass 1111
    }

    ## 將track_script塊加入instance 配置塊
    track_script {
        chk_haproxy  ## 檢查HAProxy服務是否存活
    }

    ## 虛擬IP池, 兩個節點設定必須一樣
    virtual_ipaddress {
        192.168.9.190  ## 虛擬ip,可以定義多個,每行一個
    }
}

特別注意: 如果非搶佔模式不生效, 在 Keepalived 的故障節點恢復後會再次導搶佔 vip,從而因 vip 切換而閃斷帶來的風險。 按以上配置,配置了 Keepalived 非搶佔模式, 配置及注意點如下:
(1) 主裝置、 從裝置中的 state 都設定為 BACKUP
(2) 主裝置、從裝置中都不要配置 mcast_src_ip (本機 IP 地址)
(3) 預設主裝置(priority 值大的 Keepalived 節點) 配置一定要加上 nopreempt,否則非搶佔不起作用
(4) 防火牆配置允許組播

# iptables -I INPUT -i eth4 -d 224.0.0.0/8 -p vrrp -j ACCEPT
# iptables -I OUTPUT -o eth4 -d 224.0.0.0/8 -p vrrp -j ACCEPT 
# service iptables save  
# service iptables restart

五、啟動keepaived,並驗證

# service keepalived start  
Starting keepalived:                                       [  OK  ]
# ip add  //分別檢視ip資訊

檢視主機的ip資訊

檢視備機的ip資訊,無論如何沒有出現192.168.9.190,因為是非搶佔模式

六、測試最終效果

a、關掉主機的keepalived服務,然後檢視ip資訊,發現190已經被切換

b、關掉其中一臺機器的haproxy服務,檢視狀態發現狀態仍然執行,是因為指令碼的作用

c、關掉當前訪問的keepalived服務,並終止當前伺服器haproxy服務,通過url訪問http://192.168.9.190:48800/admin-status#mycat_servers/mycat_02,發現Statistics Report for pid 3128 切換了pid

d、通過Mysql終端訪問192.168.9.190,# mysql -uroot -p123456 -h192.168.9.190 -P3307,發現效果理想

OK~完畢~

相關文章