HAProxy搭建Web群集
- HAProxy介紹
- HAProxy功能
- 三大軟體負載均衡器對比(LVS Nginx Haproxy)
- 三大軟體負載均衡器適用業務場景
- HAProxy安裝及基礎配置
- 默認yum源
- 第三方安裝包
- 編譯安裝HAProxy
- 解決HAProxy的依賴環境
- 解決lua環境
- 解決各種編譯依賴
- 編譯安裝HAProxy
- 驗證HAProxy版本
- HAProxy啟動腳本
- 組態檔
- 啟動HAProxy
- 組態檔詳解
- global配置引數
- Proxies配置
- Proxies配置-defaults
- Proxies配置-frontend
- Proxies配置-backend
- frontend+backend配置實體
- Proxies配置-listen替代frontend+backend
- HAProxy調度演算法
- 靜態演算法
- static-rr
- 動態演算法
- roundrobin
- leastconn
- 其他演算法
- source
- map-base取模法
- 一致性hash
- HAProxy搭建集群
HAProxy介紹
HAProxy是法國開發者威利塔羅(Willy Tarreau)在2000年使用C語言開發的一個開源軟體,是一款具備高并發(一萬以上)、高性能的TCP和HTTP負載均衡器,支持基于cookie的持久性,自動故障切換,支持正則運算式及web狀態統計
官網網站
HAProxy分為企業版,社區版,
HAProxy功能
HAProxy功能:
- TCP和HTTP反向代理
- 可作為SSL/TSL服務器
- 可以針對HTTP請求添加cookie,進行路由后端服務器
- 可平衡負載至后端服務器,并支持持久連接
- 支持所有主服務器故障切換至備用服務器
- 支持專用埠實作監控服務
- 支持不影響現有連接情況下停止接受新連接請求
- 可以在雙向添加,修改或洗掉HTTP報文首部
- 回應報文壓縮
- 支持基于pattern實作連接請求的訪問控制
- 通過特定的URI為授權用戶提供詳細的狀態資訊
不具備的功能:
- 正向代理 squid,nginx
- 快取代理 varnish
- web服務 nginx.tengine.apache. php.tomcat
- UDP 目前不支持UDP協議,2.1版本會支持UDP協議代理
- 單機性能–LVS
三大軟體負載均衡器對比(LVS Nginx Haproxy)
LVS:
- 抗負載能力強,抗負載能力強、性能高,能達到F5硬體的60%;對記憶體和cpu資源消耗比較低
- 作業在網路4層,通過vrrp協議轉發(僅作分發之用),具體的流量由linux內核處理,因此沒有流量的產生
- 穩定性、可靠性好,自身有完美的熱備方案;(如:LVS+Keepalived)
- 應用范圍比較廣,可以對所有應用做負載均衡
- 不支持正則處理,不能做動靜分離
- 支持負載均衡演算法:rr(輪循)、wrr(加權輪循)、lc(最小連接)、wlc(加權最小連接)
- 配置較復雜,對網路依賴比較大,穩定性很高
Ngnix:
- 作業在網路的7層之上,可以針對http應用做一些分流的策略,比如針對域名、目錄結構
- Nginx對網路的依賴比較小,理論上能ping通就就能進行負載功能
- Nginx安裝和配置比較簡單,測驗起來比較方便
- 也可以承擔高的負載壓力且穩定,一般能支撐超過1萬次的并發
- 對后端服務器的健康檢查,只支持通過埠來檢測,不支持通過url來檢測
- Nginx對請求的異步處理可以幫助節點服務器減輕負載
- Nginx僅能支持http、https和E-mail協議,這樣就使得其在適用范圍上較窄
- 不支持Session的直接保持,但能通過ip_hash來解決,對Big request header的支持不是很好
- 支持負載均衡演算法:Round-robin(輪循)、Weight-round-robin(加權輪循)、Ip-hash(Ip哈希)
- Nginx還能做Web快取服務器即:Cache功能
HAProxy:
- 支持兩種代理模式: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
三大軟體負載均衡器適用業務場景
- 網站建設初期,可以選用Nigix/HAproxy作為反向代理負載均衡(或者流量不大都可以不選用負載均衡),因為其配置簡單,性能也能滿足一般的業務場景,如果考慮到負載均衡器是有單點問題,可以采用Nginx+Keepalived/HAproxy+Keepalived避免負載均衡器自身的單點問題,
- 網站并發達到一定程度之后,為了提高穩定性和轉發效率,可以使用LVS、畢竟LVS比Nginx/HAproxy要更穩定,轉發效率也更高,不過維護LVS對運維人員的要求也會更高,投入成本也更大,
注:Nginx與Haproxy比較:Nginx支持七層、用戶量最大,穩定性高,比較可靠,Haproxy支持四層和七層,支持更多的負載均衡演算法,支持session保存等,具體選型看使用場景,目前來說Haproxy由于彌補了一些Nginx的缺點用戶量也在不斷提升,
HAProxy安裝及基礎配置
默認yum源
默認的base倉庫中包含haproxy的安裝包檔案,但是版本比較舊,是1.5.18的版本,距離當前版本已經有較長時間沒有更新,由于版本比較舊所以有很多功能不支持,如果對功能和性能沒有要求可以使用此版本,否則推薦使用新版本,
yum install -y haproxy
驗證haprovy版本
haproxy -v
HA-Proxy version 1.5.18 2016/05/10
Copyright 2000-2016 Willy Tarreau <willy@haproxy.org>
第三方安裝包
去國外網站下載:https://pkgs.org/search/?q=haproxy
選擇centos7
#基于互聯網在線安裝
# cheese-release-7-1.noarch.rpm 這個包也必須下載 因為是依賴
rpm -ivh cheese-release-7-1.noarch.rpm
會在/etc/yum.repos.d/ 下產生一個新的cheese.repo
yum install -y haproxy-1.8.14-1.el7.x86_64.rpm
#驗證haproxy版本
haproxy -v
HA-Proxy version 1.8.26 2020/08/03
Copyright 2000-2020 Willy Tarreau <willy@haproxy.org>
cat /lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=network.target
[Service]
Environment="CONFIG=/etc/haproxy/haproxy.cfg" "PIDFILE=/run/haproxy.pid"
EnvironmentFile=-/etc/sysconfig/haproxy
ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q
ExecStart=/usr/sbin/haproxy -Ws -f $CONFIG -p $PIDFILE $OPTIONS
ExecReload=/usr/sbin/haproxy -f $CONFIG -c -q
ExecReload=/bin/kill -USR2 $MAINPID
KillMode=mixed
Type=notify
[Install]
WantedBy=multi-user.target
編譯安裝HAProxy
原始碼包下載地址:https://src.fedoraproject.org/repo/pkgs/haproxy/
我下載的是 haproxy-2.3.5.tar.gz
解決HAProxy的依賴環境
解決lua環境
HAProxy支持基于lua實作功能擴展,lua是一種小巧的腳本語言,于1993年由巴西里約熱內盧天主教大學(Pontifical Catholic University of Rio de Janeiro)里的一個研究小組開發,其設計目的是為了嵌入應用程式中,從而為應用程式提供靈活的擴展和定制功能,
Lua應用場景
游戲開發
獨立應用腳本
web應用腳本
擴展和資料庫插件,如MySQL Proxy
安全系統,如入侵檢測系統
由于centos自帶的lua版本比較低并不符合HAProxy要求的lua最低版本(5.3)的要求,因此需要編譯安裝較新版本的lua環境,然后才能編譯安裝HAProxy,
curl -R -O https://www.lua.org/ftp/lua-5.4.3.tar.gz
tar xf lua-5.4.3.tar.gz -C /usr/local
cd /usr/local/lua-5.4.3
yum install -y readline-devel
make linux
查看安裝版本
./src/lua
lua-5.4.3 Copyright (C) 1994-2020 Lua.org, PUC-Rio
> print('hello world')
hello world
解決各種編譯依賴
yum install -y gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools iotop bc zlib-devel ntpdate lsof tcpdump
編譯安裝HAProxy
進入haproxy原始碼包目錄
make -j `lscpu |awk 'NR==4{print $2}'` ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE
_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 USE_LUA=1 LUA_INC=/usr/local/lua-5.4.3/src/ LUA_LIB=/usr/local/lua-5.4.3/src/ PREFIX=/usr/local/haproxy
echo $? 檢查是否成功編譯
make install PREFIX=/usr/local/haproxy
驗證HAProxy版本
cd /usr/local/haproxy/sbin
./haproxy -v
HA-Proxy version 2.3.5-5902ad9 2021/02/06 - https://haproxy.org/
Status: stable branch - will stop receiving fixes around Q1 2022.
Known bugs: http://www.haproxy.org/bugs/bugs-2.3.5.html
Running on: Linux 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64
HAProxy啟動腳本
vim /lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
組態檔
建立組態檔
創建組態檔目錄
mkdir -p /etc/haproxy
將樣本組態檔拷貝到/etc/haproxy里
cp examples/haproxy.cfg /etc/haproxy/haproxy.cfg
如果沒有haproxy.cfg 可以自己寫一個
vim /etc/haproxy/haproxy.cfg
global
user haproxy # 用戶
group haproxy
daemon
nbproc 2
#cpu-map 1 0
#cpu-map 2 1
maxconn 100000
chroot /usr/local/haproxy # 鎖定家目錄
pidfile /var/lib/haproxy/haproxy.pid #pid檔案位置
log 127.0.0.1 local0 info
defaults
log global
option httplog
option http-keep-alive
option redispatch
option forwardfor
maxconn 100000
mode http
retries 3
timeout check 5s
timeout connect 5s
timeout client 60s
timeout server 60s
timeout http-request 10s
timeout queue 1m
listen stats
bind 0.0.0.0:1234 # 埠1234
log global
mode http
stats enable
stats hide-version
stats realm Haproxy\ Statistics
stats uri /stats # 查看狀態網頁后綴
stats refresh 5s
stats auth admin:123 # 授權訪問 用戶名:密碼
創建haproxy用戶和組
groupadd haproxy
useradd -M -s /sbin/nologin haproxy -g haproxy
給用戶haproxy授權
mkdir -p /var/lib/haproxy
chown -R haproxy:haproxy /usr/local/haproxy/
chown -R haproxy:haproxy /var/lib/haproxy/
啟動HAProxy
systemctl start haproxy
systemctl enable haproxy
systemctl status haproxy
瀏覽器輸入自己ip:埠/stats


