1,HAProxy是什麼html
HAProxy was written in 2000 by Willy Tarreau,a french and core contributor to the Linux kernel, who still maintains the project.前端
HAProxy是一個開源、快速可靠的高可用、負載均衡解決方案,提供基於L4(IP+PORT,報文解析到傳輸層tcp、udp)和L7(解析流量報文到http協議)的流量分發代理。特別適合高流量網站巨量訪問轉發。它已經成爲開源負載均衡器事實上的標準,可運行於大部分主流的Linux操做系統之上。node
包括amazon、github、airbnb、Alibaba/Taobao CDN、Reddit、twitter等知名公司網絡系統都使用了haproxy。linux
官網地址 http://haproxy.org/nginx
Github地址https://github.com/haproxy/haproxygit
最新穩定版文檔地址https://cbonte.github.io/haproxy-dconv/2.0/intro.htmlgithub
docker image地址:https://hub.docker.com/_/haproxyweb
2,HAProxy的核心功能redis
負載均衡:L4和L7兩種模式,支持roundrobin/static-rr/leastcon(WLC)/IP Hash/URI Hash/URL_PARAM Hash/HTTP_HEADER/rdp-cookie(name)等豐富的負載均衡算法算法
健康檢查:支持TCP和HTTP兩種健康檢查模式
會話保持:對於未實現會話共享的應用集羣,可經過Insert Cookie/Rewrite Cookie/Prefix Cookie,以及上述的多種Hash方式實現
SSL:HAProxy能夠解析HTTPS協議,並可以將請求解密爲HTTP後向後端傳輸
HTTP請求重寫與重定向:對訪問定向和設置轉發規則,拒絕鏈接等
監控與統計:提供統計信息Web頁面,展示健康狀態和流量數據。使用者可基於此開發監控程序來監控HAProxy的狀態
高可用:可輕易於keepalive集成,組成cluster
性能
採用多線程、事件驅動、非阻塞模型,顯著下降了上下文切換的開銷和內存佔用,能在1ms內處理數百個請求,儘管ps aux顯示是單個進程。
O(1)事件檢查器(event checker)容許其在高併發鏈接中對任何鏈接的任何事件實現即時探測。
單緩衝(single buffering)機制能以不復制任何數據的方式完成讀寫操做,節約大量的CPU時鐘週期及內存帶寬。
大量調用OS kernel自己的功能特性,一般狀況下,HAProxy自身只佔用15%的處理時間,剩餘的85%都是在系統內核層完成的。
HAProxy做者在2009年使用1.4版本進行了一次測試,單個HAProxy進程的處理能力突破了10萬請求/秒,並輕鬆佔滿了10Gbps的網絡帶寬。
穩定性
做者建議以單進程模式運行的程序,HAProxy對穩定性的要求十分嚴苛。HAProxy一旦成功啓動,除非操做系統或硬件故障,不然就不會崩潰。
HAProxy的大部分工做都是在操做系統內核完成的,因此HAProxy的穩定性主要依賴於操做系統linux。
3,HAProxy的安裝和運行
下載最新穩定版
wget http://www.haproxy.org/download/2.0/src/haproxy-2.0.5.tar.gz
tar -xf haproxy-2.0.5.tar.gz
cd haproxy-2.0.5.tar
#普通安裝方式,haproxy不支持SSL
make TARGET=linux2628 ARCH=x86_64 prefix=/usr/local/haproxy install
#須要haproxy支持SSL時,使用以下編譯方式
make TARGET=linux2628 ARCH=x86_64 USE_OPENSSL=1 ADDLIB=-lz prefix=/usr/local/haproxy install
#參數說明
TARGET=linux26 #內核版本,使用uname -r查看內核,如:2.6.18-371.el5,此時該參數就爲linux26;kernel 大於2.6.28的用:TARGET=linux2628
ARCH=x86_64 #系統位數
PREFIX=/usr/local/haprpxy #/usr/local/haprpxy爲haprpxy安裝路徑
#將haproxy和openssl庫鏈接
ldd haproxy | grep ssl
經常使用命令
haproxy -v 查看版本
haproxy -f configuration.conf -c 檢測配置文件語法正確性
haproxy -f configuration.cfg -D -p /var/run/haproxy.pid 啓動haproxy
haproxy -vv 顯示當前haproxy運行詳細信息
haproxy -f configuration.cfg -sf $(cat /var/run/haproxy.pid) 重載至關於reload
haproxy -f configuration.cfg -st $(cat /var/run/haproxy.pid) 重啓,關閉stop後start
killall haproxy 關閉haproxy
4,HAProxy關鍵配置詳解:
haproxy 的配置文件共分爲五段:global,defaults,frontend,backend,listen
「global」段全局配置參數、進程級的,用來控制haproxy啓動前的一些進程及系統設置
「defaults」段配置默認參數,可被frontend、backend、listen段繼承使用
「frontend」段接受客戶端請求並與之創建鏈接,可針對請求的域名、uri作不一樣的匹配
「backend」段定義接受客戶端請求的服務器,並根據權重、隊列、鏈接數等選項分發請求
「listen」段經過關聯「frontend」和「backend」定義了一個完整的代理,一般只對TCP流量有用。
全部代理的名稱只能使用大寫字母、小寫字母、數字、-(中線)、_(下劃線)、.(點號)和:(冒號)。此外,ACL名稱會區分字母大小寫。
一個配置樣例:
####全局配置####
global
log 127.0.0.1 local0 #[日誌輸出配置,全部日誌都記錄在本機,經過local0輸出]
log 127.0.0.1 local1 notice #定義haproxy 日誌級別[error warringinfo debug]
daemon #後臺運行harpoxy
nbproc 1 #設置進程數量
maxconn 4096 #默認最大鏈接數,需考慮ulimit-n限制
#user haproxy #運行haproxy的用戶
#group haproxy #運行haproxy的用戶所在的組
#pidfile /var/run/haproxy.pid #haproxy的進程PID文件
#ulimit-n 819200 #ulimit 的數量限制
#chroot /usr/share/haproxy #chroot運行路徑
#debug #haproxy 調試級別,建議只在開啓單進程的時候調試
####默認配置####
defaults
log global
mode http #默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK
option httplog #日誌類別,採用httplog
option dontlognull #不記錄健康檢查日誌信息
retries 2 #兩次鏈接失敗就認爲是服務器不可用
#option forwardfor #若是後端服務器須要得到客戶端真實ip須要配置的參數,能夠從Http Header中得到客戶端ip
option httpclose #每次請求完畢後主動關閉http通道
#option redispatch #當serverId對應的服務器掛掉後,強制定向到其餘健康的服務器
option abortonclose #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的連接
maxconn 4096 #默認的最大鏈接數
timeout connect 5000ms #鏈接超時
timeout client 30000ms #客戶端超時
timeout server 30000ms #服務器超時
#timeout check 2000 #心跳檢測超時
#timeout http-keep-alive10s #默認持久鏈接超時時間
#timeout http-request 10s #默認http請求超時時間
#timeout queue 1m #默認隊列超時時間
balance roundrobin #設置默認負載均衡方式,輪詢方式
#balance source #設置默認負載均衡方式,相似於nginx的ip_hash
#balnace leastconn #設置默認負載均衡方式,最小鏈接數
####統計頁面配置####
listen stats
bind 0.0.0.0:1080 #鑑定IP及端口
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 \ Haproxy #統計頁面密碼框上提示文本
stats auth admin:123456 #設置監控頁面的用戶和密碼:admin,能夠設置多個用戶名
stats hide-version #隱藏統計頁面上HAProxy的版本信息
stats admin if TRUE #設置手工啓動/禁用後端服務器(haproxy-1.4.9之後版本)
####設置haproxy 錯誤頁面####
#errorfile 403 /home/haproxy/haproxy/errorfiles/403.http
#errorfile 500 /home/haproxy/haproxy/errorfiles/500.http
#errorfile 502 /home/haproxy/haproxy/errorfiles/502.http
#errorfile 503 /home/haproxy/haproxy/errorfiles/503.http
#errorfile 504 /home/haproxy/haproxy/errorfiles/504.http
####frontend前端配置####
frontend main
bind *:80
acl web hdr(host) -i www.abc.com #acl後面是規則名稱,-i爲忽略大小寫,後面跟的是要訪問的域名,若是訪問www.abc.com這個域名,就觸發web規則
acl img hdr(host) -i img.abc.com #若是訪問img.abc.com這個域名,就觸發img規則
use_backend webserver if web #若是上面定義的web規則被觸發,即訪問www.abc.com,就將請求分發到webserver這個做用域。
use_backend imgserver if img #若是上面定義的img規則被觸發,即訪問img.abc.com,就將請求分發到imgserver這個域
default_backend dynamic #不知足則響應backend的默認頁面
####backend後端配置####
backend webserver #webserver做用域
mode http
balance roundrobin #負載均衡算法
option httpchk /index.html HTTP/1.0 #健康檢查, 檢測文件,http版本
server web1 10.16.0.9:8085 weight 5 check inter 2000 rise 2 fall 3
server web2 10.16.0.10:8085 weight 3 check inter 2000 rise 2 fall 3
#rise 2是2次正確認爲服務器可用,fall 3是3次失敗認爲服務器不可用,weight表明權重
####完整的代理設置####
listen tcptest
bind 0.0.0.0:8080
mode tcp
balance source
server s1 192.168.100.206:22 weight 1
server s2 192.168.100.208:22 weight 1
5,負載均衡算法詳解:
1、roundrobin,表示簡單的輪詢,每一個服務器根據權重輪流使用,在服務器的處理時間平均分配的狀況下這是最流暢和公平的算法。該算法是動態的,對於實例啓動慢的服務器權重會在運行中調整。
2、static-rr,表示每一個服務器根據權重輪流使用,相似roundrobin,但它是靜態的,運行時修改權限是無效的。
3、leastconn,表示最少鏈接者先處理,建議用於長會話服務,例如LDAP、SQL、TSE等,而不適合短會話協議。該算法是動態的。
4、first, 第一臺可用的server接受鏈接請求,當鏈接達到最大值時,下一臺server纔會被啓用。該算法會忽略server的權重,適合長鏈接如RDP、http、IMAP等。
5、source,表示根據請求源IP進行哈希,用可用服務器的權重總數除以哈希值,根據結果進行分配。
若是哈希的結果隨可用服務器數量而變化,那麼客戶端會定向到不一樣的服務器;
該算法通常用於不能插入cookie的Tcp模式。它還能夠用於廣域網上爲拒絕使用會話cookie的客戶端提供最有效的鏈接;
該算法默認是靜態的,但會根據「hash-type」的變化作調整。
6、uri,表示根據請求的URI;表示根據請求的URI左端(問號以前)進行哈希,用可用服務器的權重總數除以哈希值,根據結果進行分配。
只要服務器正常,同一個URI地址老是訪問同一個服務器。
通常用於代理緩存和反病毒代理,以最大限度的提升緩存的命中率。該算法只能用於HTTP後端;通常用於後端是緩存服務器;
該算法默認是靜態的。
7、url_param,表示根據請求的URl參數'balance url_param' requires an URL parameter name
在HTTP GET請求的查詢串中查找<param>中指定的URL參數,基本上能夠鎖定使用特製的URL到特定的負載均衡器節點的要求;
該算法通常用於將同一個用戶的信息發送到同一個後端服務器;
該算法默認是靜態的。
8、hdr(name),表示根據HTTP請求頭來鎖定每一次HTTP請求;
在每一個HTTP請求中查找HTTP頭<name>,HTTP頭<name>將被看做在每一個HTTP請求,並針對特定的節點;
若是缺乏頭或者頭沒有任何值,則用roundrobin代替;
該算法默認是靜態的。
9、rdp-cookie(name),表示根據據cookie(name)來鎖定並哈希每一次TCP請求。
爲每一個進來的TCP請求查詢並哈希RDP cookie<name>;
該機制用於退化的持久模式,可使同一個用戶或者同一個會話ID老是發送給同一臺服務器。
若是沒有cookie,則使用roundrobin算法代替;
該算法默認是靜態的
6,健康檢查機制:
HAProxy做爲Loadbalancer,支持對backend的健康檢查,以保證在後端backend不能服務時,把從frotend進來的request分配至其它可服務的backend,從而保證高可用。
相關配置
option httpchk #啓用七層健康檢測
http-check disable-on-404 #若是backend返回404,則除了長鏈接以外的後續請求將不被分配至該backend
http-check send-state #增長一個header,同步HAProxy中看到的backend狀態。該header爲server可見。 X-Haproxy-Server-State: UP 2/3; name=bck/srv2; node=lb1; weight=1/2; scur=13/22; qcur=0
sample:
listen proxy-nginx
bind 0.0.0.0:8080
mode http
balance roundrobin
option httpchk HEAD / HTTP/1.0
server nginx_1 172.17.0.3:80 weight 5 inter 200 check fall 3 rise 2
server nginx_1 172.17.0.4:80 weight 5 inter 200 check fall 3 rise 2
server option:
check:啓用健康檢測
inter:健康檢測間隔
rise:檢測服務可用的連續次數
fall:檢測服務不可用的連續次數
error-limit:往server寫數據連續失敗的次數上限,執行on-error的設定
observe :把正常服務過程做爲健康檢測請求,即實時檢測
on-error :知足error-limit後執行的操做(fastinter、fail-check、sudden-death、mark-down) 。其中fastinter表示當即按照fastinter的檢測延時進行。fail-check表示改次error做爲一次檢測;sudden-death表示模仿一次fatal,若是緊接着一次fail則置server爲down;mark-down表示直接把server置爲down狀態。
retries:鏈接失敗重試的次數,若是重試該次數後還不能正常服務,則斷開鏈接。
Thank you for your time!