一、四層和七層負載均衡的區別
所謂的四層就是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集羣軟件
可以在HAProxy的官網http:// www.haproxy.org/下載HAProxy的源碼包,這裏以操作系統Centos6.5版本爲例,下載的HAProxy是目前的穩定版本haproxy-1.6.4.tar.gz,安裝過程如下:
[root@haproxy-server app]# tar zcvf haproxy-1.6.4.tar.gz [root@haproxy-server app]#cd haproxy-1.6.4 [root@haproxy-server haproxy-1.6.4]#make TARGET=linux26 PREFIX=/usr/local/haproxy [root@haproxy-server haproxy-1.6.4]#make install PREFIX=/usr/local/haproxy #將haproxy安裝到/usr/local/haproxy下 [root@haproxy-server haproxy-1.6.4]#mkdir /usr/local/haproxy/conf #haproxy默認不創建配置文件目錄,這裏是創建haproxy配置文件目錄 [root@haproxy-server haproxy-1.6.4]# cp examples/ option-http_proxy.cfg \ /usr/local/haproxy/conf/haproxy.cfg#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的負載均衡功能
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
六、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段中,使用方法如下:
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
八、使用HAProxy的Web監控平臺
HAProxy雖然實現了服務的故障轉移,但是在主機或者服務出現故障的時候,並不能發出通知告知運維人員,這對於及時性要求很高的業務系統來說,是非常不便的,不過,HAProxy似乎也考慮到了這一點,在新的版本中HAProxy推出了一個基於Web的監控平臺,通過這個平臺可以查看此集羣系統所有後端服務器的運行狀態,在後端服務或服務器出現故障時,監控頁面會通過不同的顏色來展示故障信息,這在很大程度上解決了後端服務器故障報警的問題,運維人員可通過監控這個頁面來第一時間發現節點故障,進而修復故障。