至此 說明HAProxy安裝成功
組態檔詳解
HAPrpxy的組態檔haproxy.cfg由兩大部分組成,分別是global和proxies部分,
-
global:全域配置段
行程及安全配置相關的引數
性能調整相關引數
Debug引數 -
proxies:代理配置段
defaults:為frontend,backend,listen提供默認配置
frontend:前端,相當于nginx中的server { }
backend:后端,相當于nginx中的upstrea { }
listen:同時擁有前端和后端配置
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
cpu-map 2 1
如果nbproc 4
cpu-map 1 0
cpu-map 2 1
cpu-map 3 2
cpu-map 4 3
maxconn每個haproxy行程的最大并發連接數
maxsslconn每個haproxy行程ssl最大連接數,用于haproxy配置了證書的場景下
maxconnrate每個行程每秒創建的最大連接數量
spread-checks后端server狀態check隨機提前或延遲百分比時間,建議2-5(28%-50%)之間
pidfile指定pid檔案路徑
log 127.0.0.1 local3 info #定義全域的syslog服務器;最多可以定義兩個
Proxies配置
Proxies配置-defaults
option redispatch當server Id對應的服務器掛掉后,強制定向到其他健康的服務器,重新派發(這個選項常用)
option abortonclose當服務器負載很高的時候,自動結束掉當前佇列處理比較久的鏈接
option http-keep-alive開啟與客戶端的會話保持
option forwardfor透傳客戶端真實IP至后端web服務器
mode http設定默認作業型別
timeout http-keep-alive 120ssession會話保持超時時間,范圍內會轉發到相同的后端服務器
timeout connect 120s客戶端請求從haproxy到后端server的最長連接等待時間(TCP之前)
timeout server 600s客戶端請求從haproxy到后端服務端的請求處理超時時長(TCP之后)
timeout client 600s設定haproxy與客戶端的最長非活動時間
timeout check 5s對后端服務器的默認檢測超時時間
Proxies配置-frontend
bind:指定HAProxy的監聽地址,可以是IPV4或IPV6,可以同時監聽多個IP或埠,可同時用于listen欄位中
bind[<address>] :<port_range> [,...][param*]
listen http_proxy #監聽http的多個IP的多個埠和sock檔案
bind :80, :443, :8881-8810
bind 10.0.0.1:10080,10.0.0.1:10443
bind /var/run/ss1-frontend.sock user root mode 600 accept-proxy
listen http_https_proxy whttps監聽
bind :80
bind :443 ssl crt /etc/haproxy/site.pem
listen http_https_proxy_explicit #監聽ipv6.ipv4和unix sock檔案
bind ipv6e:80
bind ipv4epublic_ssl:443 ssl crt /etc/haproxy/site.pem
bind unix@ssl-frontend.sock user root mode 600 accept-proxy
listen external_bind_app1 #監聽file descriptor
bind "fdGs{FD_APP1y"
示例:
frontend wEB_PORT
bind :80,:8088
bind 192.168.188.102:10080,:8801-8810,192.168.188.101:9001-9010
mode http/tcp # 指定負載協議型別
use_backend backend_name # 呼叫的后端服務器組名稱
Proxies配置-backend
定義一組后端服務器,backend服務器將被frontend進行呼叫,
mode http/tcp #指定負載協議型別
option #配置選項
server #定義后端real server
- 注意:option后面加httpchk,smtpchk, mysql-check, pgsql-check,ssl-hello-chk方法,可用于實作更多應用層檢測功能,
check # 對指定real進行健康狀態檢查,默認不開啟
addr IP # 可指定的健康狀態監測IP
port num # 指定的健康狀態監測埠
inter num # 健康狀態檢查間隔時間,默認2008 ms
fall num # 后端服務器失效檢查次數,默認為3
rise num # 后端服務器從下線恢復檢查次數,默認為2
weight # 默認為1,最大值為256,0表示不參與負載均衡
backup # 將后端服務器標記為備份狀態
disabled # 將后端服務器標記為不可用狀態
redirect prefix http://www.maomao.com/ # 將請求臨時重定向至其它URL,只適用于http模式
maxconn <maxconn>:當前后端server的最大并發連接數
backlog <backlog>:當server的連接數達到上限后的后援佇列長度
示例:
frontend WEB_PORT
bind :80
use_backend linux88-host
backend linux88-host
server web1 192.168.188.101:80 check inter 2s fall 3 rise 5
server web2 192.168.188.188:8080 check inter 2s fall 3 rise 5


