Haproxy簡介
HAProxy提供高可用、負載均衡以及基於TCP和HTTP的應用代理,適合處理高負載站點的七層數據請求。相似的代理服務能夠屏蔽內部真實服務器,防止內部服務器遭受***。
HAProxy特色和優勢:
1.支持原聲SSL,同時支持客戶端和服務器的SSL.
2.支持IPv6和UNIX套字節(sockets)
3.支持HTTP Keep-Alive
4.支持HTTP/1.1壓縮,節省寬帶
5.支持優化健康檢測機制(SSL、scripted TCP、check agent...)
6.支持7層負載均衡。
7.可靠性和穩定性很是好。
8.併發鏈接40000-50000個,單位時間處理最大請求20000個,最大數據處理10Gbps.
9.支持8種負載均衡算法,同時支持session保持。
10.支持虛擬主機。
11.支持鏈接拒絕、全透明代理。
12.擁有服務器狀態監控頁面。
13.支持ACL.javascript
一、支持兩種代理模式:TCP(四層)和HTTP(七層),支持虛擬主機;
二、可以補充Nginx的一些缺點好比Session的保持,Cookie的引導等工做
三、支持url檢測後端的服務器出問題的檢測會有很好的幫助。
四、更多的負載均衡策略好比:動態加權輪循(Dynamic Round Robin),加權源地址哈希(Weighted Source Hash),加權URL哈希和加權參數哈希(Weighted Parameter Hash)已經實現
五、單純從效率上來說HAProxy更會比Nginx有更出色的負載均衡速度。
六、HAProxy能夠對Mysql進行負載均衡,對後端的DB節點進行檢測和負載均衡。
九、支持負載均衡算法:Round-robin(輪循)、Weight-round-robin(帶權輪循)、source(原地址保持)、RI(請求URL)、rdp-cookie(根據cookie)
十、不能作Web服務器即Cache。
https://blog.csdn.net/HzSunshine/article/details/61671730css
2.配置文件
HAProxy配置中分五大部分:
global: 全局配置參數,進程級的,用來控制Haproxy啓動前的一些進程及系統設置
defaults: 配置一些默認的參數,能夠被frontend,backend,listen段繼承使用
frontend: 用來匹配接收客戶所請求的域名,uri等,並針對不一樣的匹配,作不一樣的請求處理
backend: 定義後端服務器集羣,以及對後端服務器的一些權重、隊列、鏈接數等選項的設置,我將其理解爲Nginx中的upstream塊
listen: frontend和backend的組合體html
日誌配置:
日誌的level: local0~local7 16~23保留爲本地使用
emerg 0 系統不可用
alert 1 必須立刻採起行動的事件
crit 2 關鍵的事件
err 3 錯誤事件
warning 4 警告事件
notice 5 普通但重要的事件
info 6 有用的信息
debug 7 調試信息
-----------------------------------------------------------------------
#全局配置
global
log 127.0.0.1 local2 #全局的日誌配置,使用log關鍵字,指定使用127.0.0.1上的syslog服務中的local0日誌設備,記錄日誌等級爲info的日誌
chroot /var/lib/haproxy #修改haproxy的工做目錄至指定目錄並在放棄權限前執行chroot()操做,能夠提高haproxy安全級別
pidfile /var/run/haproxy.pid
maxconn 4096 # 定義每一個haproxy進程的最大鏈接數 ,因爲每一個鏈接包括一個客戶端和一個服務器端,因此單個進程的TCP會話最大數目將是該值的兩倍,需考慮ulimit-n限制,默認4096
user haproxy #
group haproxy #設置運行haproxy的用戶和組,也可以使用uid,gid關鍵字替代
daemon #以守護進程的方式運行
nbproc 1 # 設置haproxy啓動時的進程數,根據官方文檔的解釋,我將其理解爲:該值的設置應該和服務器的CPU核心數一致;建立多個進程數,能夠減小每一個進程的任務隊列,可是過多的進程數也可能會致使進程的崩潰
stats socket /var/lib/haproxy/stats 前端
defaults
mode http # mode語法:mode {http|tcp|health} 。http是七層模式,tcp是四層模式,health是健康檢測,返回OK
log global
option httplog # 啓用日誌記錄HTTP請求,默認haproxy日誌記錄是不記錄HTTP請求的,只記錄「時間[Jan 5 13:23:46] 日誌服務器[127.0.0.1]
option dontlognull #啓用該項,日誌中將不會記錄空鏈接。所謂空鏈接就是在上游的負載均衡器或者監控系統爲了探測該服務是否存活可用時,須要按期的鏈接或者獲取某一固定的組件或頁面,或者探測掃描端口是否在監聽或開放等動做被稱爲空鏈接;
#官方文檔中標註,若是該服務上游沒有其餘的負載均衡器的話,建議不要使用該參數,由於互聯網上的惡意掃描或其餘動做就不會被記錄下來#
option http-server-close #每次請求完畢後主動關閉http通道,haproxy不支持keep-alive,只能模擬這種模式的實現
option forwardfor except 127.0.0.0/8
option redispatch #當使用了cookie時,haproxy將會將其請求的後端服務器的serverID插入到cookie中,以保證會話的SESSION持久性;而此時,若是後端的服務器宕掉了,可是客戶端的cookie是不會刷新的,若是設置此參數,將會將客戶的請求強制定向到另一個後端server上,以保證服務的正常,可定義到default模塊
retries 3 # 定義鏈接後端服務器的失敗重連次數,鏈接失敗次數超過此值後將會將對應後端服務器標記爲不可用
timeout http-request 10s #默認http請求超時時間
timeout queue 1m #默認隊列超時時間
timeout connect 10s #鏈接超時
timeout client 1m #客戶端超時
timeout server 1m #服務器超時
timeout http-keep-alive 10s #長鏈接超時時間
timeout check 10s #心跳檢測超時
maxconn 4096 #默認的最大鏈接數java
#frontend前端配置
frontend main *:5000 #監聽地址端口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 #若是上面定義的web規則被觸發,請求發到static
default_backend app #指定後端服務池,將對應的請求轉發給後端web
backend static #靜態/動態資源分離
balance roundrobin #balance roundrobin 負載輪詢,balance source 保存session值,支持static-rr,leastconn,first,uri等參數
server static 127.0.0.1:4331 checkredis
#backend後端配置
backend app #後端
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
server web03 127.0.0.1:5005 check inter 2000 fall 3 weight 30
#更詳細的權重定義,check inter 2000 是檢測心跳頻率
#rise 2是2次正確認爲服務器可用,fall 3是3次失敗認爲服務器不可用,weight表明權重算法
負載均衡:
1、roundrobin,表示簡單的輪詢,每一個服務器根據權重輪流使用,在服務器的處理時間平均分配的狀況下這是最流暢和公平的算法。該算法是動態的,對於實例啓動慢的服務器權重會在運行中調整。sql
2、static-rr,表示根據權重,建議關注;每一個服務器根據權重輪流使用,相似roundrobin,但它是靜態的,意味着運行時修改權限是無效的。另外,它對服務器的數量沒有限制。後端
3、leastconn,表示最少鏈接者先處理,建議關注;leastconn建議用於長會話服務,例如LDAP、SQL、TSE等,而不適合短會話協議。如HTTP.該算法是動態的,對於實例啓動慢的服務器權重會在運行中調整。
4、source,表示根據請求源IP,建議關注;對請求源IP地址進行哈希,用可用服務器的權重總數除以哈希值,根據結果進行分配。只要服務器正常,同一個客戶端IP地址老是訪問同一個服務器。若是哈希的結果隨可用服務器數量而變化,那麼客戶端會定向到不一樣的服務器; 該算法通常用於不能插入cookie的Tcp模式。它還能夠用於廣域網上爲拒絕使用會話cookie的客戶端提供最有效的粘連;該算法默認是靜態的,因此運行時修改服務器的權重是無效的,可是算法會根據「hash-type」的變化作調整。
5、uri,表示根據請求的URI;表示根據請求的URI左端(問號以前)進行哈希,用可用服務器的權重總數除以哈希值,根據結果進行分配。只要服務器正常,同一個URI地址老是訪問同一個服務器。通常用於代理緩存和反病毒代理,以最大限度的提升緩存的命中率。該算法只能用於HTTP後端;該算法通常用於後端是緩存服務器;該算法默認是靜態的,因此運行時修改服務器的權重是無效的,可是算法會根據「hash-type」的變化作調整。
6、url_param,表示根據請求的URl參數'balance url_param' requires an URL parameter name,在HTTP GET請求的查詢串中查找<param>中指定的URL參數,基本上能夠鎖定使用特製的URL到特定的負載均衡器節點的要求;該算法通常用於將同一個用戶的信息發送到同一個後端服務器;該算法默認是靜態的,因此運行時修改服務器的權重是無效的,可是算法會根據「hash-type」的變化作調整。
7、hdr(name),表示根據HTTP請求頭來鎖定每一次HTTP請求;在每一個HTTP請求中查找HTTP頭<name>,HTTP頭<name>將被看做在每一個HTTP請求,並針對特定的節點;若是缺乏頭或者頭沒有任何值,則用roundrobin代替;該算法默認是靜態的,因此運行時修改服務器的權重是無效的,可是算法會根據「hash-type」的變化作調整。
8、rdp-cookie(name),表示根據據cookie(name)來鎖定並哈希每一次TCP請求。爲每一個進來的TCP請求查詢並哈希RDP cookie<name>;該機制用於退化的持久模式,可使同一個用戶或者同一個會話ID老是發送給同一臺服務器。若是沒有cookie,則使用roundrobin算法代替;該算法默認是靜態的,因此運行時修改服務器的權重是無效的,可是算法會根據「hash-type」的變化作調整。
http://www.javashuo.com/article/p-drvjgjme-e.html
https://blog.csdn.net/tantexian/article/details/50056199