標籤:des c style blog a http
一.HAProxy簡介
HAProxy提供高可用性 、負載平衡以及基於TCP和HTTP應用的代理,它是免費、快速並且可靠的一種解決方案。HAProxy特別適用於那些負載特大的web網站,這些網站通常又需要會話保持或七層處理。 HAProxy運行在當前的硬體上,完全可以支援數以萬計 的並發串連。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web伺服器不被暴露到網路上。
HAProxy實現了一種事件驅動, 單一進程模型,此模型支援非常大的並發串連數。多進程或多執行緒模式受記憶體限制 、系統調度器限制以及無處不在的鎖限制,很少能處理數千並發串連。事件驅動模型因為在有更好的資源和時間管理的使用者端(User-Space) 實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程式通常擴充性較差。這就是為什麼他們必須進行最佳化以使每個CPU時間片(Cycle)做更多的工作。展示了HAProxy的負載平衡應用程式模型:
二.應用可行性
出於HAProxy的眾多優點,將其應用於CORS(連續運行衛星定位服務綜合系統)營運工作可有效提高現有的最大負載能力、減少硬體資源的浪費、保障系統的可用性及穩定性。具體地,可以從以下幾個方面闡述:
1.基於TCP代理在基準站資料流分發流程中充當Proxy 伺服器的功能;
2.基於TCP代理在使用者接入及資料播發流程中起到負載平衡均衡器的作用;
對於使用者數量多,並發性高的CORS,使用HAProxy將對外服務連接埠的請求對應至控制中心內部網路的多個相同功能的應用程式(如IGate/TNC等)的服務端口, HAProxy可以通過多種方式(IP、cookie、session)保持tcp連結的親緣性,確保資料互動的正確性。通過多種負載平衡演算法,內部的服務程式分擔總體的服 務壓力,當某個程式down掉了,HAProxy能夠自動將相關的tcp連結分發至其它服務程式。HAProxy實現了8種負載平衡演算法:
- roundrobin,表示簡單的輪詢
- static-rr,表示根據權重,可根據伺服器效能賦權
- leastconn,表示最少串連者先處理
- source,表示根據請求源IP
- uri,表示根據請求的URI
- url_param,表示根據請求的URl參數‘balance url_param‘ requires an URL parameter name
- hdr(name),表示根據HTTP要求標頭來鎖定每一次HTTP請求
- rdp-cookie(name),表示根據據cookie(name)來鎖定並雜湊每一次TCP請求
3.基於tcp代理實現內部網路的防火牆的NAT功能。
三.HAProxy的安裝與配置
此文編寫HAProxy最新穩定版本的為:http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.25.tar.gz。
1.Linux下HAProxy的安裝
- tar zcvf haproxy-1.4.25.tar.gz
- cd haproxy-1.4.25
- make TARGET=linux28 PREFIX=/usr/local/haprpxy
- make install PREFIX=/usr/local/haproxy
- cd /usr/local/haproxy
- vim haproxy.cfg 編輯設定檔,後面統一闡述配置的相關細節
- /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg 使用剛才的設定檔啟動HAProxy
2. Windows下HAProxy的編譯與安裝
- 下載cygwin安裝工具,文章編寫時其64位為:https://cygwin.com/setup-x86_64.exe。運行程式,程式如下:
- 安裝gcc,狀態為Keep的是本機已安裝的,如未安裝請勾選Bin列的複選框
- 安裝make工具。
- 將下載的HAProxy源碼包複製到:C:\cygwin64\home,並解壓到該目錄,
- 使用Cywin64 Terminal命令列工具進入HAProxy目錄:
- make TARGET=cygwin
- make install 這樣haproxy.exe就編譯好了,將haproxy.exe和cygwin1.dll拷貝出來以供使用。
- 運行方式與Linux環境下一致。
3.HAProxy設定檔解析
########預設配置############
defaults
mode http #預設的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK
retries 2 #兩次串連失敗就認為是伺服器不可用,也可以通過後面設定
option redispatch #當serverId對應的伺服器掛掉後,強制定向到其他健康的伺服器
option abortonclose #當伺服器負載很高的時候,自動結束掉當前隊列處理比較久的連結
maxconn 4096 #預設的最大串連數
timeout connect 5000ms #連線逾時
timeout client 30000ms #用戶端逾時
timeout server 30000ms #伺服器逾時
#timeout check 2000 #=心跳檢測逾時
log 127.0.0.1 local0 err #[err warning info debug]
########統計頁面配置########
listen admin_stats
bind 0.0.0.0:1080 #監聽連接埠
mode http #http的7層模式
option httplog #採用http日誌格式
#log 127.0.0.1 local0 err
maxconn 10
stats refresh 30s #統計頁面自動重新整理時間
stats uri /stats #統計頁面url
stats realm XingCloud\ Haproxy #統計頁面密碼框上提示文本
stats auth admin:admin #統計頁面使用者名稱和密碼設定
stats hide-version #隱藏統計頁面上HAProxy的版本資訊
########test1配置#################
listen test1
bind 0.0.0.0:90
mode tcp
#maxconn 4086
#log 127.0.0.1 local0 debug
server s1 10.18.138.201:80
server s2 10.18.102.190:80
server s3 10.18.102.189:80
server s4 10.18.102.188:80
server s5 10.18.102.187:80
########frontend配置##############
########test2配置#################
listen test2
bind 0.0.0.0:91
mode tcp
#maxconn 4086
#log 127.0.0.1 local0 debug
server s1 10.18.138.130:80 weight 1
server s2 10.18.138.201:8080 weight 6
########frontend配置##############
4.執行個體測試
為了測試回合效果我們使用最簡單的配置做一個簡單的tcp代理:
##########全域配置#########
global
daemon
nbproc 1
pidfile /var/run/haproxy.pid
########預設配置############
defaults
mode http #預設的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK
retries 2 #兩次串連失敗就認為是伺服器不可用,也可以通過後面設定
option redispatch #當serverId對應的伺服器掛掉後,強制定向到其他健康的伺服器
option abortonclose #當伺服器負載很高的時候,自動結束掉當前隊列處理比較久的連結
maxconn 4096 #預設的最大串連數
timeout connect 5000ms #連線逾時
timeout client 30000ms #用戶端逾時
timeout server 30000ms #伺服器逾時
#timeout check 2000 #=心跳檢測逾時
log 127.0.0.1 local0 err #[err warning info debug]
########統計頁面配置########
listen admin_stats
bind 0.0.0.0:1080 #監聽連接埠
mode http #http的7層模式
option httplog #採用http日誌格式
#log 127.0.0.1 local0 err
maxconn 10
stats refresh 30s #統計頁面自動重新整理時間
stats uri /stats #統計頁面url
stats realm XingCloud\ Haproxy #統計頁面密碼框上提示文本
stats auth admin:admin #統計頁面使用者名稱和密碼設定
stats hide-version #隱藏統計頁面上HAProxy的版本資訊
########test1配置#################
listen test1
bind 0.0.0.0:81
mode tcp
#maxconn 4086
#log 127.0.0.1 local0 debug
server s1 192.168.1.200:8000
server s1 192.168.1.201:8001
server s1 192.168.1.202:8002
########frontend配置##############
########test2配置#################
listen test2
bind 0.0.0.0:91
mode tcp
#maxconn 4086
#log 127.0.0.1 local0 debug
server s1 192.168.1.100:9000
server s1 192.168.1.101:9001
server s1 192.168.1.102:9002
########frontend配置##############