haproxy詳解

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!

相關文章
相關標籤/搜索