軟件負載均衡通常經過兩種方式來實現:javascript
基於操做系統的軟負載實現php
基於第三方應用的軟負載實現css
LVS是基於Linux操做系統實現的一種軟負載,而HAProxy則是基於第三方應用實現的軟負載。html
HAProxy相比LVS的使用要簡單不少,但跟LVS同樣,HAProxy本身並不能實現高可用,一旦HAProxy節點故障,將會影響整個站點。java
本文帶來的是HAProxy基於KeepAlived實現Web高可用及動靜分離。node
HAProxy是一款提供高可用性、負載均衡以及基於TCP和HTTP應用的代理軟件,HAProxy是徹底免費的、藉助HAProxy能夠快速而且可靠的提供基於TCP和HTTP應用的代理解決方案。mysql
HAProxy適用於那些負載較大的web站點,這些站點一般又須要會話保持或七層處理。linux
HAProxy能夠支持數以萬計的併發鏈接,而且HAProxy的運行模式使得它能夠很簡單安全的整合進架構中,同時能夠保護web服務器不被暴露到網絡上。web
Keepalived採用VRRP(virtual router redundancy protocol,虛擬路由冗餘協議)熱備份協議,以軟件的方式實現linux服務器的多機熱備功能。算法
VRRP是針對路由器的一種備份解決方案——由多臺路由器組成一個熱備組。
經過共用的虛擬IP地址對外提供服務;每一個熱備組內同一時刻只有一臺主服務器提供服務,其餘服務器處於冗餘狀態,若當前在線的服務器失敗,其餘服務器會自動接替(優先級決定接替順序)虛擬IP地址,以繼續提供服務。
實驗拓撲
#系統環境: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 #兩個節點都安裝
[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 } }
[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 /images /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 images, 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
準備測試頁面
#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狀況
靜態頁面
動態頁面
靜態頁面
動態頁面
查看狀態頁面
模擬一個節點故障
[root@node1 ~]# service haproxy stop Stopping haproxy: [ OK ] [root@node1 ~]# service keepalived stop Stopping keepalived: [ OK ]
查看各節點IP信息
VIP轉移了,繼續訪問測試
訪問不受任何影響,至此高可用及動靜分離目的實現。
HAProxy基於KeepAlived實現Web高可用及動靜分離實驗就先說到這裏了。
本次實驗因資源有限只提供了兩臺web服務器,若有多臺可設置輪詢實現負載均衡,這裏就不作多介紹了。