Haproxy+Keepalived配置WEB負載均衡及動靜分離

一、簡介

二、環境介紹

三、安裝配置後端服務器

四、安裝配置Haproxy

五、安裝配置Keepalived

六、驗證服務


一、簡介

HAProxy簡介:

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

HAProxy實現了一種事件驅動、單一進程模型,此模型支持非常大的併發連接數。多進程或多線程模型受內存限制 、系統調度器限制以及無處不在的鎖限制,很少能處理數千併發連接。事件驅動模型因爲在有更好的資源和時間管理的用戶端(User-Space) 實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程序通常擴展性較差。這就是爲什麼他們必須進行優化以 使每個CPU時間片(Cycle)做更多的工作

Keepalived簡介:

KeepAlived是一個類似於layer3, 4 & 5交換機制的軟件,是一個高可用解決方案,通過虛擬IP地址和心跳檢測對方狀態來實現高可用功能。Keepalived是由兩臺服務器分別指定Master與Backup兩個角色,而指定Master的優先級比Backup的高;所以默認情況下虛擬IP會綁定到Master服務器上,對外提供服務。而Master、Backup服務器會在一定的時間間隔向對方發送心跳信息來檢測對方的存活狀態,時間間隔一般爲2秒鐘可以修改,如果Backup發現Master宕機,那麼Backup會發送ARP包到網關,然後把虛擬IP綁定到自己的網卡上,此時Backup對外提供服務,實現了自動化的故障轉移,當Master恢復的時會重新接管所有資源


二、環境介紹

161758348.gif

系統版本: CentOS 6.4_x86_64

Keepalived版本: keepalived-1.2.7 點此下載

Haproxy版本: Haproxy-1.4.24 點此下載

拓撲介紹:

前端HA1與HA2服務器上安裝Keepalived+Haproxy軟件,兩臺服務器互爲主備而初始狀態是每臺服務器上各有一個虛擬IP地址【HA1的VIP:172.16.14.10 HA2的VIP:172.16.14.11】;後臺WEB1與WEB2服務器上面安裝Apache軟件實現負載均衡;而LAMP服務器只負責解析php程序,當用戶訪問的是靜態頁面時會由前端調度器分發到處理靜態請求的服務器,如果訪問的是php的動態頁面,將會被分發到lamp動態服務器進行處理,實現了動、靜分離的效果,


三、安裝後端服務器

1、安裝LAMP服務器並測試

[root@lamp ~]# yum -y install httpd php mysql-server
######創建測試頁
[root@lamp ~]# vim /var/www/html/index.php
<h1>LAMP: 172.16.14.5</h1>
<?php
phpinfo();
[root@lamp ~]# service httpd start
[root@lamp ~]# chkconfig httpd on

133004352.gif

2、安裝WEB1服務器的HTTPD服務並訪問測試

[root@WEB1 ~]# yum -y install httpd
[root@WEB1 ~]# service httpd start
[root@WEB1 ~]# chkconfig httpd on
[root@WEB1 ~]# echo "<h1>WEB1:172.16.14.3</h1>" > /var/www/html/index.html

133702690.gif

3、安裝WEB2服務器的HTTPD服務並訪問測試

[root@WEB2 ~]# yum -y install httpd
[root@WEB2 ~]# service httpd start
[root@WEB2 ~]# chkconfig httpd on
[root@WEB2 ~]# echo "<h1>WEB2:172.16.14.4</h1>" > /var/www/html/index.html

133933830.gif


四、安裝並配置Haproxy

1、在HA1服務器安裝Haproxy

