1、四層和七層負載均衡的區別前端
所謂的四層就是ISO參考模型中的第四層。四層負載均衡也稱爲四層交換機,它主要是經過分析IP層及TCP/UDP層的流量實現的基於IP加端口的負載均衡。常見的基於四層的負載均衡器有LVS、F5等。linux
以常見的TCP應用爲例,負載均衡器在接收到第一個來自客戶端的SYN請求時,會經過設定的負載均衡算法選擇一個最佳的後端服務器,同時將報文中目標IP地址修改成後端服務器IP,而後直接轉發給該後端服務器,這樣一個負載均衡請求就完成了。從這個過程來看,一個TCP鏈接是客戶端和服務器直接創建的,而負載均衡器只不過完成了一個相似路由器的轉發動做。在某些負載均衡策略中,爲保證後端服務器返回的報文能夠正確傳遞給負載均衡器,在轉發報文的同時可能還會對報文原來的源地址進行修改。整個過程下圖所示。正則表達式
同理,七層負載均衡器也稱爲七層交換機,位於OSI的最高層,即應用層,此時負載均衡器支持多種應用協議,常見的有HTTP、FTP、SMTP等。七層負載均衡器能夠根據報文內容,再配合負載均衡算法來選擇後端服務器,所以也稱爲「內容交換器」。好比,對於Web服務器的負載均衡,七層負載均衡器不但能夠根據「IP+端口」的方式進行負載分流,還能夠根據網站的URL、訪問域名、瀏覽器類別、語言等決定負載均衡的策略。例如,有兩臺Web服務器分別對應中英文兩個網站,兩個域名分別是A、B,要實現訪問A域名時進入中文網站,訪問B域名時進入英文網站,這在四層負載均衡器中幾乎是沒法實現的,而七層負載均衡能夠根據客戶端訪問域名的不一樣選擇對應的網頁進行負載均衡處理。常見的七層負載均衡器有HAproxy、Nginx等。redis
這裏仍以常見的TCP應用爲例,因爲負載均衡器要獲取到報文的內容,所以只能先代替後端服務器和客戶端創建鏈接,接着,才能收到客戶端發送過來的報文內容,而後再根據該報文中特定字段加上負載均衡器中設置的負載均衡算法來決定最終選擇的內部服務器。縱觀整個過程,七層負載均衡器在這種狀況下相似於一個代理服務器。整個過程以下圖所示。算法
對比四層負載均衡和七層負載均衡運行的整個過程,能夠看出,在七層負載均衡模式下,負載均衡器與客戶端及後端的服務器會分別創建一次TCP鏈接,而在四層負載均衡模式下,僅創建一次TCP鏈接。由此可知,七層負載均衡對負載均衡設備的要求更高,而七層負載均衡的處理能力也必然低於四層模式的負載均衡。後端
2、HAProxy與LVS的異同瀏覽器
經過以前文章的介紹,你們應該基本清楚了HAProxy負載均衡與LVS負載均衡的優缺點和異同了。下面就這兩種負載均衡軟件的異同作一個簡單總結:bash
1)二者都是軟件負載均衡產品,可是LVS是基於Linux操做系統實現的一種軟負載均衡,而HAProxy是基於第三應用實現的軟負載均衡。服務器
2)LVS是基於四層的IP負載均衡技術,而HAProxy是基於四層和七層技術、可提供TCP和HTTP應用的負載均衡綜合解決方案。cookie
3)LVS工做在ISO模型的第四層,所以其狀態監測功能單一,而HAProxy在狀態監測方面功能強大,可支持端口、URL、腳本等多種狀態檢測方式。
4)HAProxy雖然功能強大,可是總體處理性能低於四層模式的LVS負載均衡,而LVS擁有接近硬件設備的網絡吞吐和鏈接負載能力。
綜上所述,HAProxy和LVS各有優缺點,沒有好壞之分,要選擇哪一個做爲負載均衡器,要以實際的應用環境來決定。
3、快速安裝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就安裝完成了。
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 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
5、啓動與測試haproxy的負載均衡功能
一、啓動與管理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負載均衡器算法與使用技巧
一、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請求。
二、經常使用的負載均衡算法
(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的監控平臺,經過這個平臺能夠查看此集羣系統全部後端服務器的運行狀態,在後端服務或服務器出現故障時,監控頁面會經過不一樣的顏色來展現故障信息,這在很大程度上解決了後端服務器故障報警的問題,運維人員可經過監控這個頁面來第一時間發現節點故障,進而修復故障。