Haproxy原理(1)


一、四層和七層負載均衡的區別

所謂的四層就是ISO參考模型中的第四層。四層負載均衡也稱為四層交換機,它主要是通過分析IP層及TCP/UDP層的流量實現的基於IP加端口的負載均衡。常見的基於四層的負載均衡器有LVS、F5等。
以常見的TCP應用為例,負載均衡器在接收到第一個來自客戶端的SYN請求時,會通過設定的負載均衡算法選擇一個最佳的后端服務器,同時將報文中目標IP地址修改為后端服務器IP,然后直接轉發給該后端服務器,這樣一個負載均衡請求就完成了。從這個過程來看,一個TCP連接是客戶端和服務器直接建立的,而負載均衡器只不過完成了一個類似路由器的轉發動作。在某些負載均衡策略中,為保證后端服務器返回的報文可以正確傳遞給負載均衡器,在轉發報文的同時可能還會對報文原來的源地址進行修改。整個過程下圖所示。

 

 

 

同理,七層負載均衡器也稱為七層交換機,位於OSI的最高層,即應用層,此時負載均衡器支持多種應用協議,常見的有HTTP、FTP、SMTP等。七層負載均衡器可以根據報文內容,再配合負載均衡算法來選擇后端服務器,因此也稱為“內容交換器”。比如,對於Web服務器的負載均衡,七層負載均衡器不但可以根據“IP+端口”的方式進行負載分流,還可以根據網站的URL、訪問域名、瀏覽器類別、語言等決定負載均衡的策略。例如,有兩台Web服務器分別對應中英文兩個網站,兩個域名分別是A、B,要實現訪問A域名時進入中文網站,訪問B域名時進入英文網站,這在四層負載均衡器中幾乎是無法實現的,而七層負載均衡可以根據客戶端訪問域名的不同選擇對應的網頁進行負載均衡處理。常見的七層負載均衡器有HAproxy、Nginx等。

這里仍以常見的TCP應用為例,由於負載均衡器要獲取到報文的內容,因此只能先代替后端服務器和客戶端建立連接,接着,才能收到客戶端發送過來的報文內容,然后再根據該報文中特定字段加上負載均衡器中設置的負載均衡算法來決定最終選擇的內部服務器。縱觀整個過程,七層負載均衡器在這種情況下類似於一個代理服務器。整個過程如下圖所示。

 


對比四層負載均衡和七層負載均衡運行的整個過程,可以看出,在七層負載均衡模式下,負載均衡器與客戶端及后端的服務器會分別建立一次TCP連接,而在四層負載均衡模式下,僅建立一次TCP連接。由此可知,七層負載均衡對負載均衡設備的要求更高,而七層負載均衡的處理能力也必然低於四層模式的負載均衡。

二、HAProxy與LVS的異同

通過之前文章的介紹,大家應該基本清楚了HAProxy負載均衡與LVS負載均衡的優缺點和異同了。下面就這兩種負載均衡軟件的異同做一個簡單總結:
1)兩者都是軟件負載均衡產品,但是LVS是基於Linux操作系統實現的一種軟負載均衡,而HAProxy是基於第三應用實現的軟負載均衡。
2)LVS是基於四層的IP負載均衡技術,而HAProxy是基於四層和七層技術、可提供TCP和HTTP應用的負載均衡綜合解決方案。
3)LVS工作在ISO模型的第四層,因此其狀態監測功能單一,而HAProxy在狀態監測方面功能強大,可支持端口、URL、腳本等多種狀態檢測方式。
4)HAProxy雖然功能強大,但是整體處理性能低於四層模式的LVS負載均衡,而LVS擁有接近硬件設備的網絡吞吐和連接負載能力。
綜上所述,HAProxy和LVS各有優缺點,沒有好壞之分,要選擇哪個作為負載均衡器,要以實際的應用環境來決定。

三、快速安裝HAProxy集群軟件