######安裝開發環境
[root@HA1 ~]# yum -y install gcc gcc-c++
[root@HA1 ~]# tar xf haproxy-1.4.24.tar.gz
[root@HA1 ~]# cd haproxy-1.4.24
[root@HA1 haproxy-1.4.24]# uname -r
2.6.32-358.el6.x86_64
[root@HA1 haproxy-1.4.24]# make TARGET=linux26 ARCH=x86_64
[root@HA1 haproxy-1.4.24]# make install
######註釋:TARGET指定內核版本,而uname -r是查看內核版本;ARCH指定CPU架構
----------------------------------------------------------------------
######爲Haproxy提供主配置文件與服務腳本,並將其添加到系統服務
[root@HA1 haproxy-1.4.24]# mkdir /etc/haproxy
[root@HA1 haproxy-1.4.24]# cp examples/haproxy.cfg /etc/haproxy
[root@HA1 haproxy-1.4.24]# cp examples/haproxy.init /etc/init.d/haproxy
[root@HA1 haproxy-1.4.24]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
[root@HA1 haproxy-1.4.24]# chmod +x /etc/init.d/haproxy
[root@HA1 haproxy-1.4.24]# chkconfig --add haproxy

2、修改主配置文件

######創建Haproxy的工作目錄
[root@HA1 ~]# mkdir /usr/share/haproxy
[root@HA1 ~]# vim /etc/haproxy/haproxy.cfg
# this config needs haproxy-1.1.28 or haproxy-1.2.1
global
    log 127.0.0.1   local0        #日誌配置,所有日誌都記錄在本地,通過local0輸出
    log 127.0.0.1   local1 notice
    maxconn 25600                 #最大連接數
    chroot /usr/share/haproxy     #改變Haproxy的工作目錄
    uid 99                        #用戶的UID
    gid 99                        #用戶的GID
    nbproc 1                      #進程數據(可以設置多個)
    daemon                        #以後臺守護進程方式運行Haproxy
    #debug                        #是否開啓調試
defaults
    log global         
    mode    http                  #默認使用協議,可以爲{http|tcp|health} http:是七層協議 tcp:是四層 health:只返回OK
    option  httplog               #詳細記錄http日誌
    option  dontlognull           #不記錄健康檢查的日誌信息
    retries 3                     #3次連接失敗則認爲服務不可用
    option  redispatch            #ServerID對應的服務器宕機後,強制定向到其他運行正常的服務器
    maxconn 30000                 #默認的最大連接數
    contimeout  5000              #連接超時
    clitimeout  50000             #客戶端超時
    srvtimeout  50000             #服務器超時
    timeout check   1s            #心跳檢測超時
    timeout http-request    10s   #默認http請求超時時間
    timeout queue           1m    #默認隊列超時時間
    timeout connect         10s   #默認連接超時時間
    timeout client          1m    #默認客戶端超時時間
    timeout server          1m    #默認服務器超時時間
    timeout http-keep-alive 10s   #默認持久連接超時時間
listen  stats
    mode http
    bind 0.0.0.0:8090             #指定IP地址與Port
    stats enable                  #開啓Haproxy統計狀態
    stats refresh 3s              #統計頁面自動刷新時間間隔
    stats hide-version            #狀態頁面不顯示版本號
    stats uri   /allen            #統計頁面的uri爲"/allen"
    stats realm Haproxy\ allen    #統計頁面認證時提示內容信息
    stats auth  admin:admin       #統計頁面的用戶名與密碼
    stats admin if TRUE           #啓用或禁用狀態頁面
frontend allen                    #定義前端服務器
    bind *:80
    mode http
    option httpclose              #每次請求完成主動關閉http連接
    option forwardfor             #後端服務器獲取客戶端的IP地址,可以從http header中獲取
    acl url_static path_end -i .html .jpg .gif #定義ACL規則以如".html"結尾的文件;-i:忽略大小寫
    acl url_dynamic path_end -i .php
    default_backend webservers    #客戶端訪問時默認調用後端服務器地址池
    use_backend lamp if url_dynamic #調用後端服務器並檢查ACL規則是否被匹配
backend webservers                #定義後端服務器
    balance roundrobin            #定義算法;基於權重進行輪詢
    server web1 172.16.14.3:80 check rise 2 fall 1 weight 2
    server web2 172.16.14.4:80 check rise 2 fall 1 weight 2
backend lamp
    balance source            #定義算法;源地址hash運算;類似於Nginx的ip_hash
    server lamp 172.16.14.5:80 check rise 2 fall 1
