HAProxy基於KeepAlived實現Web高可用及動靜分離

前言

軟件負載均衡一般通過兩種方式來實現:基於操作系統的軟負載實現和基於第三方應用的軟負載實現。LVS是基於Linux操作系統實現的一種軟負載,而HAProxy則是基於第三方應用實現的軟負載。HAProxy相比LVS的使用要簡單很多,但跟LVS一樣,HAProxy自己並不能實現高可用,一旦HAProxy節點故障,將會影響整個站點。本文帶來的是HAProxy基於KeepAlived實現Web高可用及動靜分離。

相關介紹

HAProxy

HAProxy是一款提供高可用性、負載均衡以及基於TCP和HTTP應用的代理軟件,HAProxy是完全免費的、藉助HAProxy可以快速並且可靠的提供基於TCP和HTTP應用的代理解決方案。HAProxy適用於那些負載較大的web站點,這些站點通常又需要會話保持或七層處理。 HAProxy可以支持數以萬計的併發連接,並且HAProxy的運行模式使得它可以很簡單安全的整合進架構中,同時可以保護web服務器不被暴露到網絡上。

KeepAlived

Keepalived採用VRRP(virtual router redundancy protocol,虛擬路由冗餘協議)熱備份協議,以軟件的方式實現linux服務器的多機熱備功能。VRRP是針對路由器的一種備份解決方案——由多臺路由器組成一個熱備組。通過共用的虛擬IP地址對外提供服務;每個熱備組內同一時刻只有一臺主服務器提供服務,其他服務器處於冗餘狀態,若當前在線的服務器失敗,其他服務器會自動接替(優先級決定接替順序)虛擬IP地址,以繼續提供服務。

高可用解決方案

實驗拓撲

wKiom1WKXamQDGkIAAEr6GQwfZg266.jpg

#系統環境:CentOS6.6
#Static Server:httpd
#Dynamic Servicer:LAMP

配置過程

HA集羣配置前提

時間同步、基於主機名互相通信、SSH互信

請確保兩個節點時間同步,可用ntpdate向時間服務器同步

[root@node1 ~]# ntpdate cn.pool.ntp.org

基於主機名互相通信

[root@node1 ~]# vim /etc/hosts
   
172.16.10.123   node1.scholar.com node1
172.16.10.124   node2.scholar.com node2
   
[root@node1 ~]# vim /etc/sysconfig/network
HOSTNAME=node1.scholar.com
   
[root@node1 ~]# uname -n
node1.scholar.com
   
#兩個節點都需如上操作

SSH互信

[root@node1 ~]# ssh-keygen -t rsa -P ''
[root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node2
[root@node2 ~]# ssh-keygen -t rsa -P ''
[root@node2 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node1
[root@node1 ~]# date; ssh node2 'date' #測試
Wed Jun 24 15:58:46 CST 2015
Wed Jun 24 15:58:46 CST 2015

安裝所需程序

[root@node1 ~]# yum install keepalived haproxy -y

#兩個節點都安裝

配置keepalived

[root@node1 ~]# vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {        #定義VRRP實例,實例名自定義
    state MASTER            #指定Keepalived的角色,MASTER爲主服務器,BACKUP爲備用服務器
    interface eth0          #指定HA監測的接口
    virtual_router_id 51    #虛擬路由標識(1-255),在一個VRRP實例中主備服務器ID必須一樣
    priority 100            #優先級,數字越大越優先,主服務器優先級必須高於備服務器
    advert_int 1            #設置主備之間同步檢查時間間隔,單位秒
    authentication {        #設置驗證類型和密碼
        auth_type PASS      #驗證類型
        auth_pass ab007     #設置驗證密碼,同一實例中主備密碼要保持一致
    }
    virtual_ipaddress {     #定義虛擬IP地址
        192.168.12.21
    }
}
 
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 61
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass sr200
    }
    virtual_ipaddress {
        192.168.12.22
    }
}

將配置文件同步給另一個節點

[root@node1 ~]# scp /etc/keepalived/keepalived.conf node2:/etc/keepalived/
keepalived.conf                                        100%  787     0.8KB/s   00:00

修改另一個節點配置文件

[root@node2 ~]# vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass ab007
    }
    virtual_ipaddress {
        192.168.12.21
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 61
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass sr200
    }
    virtual_ipaddress {
        192.168.12.22
    }
}

配置HAProxy

[root@node1 ~]# vim /etc/haproxy/haproxy.cfg 

global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    log         127.0.0.1 local2      #日誌將通過rsyslog進行歸檔記錄
    chroot      /var/lib/haproxy      #運行的安裝路徑
    pidfile     /var/run/haproxy.pid  #pid文件存放的位置
    maxconn     4000                  #最大連接
    user        haproxy               #運行haproxy的用戶
    group       haproxy               #運行haprixy的組
    daemon                            #以後臺模式運行haproxy
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http                #工作模式
    log                     global              #記錄日誌
    option                  httplog             #詳細記錄http日誌
    option                  dontlognull         #不記錄健康檢查的日誌信息
    option http-server-close                    #啓用服務器端主動關閉
    option forwardfor       except 127.0.0.0/8  #傳遞客戶端IP
    retries                 3                   #請求重試次數
    timeout http-request    10s                 #http請求超時時間
    timeout queue           1m                  #一個請求在隊列裏的超時時間
    timeout connect         10s                 #連接服務器超時時間
    timeout client          1m                  #客戶端超時時間
    timeout server          1m                  #客戶端超時時間
    timeout http-keep-alive 10s                 #持久連接超時時間
    timeout check           10s                 #心跳檢測超時時間
    maxconn                 3000                #最大連接數
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  proxy *:80
    #定義ACL
    acl url_static       path_beg       -i /static /p_w_picpaths /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js
    acl url_dynamic      path_end       _i .php .jsp
    use_backend dynamic          if url_dynamic   #調用後端服務器並檢查ACL規則是否被匹配
    default_backend             static
#---------------------------------------------------------------------
# static backend for serving up p_w_picpaths, stylesheets and such
#---------------------------------------------------------------------
backend static           #後端調度
    balance     source   #調度算法
    server      s1 172.16.10.125:80 inter 1500 rise 2 fall 3  check 
#----------------------------------------
listen statistics
    mode http                           #http 7 層模式
    bind *:8080                         #監聽地址
    stats enable                        #啓用狀態監控
    stats auth admin:admin              #驗證的用戶與密碼
    stats uri /admin?status             #訪問路徑
    stats hide-version                  #隱藏狀態頁面版本號
    stats admin if TRUE                 #如果驗證通過了就允許登錄
    stats refresh 3s                    #每3秒刷新一次
    acl allow src 192.168.12.0/24       #允許的訪問的IP地址
    tcp-request content accept if allow #允許的地址段就允許訪問
    tcp-request content reject          #拒絕非法連接
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend dynamic
    balance     source
    server      s2 172.16.10.12:80 check inter 1500 rise 2 fall 3 
#check inter 1500是檢測心跳頻率
#rise2 2次正確認爲服務器可用
#fall3 3次失敗認爲服務器不可用

將配置文件同步至另一節點

[root@node1 ~]# scp /etc/haproxy/haproxy.cfg node2:/etc/haproxy/
haproxy.cfg                                       100% 4471     4.4KB/s   00:00

web端配置

準備測試頁面

#static server
[root@scholar ~]# vim /var/www/html/index.html 

<h1>172.16.10.125</h1>

[root@scholar ~]# service httpd start
Starting httpd:                                            [  OK  ]

#dynamic server
[root@scholar ~]# vim /var/www/html/index.php

<h1>172.16.10.20</h>
<?php
     $link = mysql_connect('127.0.0.1','root','');
     if ($link)
       echo "Success...";
     else
       echo "Failure...";
     mysql_close();
     phpinfo();
?>

[root@scholar ~]# service httpd start
Starting httpd:                                            [  OK  ]
[root@scholar ~]# service mysqld start
Starting mysqld:                                           [  OK  ]

啓動服務

[root@node1 ~]# service haproxy start; ssh node2 'service haproxy start'
Starting haproxy:                                          [  OK  ]
Starting haproxy: [  OK  ]
[root@node1 ~]# service keepalived start; ssh node2 'service keepalived start'
Starting keepalived:                                       [  OK  ]
Starting keepalived: [  OK  ]

動靜分離及高可用測試

查看各節點IP情況

wKiom1WKhzmjH_fEAAHB7PvsArs225.jpg

wKioL1WKiQHzYUwCAAHAX0lKMZQ460.jpg

靜態頁面

wKiom1WKi9-hmLbfAAC4ef5tbUQ793.jpg

動態頁面

wKiom1WKjHaAA8qXAAFU-AnATRo690.jpg

靜態頁面

wKioL1WKjbCByhPfAAC5Y0DMAbY850.jpg

動態頁面

wKiom1WKjPOQzBfaAAFdtTp7MU0919.jpg

查看狀態頁面

wKioL1WKk4uAW0JgAAO4iUP3tVg800.jpg

模擬一個節點故障

[root@node1 ~]# service haproxy stop
Stopping haproxy:                                          [  OK  ]
[root@node1 ~]# service keepalived stop
Stopping keepalived:                                       [  OK  ]

查看各節點IP信息

wKioL1WKlkyyQfSIAAFPg5nsNjY975.jpg

wKiom1WKlKDQUPRUAAF3wkfE3Uo738.jpg

VIP轉移了,繼續訪問測試

wKiom1WKlZnz0-j4AADGwz7gElM465.jpg

訪問不受任何影響,至此高可用及動靜分離目的實現

The end

HAProxy基於KeepAlived實現Web高可用及動靜分離實驗就先說到這裏了,本次實驗因資源有限只提供了兩臺web服務器,如有多臺可設置輪詢實現負載均衡,這裏就不做多介紹了,部署過程遇到問題可留言交流。以上僅爲個人學習整理,如有錯漏,大神勿噴~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章