1、四層和七層負載均衡的區別正則表達式
所謂的四層就是ISO參考模型中的第四層。四層負載均衡也稱爲四層交換機,它主要是 經過分析IP層及TCP/UDP層的流量實現的基於IP加端口的負載均衡。常見的基於四層的負 載均衡器有LVS、F5等。redis
以常見的TCP應用爲例,負載均衡器在接收到第一個來自客戶端的SYN請求時,會通 過設定的負載均衡算法選擇一個最佳的後端服務器,同時將報文中目標IP地址修改爲後端 服務器IP,然後直接轉發給該後端服務器,這樣一個負載均衡請求就完成了。從這個過程來看,一個TCP連接是客戶端和服務器直接建立的,而負載均衡器只不過完成了一個類似路由 器的轉發動做。在某些負載均衡策略中,爲保證後端服務器返回的報文可以正確傳遞給負載均衡器,在轉發報文的同時可能還會對報文原來的源地址進行修改。整個過程下圖所示。算法
同理,七層負載均衡器也稱爲七層交換機,位於 OSI 的最高層,即應用層,此時負載均衡器支持多種應用協議,常見的有 HTTP、FTP、SMTP 等。七層負載均衡器能夠根據報文內 容,再配合負載均衡算法來選擇後端服務器,所以也稱爲「內容交換器」。好比,對於 Web 服務器的負載均衡,七層負載均衡器不但能夠根據「IP+端口」的方式進行負載分流,還能夠根據網站的 URL、訪問域名、瀏覽器類別、語言等決定負載均衡的策略。例如,有兩臺 Web 服務器分別對應中英文兩個網站,兩個域名分別是 A、B,要實現訪問 A 域名時進入中 文網站,訪問 B 域名時進入英文網站,這在四層負載均衡器中幾乎是沒法實現的,而七層負 載均衡能夠根據客戶端訪問域名的不一樣選擇對應的網頁進行負載均衡處理。常見的七層負載均衡器有 HAproxy、Nginx 等。後端
這裏仍以常見的TCP應用爲例,由於負載均衡器要獲取到報文的內容,所以只能先代替後端服務器和客戶端建立連接,接着,才能收到客戶端發送過來的報文內容,然後再根據該 報文中特定字段加上負載均衡器中設置的負載均衡算法來決定最終選擇的內部服務器。縱觀 整個過程,七層負載均衡器在這種情況下類似於一個代理服務器。整個過程以下圖所示。瀏覽器
對比四層負載均衡和七層負載均衡運行的整個過程,能夠看出,在七層負載均衡模式下,服務器
負載均衡器與客戶端及後端的服務器會分別建立一次TCP鏈接,而在四層負載均衡模式下, 僅建立一次TCP連接。由此可知,七層負載均衡對負載均衡設備的要求更高,而七層負載均 衡的處理能力也必然低於四層模式的負載均衡。cookie
2、HAProxy與LVS的異同網絡
下面就這兩種負載均衡軟件的異同作一個簡單總結:app
1)二者都是軟件負載均衡產品,可是LVS是基於Linux操做系統實現的一種軟負載均衡,而HAProxy是基於第三應用實現的軟負載均衡。負載均衡
2)LVS是基於四層的IP負載均衡技術,而HAProxy是基於四層和七層技術、可提供TCP和HTTP應用的負載均衡綜合解決方案。
3)LVS工做在ISO模型的第四層,所以其狀態監測功能單一,而HAProxy在狀態監測 方面功能強大,可支持端口、URL、腳本等多種狀態檢測方式。
4)HAProxy雖然功能強大,可是總體處理性能低於四層模式的LVS負載均衡,而LVS擁有接近硬件設備的網絡吞吐和鏈接負載能力。
綜上所述,HAProxy和LVS各有優缺點,沒有好壞之分,要選擇哪一個做爲負載均衡器,要以實際的應用環境來決定。
3、快速安裝HAProxy集羣軟件
可以在HAProxy的官網http://www.haproxy.org/下載HAProxy的源碼包,這裏以操做系統Centos6.6 X64版本爲例,下載的HAProxy是haproxy-1.6.7.tar.gz,安裝過程如 下:
#tar -zxvf haproxy-1.6.7.tar.gz
#cd haproxy-1.6.7
#make TARGET=linux26 PREFIX=/usr/local/haproxy
注:此處TARGET=linux26是填寫系統內核版本 ,內核版本怎麼看. uname -r 。如個人版本是2.6.32-504.el6.x86_64, 直接填寫26便可。
#make install PREFIX=/usr/local/haproxy
將haproxy安裝到/usr/local/haproxy下
#mkdir /usr/local/haproxy/conf
haproxy默認不創建配置文件目錄,這裏是創建haproxy配置文件目錄
# cp examples/option-http_proxy.cfg /usr/local/haproxy/conf/haproxy.cfg
#haproxy安裝完成後,默認安裝目錄中沒有配置文件,這裏是將源碼包裏面的示例配置文件拷貝到配置文件目錄
這樣,HAProxy就安裝完成了。
4、HAProxy基礎配置文件詳解
HAProxy配置文件根據功能和用途,主要有5個部分組成,但有些部分並不是必須的, 能夠根據需要選擇相應的部分進行配置。
(1) global部分 用來設定全局配置參數,屬於進程級的配置,通常和操做系統配置有關。
(2) defaults部分 默認參數的配置部分。在此部分設置的參數值,默認會自動被引用到下面的frontend、
backend和listen部分中,所以,如果某些參數屬於公用的配置,只需在defaults部分添加 一次即可。而如果在frontend、backend和listen部分中也配置了與defaults部分同樣的參數,那麼defaults部分參數對應的值自動被覆蓋。
(3) frontend部分
此部分用於設置接收用戶請求的前端虛擬節點。frontend是在HAProxy1.3版本以後才引 入的一個組件,同時引入的還有backend組件。通過引入這些組件,在很大程度上簡化了 HAProxy配置文件的復雜性。frontend可以根據ACL規則直接指定要使用的後端backend。
(4) backend部分 此部分用於設置集羣後端服務集羣的配置,也就是用來添加一組真實服務器,以處理前
端用戶的請求。添加的真實服務器相似於LVS中的real server節點。
(5) listen部分
此部分是frontend部分和backend部分的結合體。在HAProxy1.3版本之前,HAProxy的 全部配置選項都在這個部分中設置。爲了保持兼容性,HAProxy新的版本仍然保留了listen 組件的配置方式。目前在HAProxy中,兩種配置方式任選其一即可。
下面是一個完整的HAProxy配置文件
Global
log127.0.0.1 local0 info
maxconn4096
usernobody
groupnobody
daemon
nbproc 1
pidfile/usr/local/haproxy/logs/haproxy.pid
defaults
mode http
retries 3
timeoutconnect 10s
timeoutclient 20s
timeoutserver 30s
timeoutcheck 5s
frontend www
bind *:80
mode http
option httplog
option forwardfor
option httpclose
log global
#acl host_wwwhdr_dom(host) -i www.zb.com
#acl host_imghdr_dom(host) -i img.zb.com
#use_backendhtmpool if host_www
#use_backendimgpool if host_img
default_backend htmpool
backend htmpool
mode http
optionredispatch
optionabortonclose
balance static-rr
cookieSERVERID
optionhttpchk GET /index.jsp
server237server 192.168.81.237:8080 cookie server1weight 6 check inter 2000 rise2 fall 3
serveriivey234 192.168.81.234:8080 cookie server2weight 3 check inter 2000 rise 2 fall 3
backend imgpool
mode http
optionredispatch
optionabortonclose
balance static-rr
cookieSERVERID
optionhttpchk GET /index.jsp
serverhost236 192.168.81.236:8080 cookie server1 weight 6 check inter 2000rise 2fall 3
listen admin_stats
bind0.0.0.0:9188
mode http
log127.0.0.1 local0 err
statsrefresh 30s
stats uri/haproxy-status
statsrealm welcome login\ Haproxy
stats authadmin:admin~!@
statshide-version
statsadmin if TRUE
5、啓動與測試haproxy的負載均衡功能
1、啓動與管理haproxy
啓動服務:
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg
重啓服務:
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg \
-st `cat/usr/local/haproxy/logs/haproxy.pid`
中止服務:
# killall haproxy
6、HAProxy 負載均衡器算法與使用技巧
1、HAProxy支持的負載均衡算法
(1)、roundrobin,表示簡單的輪詢,負載均衡基礎算法
(2)、static-rr,表示根據權重
(3)、leastconn,表示最少連接者先處理
(4)、source,表示根據請求源IP
(5)、uri,表示根據請求的URI;
(6)、url_param,表示根據請求的URl參數來進行調度
(7)、hdr(name),表示根據HTTP請求頭來鎖定每一次HTTP請求;
(8)、rdp-cookie(name),表示根據據cookie(name)來鎖定並哈希每一次TCP請求。
2、常用的負載均衡算法
(1)輪詢算法:roundrobin
(2)根據請求源IP算法:source
(3)最少連接者先處理算法:lestconn
7、通過HAProxy的ACL規則實現智能負載均衡
因爲HAProxy可以工做在七層模型下,因此,要實現HAProxy的強大功能,必定要使用強大靈活的ACL規則,通過ACL規則可以實現基於HAProxy的智能負載均衡系統。HAProxy 經過ACL規則完成兩種主要的功能,分別是:
1)經過設置的ACL規則檢查客戶端請求是否合法。如果符合ACL規則要求,那麼就將
放行,反正,如果不符合規則,則直接中斷請求.
2)符合ACL規則要求的請求將被提交到後端的backend服務器集羣,進而實現基於
ACL規則的負載均衡。
HAProxy中的ACL規則經常使用在frontend段中,使用方法如下:
acl 自定義的acl名稱 acl方法 -i [匹配的路徑或文件]
其中:
acl:是一個關鍵字,表示定義ACL規則的開始。後面須要跟上自定義的ACL名稱。
acl方法:這個字段用來定義實現ACL的方法,HAProxy定義了不少ACL方法,常常使用的方法有hdr_reg(host)、hdr_dom(host)、hdr_beg(host)、url_sub、url_dir、 path_beg、path_end等。
-i:表示忽略大小寫,後面須要跟上匹配的路徑或文件或正則表達式。
與ACL規則一塊兒使用的HAProxy參數還有use_backend,use_backend後面須要跟上一個backend實例名,表示在知足ACL規則後去請求哪一個backend實例,與 use_backend對應的還有default_backend參數,它表示在沒有知足ACL條件的時候默認使用哪一個後端backend。
下面列舉幾個常見的ACL規則例子:
acl www_policy hdr_reg(host) -i ^(www.z.cn|z.cn)
acl bbs_policy hdr_dom(host) -i bbs.z.cn
acl url_policy url_sub -i buy_sid=
use_backend server_www if www_policy
use_backend server_app if url_policy
use_backend server_bbs if bbs_policy
default_backend server_cache
8、使用HAProxy的Web監控平臺
HAProxy雖然實現了服務的故障轉移,可是在主機或者服務出現故障的時候,並不能發出通知告知運維人員,這對於及時性要求很高的業務系統來講,是很是不便的,不過,HAProxy 彷佛也考慮到了這一點,在新的版本中HAProxy推出了一個基於Web的監控平臺,經過這 個平臺能夠查看此集羣系統全部後端服務器的運行狀態,在後端服務或服務器出現故障時,
監控頁面會經過不一樣的顏色來展現故障信息,這在很大程度上解決了後端服務器故障報警的 問題,運維人員可經過監控這個頁面來第一時間發現節點故障,進而修復故障。
登陸地址是:http://IP:9188/haproxy-status
用戶名和密碼:就是在配置文件裏設置的 admin、admin~!@
9、HAproxy+KeepAlived 高可用負載均衡系統
1、高可用HAproxy集羣系統的拓撲結構
在備機從新安裝haproxy,而後配置haproxy,這個再也不介紹,下面直接給出配置好的 keepalived.conf文件內容。在haproxy-server主機上,keepalived.conf的內容以下:
global_defs
{notification_email
{
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 HAProxy_DEVEL
}
vrrp_script check_haproxy {
script "killall -0 haproxy"
#設置探測 haproxy 服務運行狀態的方式,這裏的「killall -0 haproxy」僅僅是檢測 haproxy 服務狀態
interval 2
}
vrrp_instance HAProxy_HA {
state BACKUP
#在 haproxy-server 和 backup-haproxy 上均配置爲 BACKUP interface eth0
virtual_router_id 80
priority 100
advert_int 2
nopreempt #不搶佔模式,只在優先級高的機器上設置便可,優先級低的機器不設置 authentication {
auth_type PASS
auth_pass 1111
}
track_script
{check_haproxy
}
virtual_ipaddress {
192.168.66.10/24 dev eth0 #HAProxy 的對外服務 IP,即 VIP
}
}
最後,將keepalived.conf文件複製到backup-haproxy服務器上對應的位置,而後將 keepalived.conf文件中priority值修改爲90,因爲配置的是不搶佔模式,所以,還需要在backup-haproxy服務器上去掉nopreempt選項。
完成所有配置後,分別在haproxy-server和backup-haproxy主機上依次啓動haproxy服 務和keepalived服務。注意,這裏一定要先啓動haproxy服務,由於keepalived服務在啓動 的時候會自動檢測 haproxy服務是否正常,若是發現haproxy服務沒有啓動,那麼主、備keepalived將自動進入fault狀態。在依次啓動服務後,在正常情況下VIP地址應該運行在 haproxy-server服務器上,經過命令「ipa」可以查看VIP是否已經正常加載。