----------------------------------------------------------------------
#####註釋:check:啓動對後端server的健康狀態檢測;rise:離線的server轉換到正常狀態成功檢查的次數;fall:確認server從正常狀態轉換爲不可用狀態需要檢查的次數;weight:權重,數量越大,超重越高

3、啓動Haproxy服務並做訪問測試

[root@HA1 ~]# service haproxy start

140809101.gif

4、在HA2服務器上安裝Haproxy;這裏就不在介紹了,安裝與配置方法與在HA1服務器上安裝相同


五、安裝配置Keepalived

1、在HA1與HA2服務器上安裝Keepalived

[root@HA1 ~]# yum -y install keepalived
[root@HA2 ~]# yum -y install keepalived

2、修改HA1服務器的主配置文件

[root@HA1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_ALLEN
}
vrrp_script chk_proess {
    script "killall -0 haproxy"
    interval 1
    weight -2
}
vrrp_instance ha_1 {
    state MASTER
    interface eth0
    virtual_router_id 56
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1056
    }
    virtual_ipaddress {
    172.16.14.10
    }
    track_script {
        chk_proess
    }
}
vrrp_instance ha_2 {
    state BACKUP
    interface eth0
    virtual_router_id 58
    priority 92
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1058
    }
    virtual_ipaddress {
    172.16.14.11
    }
}

3、修改HA2服務器的主配置文件

[root@HA2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_ALLEN
}
vrrp_script chk_proess {
    script "killall -0 haproxy"
    interval 1
    weight -2
}
vrrp_instance ha_1 {
    state BACKUP
    interface eth0
    virtual_router_id 56
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1056
    }
    virtual_ipaddress {
    172.16.14.10
    }
}
vrrp_instance ha_2 {
    state MASTER
    interface eth0
    virtual_router_id 58
    priority 93
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1058
    }
    virtual_ipaddress {
    172.16.14.11
    }
    track_script {
        chk_proess
    }
}

4、啓動Keepalived服務並查看HA1與HA2服務器上的虛擬IP地址

[root@HA1 ~]# service keepalived start
[root@HA1 ~]# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:2c:1a:24 brd ff:ff:ff:ff:ff:ff
    inet 172.16.14.1/16 brd 172.16.255.255 scope global eth0
    inet 172.16.14.10/32 scope global eth0
    inet6 fe80::20c:29ff:fe2c:1a24/64 scope link
       valid_lft forever preferred_lft forever
------------------------------------------------------------------------
[root@HA2 ~]# service keepalived start
[root@HA2 ~]# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:ec:f6:3f brd ff:ff:ff:ff:ff:ff
    inet 172.16.14.2/16 brd 172.16.255.255 scope global eth0
    inet 172.16.14.11/32 scope global eth0
    inet6 fe80::20c:29ff:feec:f63f/64 scope link
       valid_lft forever preferred_lft forever

六、驗證服務

1、訪問驗證服務器的負載均衡功能

121854558.gif

122444937.gif

2、驗證是否實現動、靜分離的效果

121819839.gif

3、假設前端服務器其中一臺出現了故障,驗證IP地址能否自動切換到備份服務器上

######停止HA1服務器的haproxy服務
[root@HA1 ~]# service haproxy stop
------------------------------------------------------------------------
######查看HA2服務器的IP地址
[root@HA2 ~]# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:ec:f6:3f brd ff:ff:ff:ff:ff:ff
    inet 172.16.14.2/16 brd 172.16.255.255 scope global eth0
    inet 172.16.14.11/32 scope global eth0
    inet 172.16.14.10/32 scope global eth0
    inet6 fe80::20c:29ff:feec:f63f/64 scope link
       valid_lft forever preferred_lft forever
註釋:由上可見,虛擬IP地址已成功切換到HA2服務器

4、假如這裏將服務器修復好重新上線,IP地址會切換回到原來的服務器,這裏就不在驗證;將HA2服務器上的haproxy或keepalived服務關閉亦是如此


到此Keepalived+Haproxy實現負載均衡及動靜分離已完成;後續博客會更新其他相關內容,敬請關注...


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