接上一篇文章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~完畢~