yum install haproxy

文件存放位置:

/usr/sbin/haproxy  #二進制文件
/usr/share/haproxy  #共享文件
/var/lib/haproxy  #庫文件
/etc/rc.d/init.d/haproxy  #啟動二進制文件
/etc/logrotate.d/haproxy  #日志切割
/etc/sysconfig/haproxy   #配置
/etc/haproxy  #配置目錄

安裝完成后,默認安裝目錄中沒有配置文件,這里是將源碼包里面的示例配置文件拷貝到配置文件目錄
這樣,HAProxy就安裝完成了。

四、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
log 127.0.0.1 local0 info
maxconn 4096
user nobody
group nobody
daemon
nbproc 1
pidfile /usr/local/haproxy/logs/haproxy.pid


defaults
mode http
retries 3
timeout connect 10s
timeout client 20s
timeout server 30s
timeout check 5s


frontend www
bind *:80
mode http
option httplog
option forwardfor
option httpclose
log global
#acl host_www hdr_dom(host) -i www.zb.com
#acl host_img hdr_dom(host) -i img.zb.com
#use_backend htmpool if host_www
#use_backend imgpool if host_img
default_backend htmpool


backend htmpool
mode http
option redispatch
option abortonclose
balance static-rr
cookie SERVERID
option httpchk GET /index.jsp
server 237server 192.168.81.237:8080 cookie server1 weight 6 check inter 2000 rise 2 fall 3
server iivey234 192.168.81.234:8080 cookie server2 weight 3 check inter 2000 rise 2 fall 3


backend imgpool
mode http
option redispatch
option abortonclose
balance static-rr
cookie SERVERID
option httpchk GET /index.jsp
server host236 192.168.81.236:8080 cookie server1 weight 6 check inter 2000 rise 2 fall 3


listen admin_stats
bind 0.0.0.0:9188
mode http
log 127.0.0.1 local0 err
stats refresh 30s
stats uri /haproxy-status
stats realm welcome login\ Haproxy
stats auth admin:admin~!@
stats hide-version
stats admin if TRUE

五、啟動與測試Haproxy的負責均衡功能

service haproxy
Usage: /etc/init.d/haproxy {start|stop|status|restart|try-restart|reload|force-reload}

啟動haproxy

service haproxy start

停止haproxy

service haproxy stop

平滑重啟

service haproxy reload

 

六、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

七、通過HAProxy的ACL規則實現智能負載均衡

由於HAProxy可以工作在七層模型下, 因此,要實現HAProxy的強大功能,一定要使用強大靈活的ACL規則,通過ACL規則可以實現基於HAProxy的智能負載均衡系統。HAProxy通過ACL規則完成兩種主要的功能,分別是:
1)通過設置的ACL規則檢查客戶端請求是否合法。如果符合ACL規則要求,那么就將放行,反正,如果不符合規則,則直接中斷請求。
2)符合ACL規則要求的請求將被提交到后端的backend服務器集群,進而實現基於ACL規則的負載均衡。

HAProxy中的ACL規則經常使用在frontend段中,使用方法如下:
1acl 自定義的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

八、使用HAProxy的Web監控平台

HAProxy雖然實現了服務的故障轉移,但是在主機或者服務出現故障的時候,並不能發出通知告知運維人員,這對於及時性要求很高的業務系統來說,是非常不便的,不過,HAProxy似乎也考慮到了這一點,在新的版本中HAProxy推出了一個基於Web的監控平台,通過這個平台可以查看此集群系統所有后端服務器的運行狀態,在后端服務或服務器出現故障時,監控頁面會通過不同的顏色來展示故障信息,這在很大程度上解決了后端服務器故障報警的問題,運維人員可通過監控這個頁面來第一時間發現節點故障,進而修復故障。

 

 PS:本文純屬記錄個人實踐經歷,如有問題,可隨時聯系我。QQ505711559


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM