目錄
一.HAProxy簡介?
二.HAProxy特點和優點:
三.HAProxy保持會話的三種解決方法
四.HAProxy的balance 8種負載均衡算法
1)RR(Round Robin)
2)LC(Least Connections)
3)SH(Source Hashing)
4)uri(資源標識符)
5)url_param(資源定位符)
7) source
8) static-rr
五.HAProxy 主要工作模式
六. HAProxy 安裝
通過 yum 安裝 HAProxy
七.HAProxy配置文件參數
7.1、HAProxy 環境
7.1.1、 global 全局配置
7.1.2、 proxy 代理配置
7.2、haproxy.cfg 配置文件
八.狀態統計功能測試
九.總結
一.HAProxy簡介?
官網:http://www.haproxy.com
HAProxy 是法國人Willy Tarreau開發的一個開源軟件,是一款應對客戶端10000以上的同時連接的高性能的TCP和 HTTP負載均衡器。其功能是用來提供基于cookie的持久性, 基于內容的交換,過載保護的高級流量管制,自動故障切換 ?,以正則表達式為基礎的標題控制運行時間,基于Web的報表,高級日志記錄以幫助排除故障的應用或網絡及其他功能。
HAProxy 提供高可用性、負載均衡以及基于TCP和HTTP的應用代理,支持虛擬主機,它是免費、快速并且可靠的一種負載均衡解決方案。適合處理高負載站點的 **七層** 數據請求。類似的代理服務可以屏蔽內部真實服務器,防止內部服務器遭受攻擊。
二.HAProxy特點和優點:
-
支持原生SSL,同時支持客戶端和服務器的SSL.
-
支持IPv6和UNIX套字節(sockets)
-
支持HTTP Keep-Alive
-
支持HTTP/1.1壓縮,節省寬帶
-
支持優化健康檢測機制(SSL、scripted TCP、check agent…)
-
支持7層負載均衡。
-
可靠性和穩定性非常好。
-
并發連接 40000-50000個,單位時間處理最大請求 20000個,最大數據處理10Gbps.
-
支持8種負載均衡算法,同時支持session保持。
-
支持虛擬主機。
-
支持連接拒絕、全透明代理。
-
擁有服務器狀態監控頁面。
-
支持ACL(access control list)。
三.HAProxy保持會話的三種解決方法
HAProxy為了讓同一客戶端訪問服務器可以保持會話。有三種解決方法:客戶端IP、Cookie以及Session。
-
通過 客戶端IP 進行Hash計算并保存,以此確保當相同IP訪問代理服務器可以轉發給固定的真實服務器。
-
依靠真實服務器發送客戶端的 Cookie信息 進行會話保持。
-
將保存真實服務器的 Session 以及服務器標識 ,實現會話保持。
(HAProxy只要求后端服務器能夠在網絡聯通,也沒有像LVS那樣繁瑣的ARP配置)
四.HAProxy的balance 8種負載均衡算法
1)RR(Round Robin)
RR算法是最簡單最常用的一種算法,即輪詢調度
理解舉例:有三個節點A、B、C
第一個用戶訪問會被指派到節點A
第二個用戶訪問會被指派到節點B
第三個用戶訪問會被指派到節點C
第四個用戶訪問繼續指派到節點A,輪詢分配訪問請求實現負載均衡效果
2)LC(Least Connections)
最小連接數算法,根據后端的節點連接數大小動態分配前端請求
理解舉例: 有三個節點A、B、C,各節點的連接數分別為A:4 B:5 C:6
第一個用戶連接請求,會被指派到A上,連接數變為A:5 B:5 C:6
第二個用戶請求會繼續分配到A上,連接數變為A:6 B:5 C:6;再有新的請求會分配給B,每次將新的請求指派給連接數最小的客戶端
由于實際情況下A、B、C的連接數會動態釋放,很難會出現一樣連接數的情況
此算法相比較rr算法有很大改進,是米錢用到比較多的一種算法
3)SH(Source Hashing)
基于來源訪問調度算法,用于一些有Session會話記錄在服務端的場景,可以基于來源的IP、Cookie等做集群調度
理解舉例 有三個節點A、B、C,第一個用戶第一次訪問被指派到了A,第二個用戶第一次訪問被指派到了B
當第一個用戶第二次訪問時會被繼續指派到A,第二個用戶第二次訪問時依舊會被指派到B,只要負載均衡器不重啟,第一個用戶都會被指派到A,第二個用戶訪問都會被指派到B,實現集群的調度
此調度算法好處是實現會話保持,但某些IP訪問量非常大時會引起負載不均衡,部分節點訪問量超大,影響業務使用
4)uri(資源標識符)
表示根據請求的URI,做cdn(內容分發網絡)需使用
5)url_param(資源定位符)
表示根據HTTP請求頭來鎖定每 一 次HTTP請求。
6)rdp—cookie(name)
表示根據據cookie (name)來鎖定并哈希每一次TCP請求。
7) source
表示根據請求的源IP,類似Nginx的IP hash機制。
8) static-rr
表示根據權重,輪詢
五.HAProxy 主要工作模式
tcp模式:在客戶端和服務器之間將建立一個全雙工的連接,且不會對7層的報文做任何處理的簡單模式。 通常用于SSL、SSH、SMTP等應用層。
http模式(一般使用):客戶端請求在轉發給后端服務器之前會被深度分析,所有不與RFC格式兼容的請求都會被拒絕。
六. HAProxy 安裝
通過 yum 安裝 HAProxy
七.HAProxy配置文件參數
globallog /dev/log local0 info # 日志輸出到系統日志(local0設備),info級別maxconn 100000 # 進程最大并發連接數[1,4](@ref)user haproxy # 運行用戶group haproxy # 運行組daemon # 守護進程模式nbthread 8 # 工作線程數(建議等于CPU核心數)[1,6](@ref)stats socket /var/run/haproxy.sock mode 660 level admin # 啟用統計套接字(動態管理)tune.bufsize 32768 # 請求緩沖區大小(提升大請求處理能力)[1](@ref)tune.ssl.default-dh-param 2048 # SSL DH參數長度(增強安全性)[1](@ref)ssl-default-bind-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 # 強加密套件ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11 # 禁用不安全協議defaultsmode http # 默認模式(可覆蓋為tcp)timeout connect 5s # 后端連接超時timeout client 30s # 客戶端空閑超時timeout server 30s # 后端響應超時option forwardfor # 添加X-Forwarded-For頭(傳遞客戶端IP)[1,5](@ref)option httplog # 記錄HTTP日志(非TCP)option dontlognull # 不記錄空請求option redispatch # 連接失敗時重試其他服務器[3](@ref)retries 3 # 最大重試次數# 監控統計頁面(安全訪問)
listen statsbind *:8899 # 監聽端口mode httpstats enablestats uri /admin?stats # 訪問路徑stats realm HAProxy\ Stats # 認證域stats auth admin:YourSecurePassword # 認證憑據stats refresh 10s # 自動刷新間隔# HTTPS前端(SSL終止)
frontend https_inbind *:443 ssl crt /etc/haproxy/ssl/example.com.pem alpn h2,http/1.1 # SSL證書及HTTP/2支持http-request set-header X-Client-IP %[src] # 自定義頭部傳遞客戶端IPacl host_static hdr(host) -i static.example.com # ACL:靜態資源域名acl host_api hdr(host) -i api.example.com # ACL:API域名use_backend static_servers if host_static # 按域名路由use_backend api_servers if host_apidefault_backend web_servers # 默認后端# HTTP前端(重定向到HTTPS)
frontend http_inbind *:80redirect scheme https code 301 if !{ ssl_fc } # 強制HTTPS跳轉# 靜態資源后端
backend static_serversbalance leastconn # 最小連接數算法(適合長連接)[3,4](@ref)option httpchk GET /healthcheck # HTTP健康檢查路徑http-check expect status 200 # 預期狀態碼server static1 192.168.1.103:80 check inter 2s rise 2 fall 3 maxconn 500 cookie s1server static2 192.168.1.104:80 check inter 2s rise 2 fall 3 maxconn 500 cookie s2# API后端(會話保持)
backend api_serversbalance source # 源IP哈希(會話保持)[4](@ref)option httpchk GET /api/health # 定制API健康檢查server api1 192.168.1.105:8080 check weight 3server api2 192.168.1.106:8080 check weight 2# 默認Web后端
backend web_serversbalance roundrobin # 輪詢算法(默認)[1,3](@ref)server web1 192.168.1.101:80 check inter 3s rise 2 fall 3 maxconn 1000server web2 192.168.1.102:80 check inter 3s rise 2 fall 3 maxconn 1000
7.1、HAProxy 環境
haproxy的配置文件 haproxy.cfg 的 默認地址:/etc/haproxy/haproxy.cfg 。
haproxy.cfg 由兩大部分組成,分別是 global 和 proxies 部分。
global:全局配置:
進程及安全配置相關的參數
性能調整相關參數
Debug參數
proxies:代理配置
defaults:為 frontend, backend, listen提供默認配置
frontend:前端,相當于 nginx 中的 server {}
backend:后端,相當于 nginx 中的 upstream {}
listen:同時擁有 前端和后端配置
名稱說明:
-
frontend 端(front end):指定接收 客戶端 偵聽套接字設置。
-
backend 端(back end):指定將連接請求轉發至 后端服務器 的相關設置。
-
listen 端:指定完整的前后端設置,只對TCP有效 。
-
proxy 名稱:使用字母 、數字 - 、_ 、. 、: ,并區分字符大小寫。
7.1.1、 global 全局配置
chroot ? ? ? ? ? ? ? ? ? # 鎖定運行目錄
deamon ? ? ? ? ? ? ? ? ? # 以守護進程運行
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin ? ?# socket文件
user, group, uid, gid ? ? # 運行haproxy的用戶身份
nbproc ? ? ? ? ? ? ? ? ? ?# 開啟的haproxy進程數,與CPU保持一致
nbthread ? ? ? ? ? ? ? ? ?# 指定每個haproxy進程開啟的線程數,默認為每個進程一個線程
cpu-map 1 0 ? ? ? ? ? ? ? # 綁定haproxy 進程至指定CPU
maxconn ? ? ? ? ? ? ? ? ? # 每個haproxy進程的最大并發連接數
maxsslconn ? ? ? ? ? ? ? ?# 每個haproxy進程ssl最大連接數,用于haproxy配置了證書的場景下
maxconnrate ? ? ? ? ? ? ? # 每個進程每秒創建的最大連接數量
spread-checks ? ? ? ? ? ? # 后端server狀態check隨機提前或延遲百分比時間,建議2-5(20%-50%)之間
pidfile ? ? ? ? ? ? ? ? ? # 指定pid文件路徑
log 127.0.0.1 local3 info ? ?# 定義全局的syslog服務器;最多可以定義兩個
7.1.2、 proxy 代理配置
主要分為下面4個部分
defaults [<name>] ?# 默認配置項,針對以下的frontend、backend和lsiten生效,可以多個name
frontend <name> ? ?# 前端servername,類似于Nginx的一個虛擬主機 server。
backend <name> ? ? # 后端服務器組,等于nginx的upstream
listen <name> ? ? ?# 將frontend和backend合并在一起配置
1)proxies 配置-defaults
option redispatch ? ? ? ? ? # 當server Id對應的服務器掛掉后,強制定向到其他健康的服務器
option abortonclose ? ? ? ? # 當服務器負載很高的時候,自動結束掉當前隊列處理比較久的鏈接
option http-keep-alive ? ? ?# 開啟與客戶端的會話保持
option forwardfor ? ? ? ? ? # 透傳客戶端真實IP至后端web服務器
mode http ? ? ? ? ? ? ? ? ? # 默認工作類型
timeout connect 120s ? ? ? ?# 客戶端請求到后端server的最長連接等待時間(TCP之前)
timeout server 600s ? ? ? ? # 客戶端請求到后端服務端的超時超時時長(TCP之后)
timeout client 600s ? ? ? ? # 與客戶端的最長非活動時間
timeout http-keep-alive 120s # session 會話保持超時時間,范圍內會轉發到相同的后端服務器
timeout check 5s ? ? ? ? ? ?# 對后端服務器的檢測超時時間
2)proxies配置-frontend 配置參數
#################### 監控頁面的設置 #######################
listen admin_status # Frontend 和Backend 的組合體,監控組的名稱,按需自定義名稱 bind 0.0.0.0:65532 # 監聽端口 mode http # http的7層網絡模式 log 127.0.0.1 local3 err # 錯誤日志記錄 stats refresh 5s # 每隔5秒自動刷新監控頁面 stats uri /admin?stats # 監控頁面的url stats realm itnihao\ itnihao # 監控頁面的提示信息是 it ni hao stats auth admin:admin # 監控頁面的用戶和密碼admin。可以設置多個用戶名,如下所示stats auth admin1:admin1 # 監控頁面的用戶和密碼 admin1 stats hide-version # 隱藏統計頁面上的 HAproxy版本信息 stats admin if TRUE # 手工啟用/禁用,后端服務器(haproxy-1.4.9以后版本) errorfile 403 /etc/haproxy/errorfiles/403.http errorfile 500 /etc/haproxy/errorfiles/500.http errorfile 502 /etc/haproxy/errorfiles/502.http errorfile 503 /etc/haproxy/errorfiles/503.http errorfile 504 /etc/haproxy/errorfiles/504.http################# HAProxy 的日志記錄內容設置 ################### capture request header Host len 40 capture request header Content-Length len 10 capture request header Referer len 200 capture response header Server len 40 capture response header Content-Length len 10 capture response header Cache-Control len 8####################### 網站監測 listen 配置 #####################
########### 此用法主要是監控 haproxy 后端服務器的監控狀態
listen site_status bind 0.0.0.0:1081 # 監聽端口 mode http # http的7層模式 log 127.0.0.1 local3 err # [err warning info debug] monitor-uri /site_status # 網站健康檢測URL,用來檢測HAProxy管理的網站是否可以用,正常返回200,不正常返回503 acl site_dead nbsrv(server_web) lt 2 # 定義網站down時的策略當掛在負載均衡上的指定backend的中有效機器數小于2臺時返回true acl site_dead nbsrv(server_blog) lt 2 acl site_dead nbsrv(server_bbs) lt 2 monitor fail if site_dead # 當滿足策略的時候返回503,網上文檔說的是500,實際測試為503 monitor-net 192.168.16.2/32 # 來自192.168.16.2的日志信息不會被記錄和轉發 monitor-net 192.168.16.3/32 ####################### frontend配置 ################################
##### 注意,frontend 配置里面可以定義多個 acl 進行匹配操作
frontend http_80_in bind 0.0.0.0:80 # 監聽端口,即 haproxy 提供web服務的端口,和 lvs 的vip端口類似 mode http # http的7層模式 log global # 應用全局的日志配置 option httplog # 啟用http的log option httpclose # 每次請求完畢后主動關閉 http 通道,HA-Proxy不支持keep-alive模式 option forwardfor # 如果后端服務器需要獲得客戶端的真實IP需要配置次參數,將可以從 Http Header 中獲得客戶端IP ######################## acl 策略配置acl itnihao_web hdr_reg(host) -i ^(www.itnihao.cn|ww1.itnihao.cn)$ # 如果請求的域名滿足正則表達式中的2個域名返回true -i是忽略大小寫 acl itnihao_blog hdr_dom(host) -i blog.itnihao.cn# 如果請求的域名滿足 www.itnihao.cn 返回true, -i 是忽略大小寫 # acl itnihao hdr(host) -i itnihao.cn # 如果請求的域名滿足 itnihao.cn 返回true, -i是忽略大小寫 # acl file_req url_sub -i killall= # 在請求url中包 含killall= ,則此控制策略返回true,否則為false # acl dir_req url_dir -i allow # 在請求url中存在allow作為部分地址路徑,則此控制策略返回true,否則返回false # acl missing_cl hdr_cnt(Content-length) eq 0 # 當請求的header中Content-length等于0時返回true######################## acl策略匹配相應 # block if missing_cl # 當請求中header中Content-length等于0阻止請求返回403 # block if !file_req || dir_req # block表示阻止請求,返回403錯誤,當前表示如果不滿足策略file_req,或者滿足策略dir_req,則阻止請求 use_backend server_web if itnihao_web # 當滿足 itnihao_web的策略時使用server_web的backend use_backend server_blog if itnihao_blog # 當滿足 itnihao_blog 的策略時使用 server_blog的backend # redirect prefix http://blog.itniaho.cn code 301 if itnihao # 當訪問 itnihao.cn 的時候,用 http 的 301 挑轉到 http://192.168.16.3 default_backend server_bbs ### 以上都不滿足的時候使用默認 server_bbs 的 backend ######################### backend的設置 ######################## ### 下面我將設置三組服務器 server_web,server_blog,server_bbs
############### backend server_web ##############
backend server_web mode http # http的7層模式 balance roundrobin # 負載均衡的方式,roundrobin平均方式 cookie SERVERID # 允許插入serverid到cookie中,serverid后面可以定義 option httpchk GET /index.html # 心跳檢測的文件 server web1 192.168.16.2:80 cookie web1 check inter 1500 rise 3 fall 3 weight 1 server web2 192.168.16.3:80 cookie web2 check inter 1500 rise 3 fall 3 weight 2# server web2 192.168.16.3:80 表示 服務器定義,# cookie web2 表示 serverid為web2,# check inter 1500 表示 檢測心跳頻率,# rise 3 表示 3次正確認為服務器可用, # fall 3 表示 3次失敗認為服務器不可用,# weight 2 表示 權重 ################ backend server_blog ###########
backend server_blog mode http # http 模式 balance roundrobin # 負載均衡的方式,roundrobin 輪詢cookie SERVERID # 允許插入serverid 到 cookie中,serverid 后面可以定義 option httpchk GET /index.html # 心跳檢測的文件 server blog1 192.168.16.2:80 cookie blog1 check inter 1500 rise 3 fall 3 weight 1 server blog2 192.168.16.3:80 cookie blog2 check inter 1500 rise 3 fall 3 weight 2 ################ backend server_bbs #########
backend server_bbs mode http # http的7層模式 balance roundrobin # 負載均衡的方式,roundrobin 輪詢cookie SERVERID # 允許插入 serverid 到 cookie 中,serverid 后面可以定義 option httpchk GET /index.html # 心跳檢測的文件 server bbs1 192.168.16.2:80 cookie bbs1 check inter 1500 rise 3 fall 3 weight 1 server bbs2 192.168.16.3:80 cookie bbs2 check inter 1500 rise 3 fall 3 weight 2
7.2、haproxy.cfg 配置文件
然后登錄網址可以發現是輪詢了?
八.狀態統計功能測試
###只有七層才能配置
listen stats #定義監控頁面 mode httpoption httplogbind *:1080 #綁定端口1080 stats refresh 30s #每30秒更新監控數據 stats uri /stats #訪問監控頁面的uri stats realm HAProxy\ Stats #監控頁面的認證提示 stats auth admin:admin #監控頁面的用戶名和密碼
輸入密碼登錄后的界面
九.總結
本節內容量較小,且內容不難,更多的是去熟練之前的學習,在此基礎上,這些就很簡單了,只需要簡單改兩個配置即可達到目的