摘要:單進(jìn)程事件驅(qū)動模型顯著降低了上下文切換的開銷及內(nèi)存占用。指定記錄首部值時所記錄的精確長度,超出的部分將會被忽略。啟用統(tǒng)計報告并限定報告的區(qū)段,不能用于區(qū)段。如果的確有這種問題,可以使用來返回狀態(tài)碼給客戶端。
博文參考
http://ju.outofmemory.cn/entry/218244 http://www.cnblogs.com/gtms/p/6790939.html http://www.92to.com/bangong/2016/08-24/9737822.html http://blog.sina.com.cn/s/blog_704836f40102vrt0.html http://blog.csdn.net/jinshiyill/article/details/50824352架構(gòu)圖
HAProxy主要提供兩個功能:http協(xié)議反向代理(不提供緩存功能)、基于tcp層的負(fù)載均衡(如https、MySQL協(xié)議)。適用于需要會話保持或七層處理的且負(fù)載特別大的站點??芍С?jǐn)?shù)以萬計的并發(fā)連接。 代理作用:web緩存(加速)、反向代理、內(nèi)容路由(根據(jù)流量及內(nèi)容類型等將請求轉(zhuǎn)發(fā)至特定服務(wù)器)、轉(zhuǎn)碼器; HAProxy基于一種事件驅(qū)動(event-driven)、單一進(jìn)程模型和ebtree彈性二叉樹機(jī)制。 多進(jìn)程或多線程模型受內(nèi)存限制、系統(tǒng)調(diào)度器限制以及無處不在的鎖限制,很少能處理數(shù)千并發(fā)連接。事件驅(qū)動模型有更好的資源和時間管理的用戶端(User-Space) 實現(xiàn)所有這些任務(wù),所以并發(fā)響應(yīng)能特別大。但在多核系統(tǒng)上此模型通常擴(kuò)展性較差性能優(yōu)勢
HAProxy借助于OS上幾種常見的技術(shù)來實現(xiàn)性能的最大化。 單進(jìn)程、事件驅(qū)動模型顯著降低了上下文切換的開銷及內(nèi)存占用。 O(1)事件檢查器(eventchecker)允許其在高并發(fā)連接中對任何連接的任何事件實現(xiàn)即時探測。 在任何可用的情況下,單緩沖(singlebuffering)機(jī)制能以不復(fù)制任何數(shù)據(jù)的方式完成讀寫操作,這會節(jié)約大量的CPU時鐘周期及內(nèi)存帶寬; 借助于Linux 2.6 (>=2.6.27.19)上的splice()系統(tǒng)調(diào)用,HAProxy可以實現(xiàn)零復(fù)制轉(zhuǎn)發(fā)(Zero-copy forwarding),在Linux3.5及以上的OS中還可以實現(xiàn)零復(fù)制啟動(zero-starting); 內(nèi)存分配器在固定大小的內(nèi)存池中可實現(xiàn)即時內(nèi)存分配,這能夠顯著減少創(chuàng)建一個會話的時長; 樹型存儲:側(cè)重于使用作者多年前開發(fā)的彈性二叉樹,實現(xiàn)了以O(shè)(log(N))的低開銷來保持計時器命令、保持運行隊列命令及管理輪詢及最少連接隊列; 優(yōu)化的HTTP首部分析:優(yōu)化的首部分析功能避免了在HTTP首部分析過程中重讀任何內(nèi)存區(qū)域; 精心地降低了昂貴的系統(tǒng)調(diào)用,大部分工作都在用戶空間完成,如時間讀取、緩沖聚合及文件描述符的啟用和禁用等;HAProxy目前主要版本
1.4版本——提供較好的彈性:衍生于1.2版本,并提供了額外的新特性,其中大多數(shù)是期待已久的。
客戶端側(cè)的長連接(client-side keep-alive)
TCP加速(TCP speedups)
響應(yīng)池(response buffering)
RDP協(xié)議
基于源的粘性(source-based stickiness)
更好的統(tǒng)計數(shù)據(jù)接口(a much better stats interfaces)
更詳細(xì)的健康狀態(tài)檢測機(jī)制(more verbose health checks)
基于流量的健康評估機(jī)制(traffic-based health)
支持HTTP認(rèn)證
服務(wù)器管理命令行接口(server management from the CLI)
基于ACL的持久性(ACL-based persistence)
日志分析器
1.3版本——內(nèi)容交換和超強(qiáng)負(fù)載:衍生于1.2版本,并提供了額外的新特性。
內(nèi)容交換(content switching):基于任何請求標(biāo)準(zhǔn)挑選服務(wù)器池;
ACL:編寫內(nèi)容交換規(guī)則;
負(fù)載均衡算法(load-balancing algorithms):更多的算法支持;
內(nèi)容探測(content inspection):阻止非授權(quán)協(xié)議;
透明代理(transparentproxy):在linux系統(tǒng)上允許使用客戶端IP直接連入服務(wù)器;
內(nèi)核TCP拼接(kernel TCPsplicing):無copy方式在客戶端和服務(wù)端之間轉(zhuǎn)發(fā)數(shù)據(jù)以實現(xiàn)數(shù)G級別的數(shù)據(jù)速率;
分層設(shè)計(layereddesign):分別實現(xiàn)套接字、TCP、HTTP處理以提供更好的健壯性、更快的處理機(jī)制及便捷的演進(jìn)能力;
快速、公平調(diào)度器(fast and fairscheduler):為某些任務(wù)指定優(yōu)先級可實現(xiàn)理好的QoS;
會話速率限制(session rate limiting):適用于托管環(huán)境;
注意:
1)1.1、1.2、1.3的poll和epoll機(jī)制對性能影響 1.1l版本默認(rèn)使用的polling系統(tǒng)為select(),其處理的文件數(shù)達(dá)數(shù)千個時性能便會急劇下降。 1.2和1.3版本默認(rèn)的為poll(),在有些操作系統(tǒng)上可會也會有性能方面的問題,但在Solaris上表現(xiàn)相當(dāng)不錯。 HAProxy1.3在Linux 2.6及打了epoll補(bǔ)丁的Linux2.4上默認(rèn)使用epoll,在FreeBSD上使用kqueue,這兩種機(jī)制在任何負(fù)載上都能提供恒定的性能表現(xiàn)。 2) 高性能選型方案
Linux 2.6.32及之后版本上運行HAProxy 1.4;
打了epoll補(bǔ)丁的Linux2.4上運行HAProxy 1.4;
FreeBSD上運行HAProxy1.4;
Solaris10上運行HAProxy 1.4;
3)splice()調(diào)用機(jī)制 在較新版本的Linux2.6(>=2.6.27.19)上,HAProxy還能夠使用splice()系統(tǒng)調(diào)用在接口間無復(fù)制地轉(zhuǎn)發(fā)任何數(shù)據(jù),甚至可以達(dá)到10Gbps的性能。HAProxy安裝配置 程序包安裝
[root@localhost~]# yum install -y haproxy
主配置文件:/etc/haproxy/haproxy.cfg
主程序:/usr/sbin/haproxy
實例一:
frontend main *:5000 acl url_static path_beg -i /static /images /JavaScript/stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend app backendstatic balance roundrobin server static 127.0.0.1:4331 check backendapp balance roundrobin server app1 127.0.0.1:5001 check server app2 127.0.0.1:5002 check server app3 127.0.0.1:5003 check server app4 127.0.0.1:5004 check
實例二:
frontendmain bind *:80 default_backendwebsrvs backendwebsrvs balanceroundrobin server web1 172.16.49.102:80 check server web2 172.16.49.103:80 checkHAProxy代理相關(guān)配置 balance
定義負(fù)載均衡算法,可用于"defaults"、"listen"和"backend"配置段
① roundrobin,表示簡單的輪詢,這個是負(fù)載均衡基本都具備的; ② static-rr,表示根據(jù)權(quán)重,選擇 server 的邏輯最為簡單 ③ leastconn,表示最少連接者先處理 ④ source,表示根據(jù)請求源IP,這個跟Nginx的IP_hash機(jī)制類似,用其作為解決session問題的一種方法 ⑤ ri,表示根據(jù)請求的URI; ⑥ rl_param,表示根據(jù)請求的URl參數(shù)’balance url_param’ requires an URL parameter name; ⑦ hdr(name),表示根據(jù)HTTP請求頭來鎖定每一次HTTP請求; ⑧ rdp-cookie(name),表示根據(jù)據(jù)cookie(name)來鎖定并哈希每一次TCP請求。
注意
(1)當(dāng)使用uri算法時,第一次請求一個URL分發(fā)到一個主機(jī),則之后再次請求相同URL則使用一臺主機(jī)響應(yīng)。當(dāng)?shù)谝淮握埱笾?,若響?yīng)該請求的主機(jī)服務(wù)出現(xiàn)故障,則haproxy或?qū)⑵湔{(diào)度到其他主機(jī),此主機(jī)修復(fù)后再次調(diào)度回來 (2)URI:統(tǒng)一資源標(biāo)識符;格式如下:hash-type:// : @ : / ; ? # 方案://用戶:密碼@主機(jī):端口/路徑;參數(shù)(鍵值數(shù)據(jù)、可以多個參數(shù)字段)?查詢語句#片段顯示
bind格式:hash-type定義用于將hash碼映射至后端服務(wù)器的方法;不能用于frontend區(qū)段;可用方法有map-based和consistent 說明:
定義一個或者幾個監(jiān)聽的套接字、只能用于frontend, listen; bind[]:default_backend[, ...] bind[]: [, ...] interface
為frontend指明使用的默認(rèn)后端;default_backend
實例:
use_backend dynamic if url_dyn
use_backend static if url_css url_img extension_img
default_backend dynamic
注意:use_backend: 條件式后端調(diào)用;server
server
[param*]:參數(shù)
backup: 設(shè)定為備用服務(wù)器,僅在負(fù)載均衡場景中的其它server均不可用于啟用此server;
check:健康狀態(tài)檢測;
inter
rise
fall
cookie
maxconn:此服務(wù)接受的并發(fā)連接的最大數(shù)量;
maxqueue:請求隊列的最大長度;
observe:根據(jù)流量判斷后端server的健康狀態(tài);
weight #: 指定權(quán)重,#默認(rèn)為1,最大為256;0表示不被調(diào)度;
redir
注意:
健康監(jiān)測的方式有多種,具體服務(wù)可能檢測方法的配置指令不同;此處為后端http服務(wù)時的健康狀態(tài)的檢測方法,在defaults配置段定義了" option httpchk "。"httpchk"、"smtpchk"、"mysql-check"、"pgsql-check"、"ssl-hello-chk"
實例:基于瀏覽器cookie實現(xiàn)sessionsticky(會話綁定)
backendwebsrvs
balance roundrobin cookie SERVERID insert # 報文首部插入標(biāo)識 server web1 172.16.49.102:80 check weight 1 cookie websrv1 # cookie綁定名稱參數(shù)標(biāo)識 server web2 172.16.49.103:80 check weight 3 cookie websrv2
注釋:每個server有自己惟一的cookie標(biāo)識、在backend中定義為用戶請求調(diào)度完成后操縱其cookie
日志記錄信息(1) capture requestheader
格式:capture request headerlen 捕獲并記錄指定的請求首部最近一次出現(xiàn)時的第一個值,僅能用于“frontend”和“l(fā)isten”區(qū)段 :要捕獲的首部的名稱,此名稱不區(qū)分字符大小寫,但建議與它們出現(xiàn)在首部中的格式相同,比如大寫首字母。需要注意的是,記錄在日志中的是首部對應(yīng)的值,而非首部名稱。 :指定記錄首部值時所記錄的精確長度,超出的部分將會被忽略。
注意:
可以捕獲的請求首部的個數(shù)沒有限制,但每個捕獲最多只能記錄64個字符。為了保證同一個frontend中日志格式的統(tǒng)一性,首部捕獲僅能在frontend中定義。
(2)captureresponse header;捕獲并記錄響應(yīng)首部,其格式和要點同請求首部。
格式:capture response headerHAProxy狀態(tài)監(jiān)控頁配置 配置監(jiān)控頁信息len
1.配置監(jiān)控頁信息
(1)stats enable
啟用基于程序編譯時默認(rèn)設(shè)置的統(tǒng)計報告,不能用于“frontend”區(qū)段。
(2)stats hide-version
啟用統(tǒng)計報告并隱藏HAProxy版本報告,不能用于“frontend”區(qū)段。
(3)stats realm
格式:stats realm:實現(xiàn)HTTP基本認(rèn)證時顯示在瀏覽器中的領(lǐng)域名稱,用于提示用戶輸入一個用戶名和密碼。 啟用統(tǒng)計報告并高精認(rèn)證領(lǐng)域,不能用于“frontend”區(qū)段。haproxy在讀取realm時會將其視作一個單詞,因此,中間的任何空白字符都必須使用反斜線進(jìn)行轉(zhuǎn)義。此參數(shù)僅在與“statsauth”配置使用時有意義。
(4)stats scope
stats scope {| "." } :可以是“l(fā)isten”、“frontend”或“backend”區(qū)段的名稱,而“.”則表示statsscope語句所定義的當(dāng)前區(qū)段。 啟用統(tǒng)計報告并限定報告的區(qū)段,不能用于“frontend”區(qū)段。當(dāng)指定此語句時,統(tǒng)計報告將僅顯示其列舉出區(qū)段的報告信息,所有其它區(qū)段的信息將被隱藏。如果需要顯示多個區(qū)段的統(tǒng)計報告,此語句可以定義多次。需要注意的是,區(qū)段名稱檢測僅僅是以字符串比較的方式進(jìn)行,它不會真檢測指定的區(qū)段是否真正存在。
(5)stats auth
格式:stats auth: :授權(quán)進(jìn)行訪問的用戶名; :此用戶的訪問密碼,明文格式; 啟用帶認(rèn)證的統(tǒng)計報告功能并授權(quán)一個用戶帳號,其不能用于“frontend”區(qū)段。
(6)stats admin
格式:stats admin {if | unless }配置案例:stats狀態(tài)監(jiān)控頁在指定的條件滿足時啟用統(tǒng)計報告頁面的管理級別功能,它允許通過web接口啟用或禁用服務(wù)器。
(1)在配置文件/etc/haproxy/haproxy.cfg中配置代理和監(jiān)控配置信息
listenstatistics
bind *:9090 stats enable stats hide-version stats uri /haproxyadmin?stats stats realm "HAPorxyStatistics" stats auth admin:xuding stats admin if TRUE
(2)訪問URL:http://172.16.49.101:9090/hap...
(3)此時即可進(jìn)入管理頁面進(jìn)行對后端服務(wù)器的管理和頁面監(jiān)控數(shù)據(jù)監(jiān)控
錯誤頁面說明:
errorfile:使用haproxy主機(jī)本地文件進(jìn)行響應(yīng); errorloc,errorloc302: 使用指定的url進(jìn)行響應(yīng),響應(yīng)狀態(tài)碼為302;不適用于GET以外的其它請求方法; errorloc303:返回303狀態(tài)碼;errorfile
格式:errorfile
:指定對HTTP的哪些狀態(tài)碼返回指定的頁面;這里可用的狀態(tài)碼有200、400、403、408、500、502、503和504;
在用戶請求不存在的頁面時,返回一個頁面文件給客戶端而非由haproxy生成的錯誤代碼;可用于所有段中。
實例:
errorfile400 /etc/haproxy/errorpages/400badreq.http
errorfile403 /etc/haproxy/errorpages/403forbid.http
errorfile503 /etc/haproxy/errorpages/503sorry.http
請求錯誤時,返回一個HTTP重定向至某URL的信息;可用于所有配置段中。
errorloc
errorloc302
:指定對HTTP的哪些狀態(tài)碼返回指定的頁面;這里可用的狀態(tài)碼有200、400、403、408、500、502、503和504;
:Location首部中指定的頁面位置的具體路徑,可以是在當(dāng)前服務(wù)器上的頁面的相對路徑,也可以使用絕對路徑;需要注意的是,如果URI自身錯誤時產(chǎn)生某特定狀態(tài)碼信息的話,有可能會導(dǎo)致循環(huán)定向;
注意:
這兩個關(guān)鍵字都會返回302狀態(tài)嗎,這將使得客戶端使用同樣的HTTP方法獲取指定的URL,對于非GET廣場法的場景(如POST)來說會產(chǎn)生問題,因為返回客戶的URL是不允許使用GET以外的其它方法的。如果的確有這種問題,可以使用errorloc303來返回303狀態(tài)碼給客戶端。errorloc303
errorloc303 ;請求錯誤時,返回一個HTTP重定向至某URL的信息給客戶端;可用于所有配置段中。
:指定對HTTP的哪些狀態(tài)碼返回指定的頁面;這里可用的狀態(tài)碼有400、403、408、500、502、503和504;
:Location首部中指定的頁面位置的具體路徑,可以是在當(dāng)前服務(wù)器上的頁面的相對路徑,也可以使用絕對路徑;需要注意的是,如果URI自身錯誤時產(chǎn)生某特定狀態(tài)碼信息的話,有可能會導(dǎo)致循環(huán)定向;
實例:
backendwebserver
server 172.16.100.6 172.16.100.6:80 checkmaxconn 3000 cookie srv01
server 172.16.100.7 172.16.100.7:80 checkmaxconn 3000 cookie srv02
errorfile 403/etc/haproxy/errorpages/sorry.htm
errorfile 503/etc/haproxy/errorpages/sorry.htm
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/35847.html
摘要:才云科技云開源高級工程師唐繼元受邀社群,在線分享高級實踐,介紹如何構(gòu)建環(huán)境。除命令外的停止都是異常停止。 才云科技云開源高級工程師唐繼元受邀DBAplus社群,在線分享《Kubernetes Master High Availability 高級實踐》,介紹如何構(gòu)建Kubernetes Master High Availability環(huán)境。 以下是分享實錄: 大家好,我是才云科技的唐繼...
閱讀 454·2024-11-07 18:25
閱讀 130762·2024-02-01 10:43
閱讀 943·2024-01-31 14:58
閱讀 904·2024-01-31 14:54
閱讀 83006·2024-01-29 17:11
閱讀 3263·2024-01-25 14:55
閱讀 2057·2023-06-02 13:36
閱讀 3166·2023-05-23 10:26