frontend WEB_PORT
bind :80
use_backend linux88-host
backend linux88-host
server web1 192.168.188.101:80 check inter 2s fall 3 rise 5
server web2 192.168.188.188:8080 check addr 192.168.188.188 port 8080 inter 2s fall 3 rise 5
frontend+backend配置實體
#官網業務訪問入口==============================
frontend WEB_PORT_80
bind 192.168.188.10:80
mode http
use_backend web_prot_http_nodes
backend web_prot_http_nodes
mode http
option forwardfor
server 192.168.188.100 192.168.188.100:8080 check inter 3000 fall 3 rise 5
server 192.168.188.101 192.168.188.101:8080 check inter 3000 fall 3 rise 5
Proxies配置-listen替代frontend+backend
listen的方式是最常用的
使用listen替換frontend和backend的配置方式:
#官網業務訪問入口=====================================
listen WEB_PORT_80
bind 192.168.188.10:80
mode http
option forwardfor
server webi 192.168.188.100:80 check inter 3000 fall 3 rise 5
server web2 192.168.188.101:80 check inter 3000 fall 3 rise 5

HAProxy調度演算法
HAProxy通過固定引數balance指明對后端服務器的調度演算法,該引數可以配置在listen或backend選項中,
HAProxy的調度演算法分為靜態和動態調度演算法,但是有些演算法可以根據引數在靜態和動態演算法中相互轉換,
靜態演算法
- 靜態演算法:按照事先定義好的規則輪詢公平調度,不關心后端服務器的當前負載、鏈接數和回應速度等,且無法實時修改權重,只能靠重啟HAProxy生效,
服務器動態權重調整:
yum install socat
Socat 是 Linux下的一個多功能的網路工具,名字來由是Socket CAT,
Socat 的主要特點就是在兩個資料流之間建立通道,且支持眾多協議和鏈接方式,
如IP、TCP、UDP、IPv6、Socket檔案等,
echo "show info" | socat stdio /var/lib/haproxy/haproxy.sock
echo "get weight web_host/web1" | socat stdio /var/lib/haproxy/haproxy. sock1 (initial 1)
echo "set weight web_host/web1 2" socat stdio /var/lib/haproxy/haproxy.sockBackend is using a static LB algorithm and only accepts weights ' e%' and '100%"
static-rr
static-rr:基于權重的輪詢調度,不支持權重的運行時調整及后端服務器慢啟動,其后端主機數量沒有限制
listen web_host
bind 192.168.188.10:80,:8801-8810,192.168.188.10:9001-9010
mode http
log global
balance static-rr
server web1 192.168,188.100:80 weight 1 check inter 3000 fall 2 rise 5
server web2 192.168.188.101:80 weight 2 check inter 3000 fall 2 rise 5
動態演算法
動態演算法:基于后端服務器狀態進行調度適當調整,比如優先調度至當前負載較低的服務器,且權重可以在haproxy運行時動態調整 無需重啟
roundrobin
roundrobin:基于權重的輪詢動態調度演算法,支持權重的運行時調整,不完全等于lvs中的rr輪訓模式,HAProxy中的roundrobin支持慢啟動(新加的服務器會逐漸增加轉發數),其每個后端backend中最多支持4095個realserver,roundrobin為默認調度演算法,且支持對real server權重動態調整,
listen web_host
bind 192.168.188.10:80,:8801-8810,192.168.188.10:9001-9010
mode http
log global
balance roundrobin
server web1 192.168.188.100:80 weight 1 check inter 3000 fall 2 rise 5
server web2 192.168.188.101:80 weight 2 check inter 3000 fall 2 rise 5
leastconn
leastconn 加權的最少連接的動態,支持權重的運行時調整和慢啟動,即當前后端服務器連接最少的優先調度(新客戶端連接),比較適合長連接的場景使用,比如MySQL等場景,
listen web_host
bind 192.168.188.10:80,:8801-8810,192.168.188.10:9001-9010
mode http
log global
balance leastconn
server web1 192.168.188.100:80 weight 1 check inter 3000 fall 2 rise 5
server web2 192.168.188.101:80 weight 1 check inter 3000 fall 2 rise 5
其他演算法
其他部分演算法即可作為靜態演算法,又可以通過選項成為動態演算法
source
源地址hash,基于用戶源地址hash并將請求轉發到后端服務器,默認為靜態即取模方式,但是可以通過hash-type支持的選項更改,后續同一個源地址請求將被轉發至一個后端web服務器,比較適用于session保持/快取業務等場景
源地址有兩種轉發客戶端請求到后端服務器的服務器選取計算方式,分別是取模法和一致性hash
map-base取模法
map-based:取模法,基于服務器總權重的hash陣列取模,該hash是靜態的即不支持在線調整權重,不支持慢啟動,其對后端服務器調度均衡,缺點是當服務器的總權重發生變化時,即有服務器上線或下線,都會因權重發生變化而導致調度結果整體改變,
所謂取模運算,就是計算兩個數相除之后的余數,10%7=3,7%4=3,基于權重取模:(2^32-1)%(1+1+2)
取模法配置示例:
listen web_host
bind 192.168.188.10:80, :8801-8810,192.168.188.10:9001-9010
mode tcp
log global
balance source
server web1 192.168.188.100:80 weight 1 check inter 3000 fall 2 rise 5
server web2 192.168.188.101:80 weight 1 check inter 3000 fall 2 rise 5
一致性hash
一致性哈希,該hash是動態的,支持在線調整權重,支持慢啟動,優點在于當服務器的總權重發生變化時,廚調度結果影響是區域的,不會引起大的變動,hash (o)mod n,
hash物件
hash物件到后端服務器的映射關系

配置示例
listen web_host
bind 192.168.188.10:80,:8801-8810,192.168.188.10:9001-9010
mode tcp
log global
balance source
hash-type consistent
server web1 192.168.188.100:80 weight 1 check inter 3000 fall 2 rise 5
server web2 192.168.188.101:80 weight 1 check inter 3000 fall 2 rise 5
HAProxy搭建集群
詳細的HAProxy搭建集群可以參考我另一篇文章:
AProxy+Keepalived 負載均衡高可用配置
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272811.html
標籤:其他
上一篇:“服務器最小化安裝CentOS 7.8后,安裝不了httpd、使用不了ifconfig甚至ping不通百度”的解決方案
