haproxy-詳解

不用去猜。發表於2021-12-30

負載均衡型別:

四層:

LVS (Linux Virtual Server)
HAProxy (High Availability Proxy)
Nginx (1.9以上)

七層:

 

HAProxy
Nginx

硬體:

 

F5 https://F5.com/zh

Netscaler https://www.citrix.com.cn/products/citrix-adc

Array https://www.arraynetworks.com.cn

深信服 http://www.sangfor.com.cn

北京靈州 http://www.lingzhou.com.cn/cpzx/llfzjh

 

 

應用 場景

四層: Redis   Mysql  rabbitmq  memcache 等
七層: nginx   tomcat apache php   圖片 動靜分離 API 等

 

HAProxy安裝及基礎配置

https://www.haproxy.org/

image-20211213172817104

 

image-20211213172911392

 

debian apt 安裝

image-20211213173031447

如圖所示按自己的 debian 版本 和 需要安裝的 haproxy 版本 自行選擇

 

 

安裝最新長期穩定版 debian 需要匯入一個新包的配置
不知道咋回事 haproxy 官方的給的程式碼 上圖中 是錯誤的
需要 vim /etc/apt/sources.list.d/backports.list
插入下面一行程式碼
deb http://deb.debian.org/debian bullseye-backports main       #debian官方給的

apt update   更新一下源
apt install -t bullseye-backports haproxy=2.4.\*     安裝的時候需要指定 -t bullseye-backports

 

https://backports.debian.org/Instructions/ debian官方的backports 配置

 

 

 

 

 

ubuntu apt 安裝

 

image-20211213174413415

 

如圖所示  按照自己的 ubuntu 版本  和  所需的haproxy 版本 自行選擇  

 

 

 

 

 

 

centos7 yum 安裝

 

CentOS 中yum安裝版本太低,是1.5版本

可以新增yum源

使用其他的yum源,我們這裡就使用IUS源。

IUS is a yum repository that provides newer versions of select software for RHEL and CentOS.

它為CentOS按RHEL提供最新軟體版本的yum源。

 

vim /etc/yum.repos.d/ius-7.repo



[ius]

name = IUS for Enterprise Linux 7 - $basearch

baseurl = https://repo.ius.io/7/$basearch/

enabled = 1

repo_gpgcheck = 0

gpgcheck = 1

gpgkey = https://repo.ius.io/RPM-GPG-KEY-IUS-7

[ius-debuginfo]

name = IUS for Enterprise Linux 7 - $basearch - Debug

baseurl = https://repo.ius.io/7/$basearch/debug/

enabled = 0

repo_gpgcheck = 0

gpgcheck = 1

gpgkey = https://repo.ius.io/RPM-GPG-KEY-IUS-7

[ius-source]

name = IUS for Enterprise Linux 7 - Source

baseurl = https://repo.ius.io/7/src/

enabled = 0

repo_gpgcheck = 0

gpgcheck = 1

gpgkey = https://repo.ius.io/RPM-GPG-KEY-IUS-7



清理快取:yum clean all
更新快取:yum makecache fast

 

 

 

 

 

編譯安裝 centos7

 

https://www.haproxy.org/

image-20211213194509129

點選Latest version 選擇 原始碼包的 版本

 

https://www.lua.org/ # lua官網





yum install gcc openssl-devel readline-devel systemd-devel make pcre-devel #依賴包



wget https://www.haproxy.org/download/2.3/src/haproxy-2.3.16.tar.gz   #右鍵點選複製連線

curl https://www.lua.org/ftp/lua-5.3.5.tar.gz > lua-5.3.5.tar.gz #haproxy如果編譯開啟lua 需要安裝lua

tar xf lua-5.3.5.tar.gz -C /usr/local/src/       #解壓lua  

cd /usr/local/src/lua-5.3.5  

make INSTALL_TOP=/usr/local/lua-5.3.5 linux install   #安裝lua





tar xf haproxy-2.2.19.tar.gz -C /usr/local/src/     #解壓haproxy

cd /usr/local/src/haproxy-2.2.19/    

編譯引數: 可以檢視當前目錄裡邊的 INSTALL 和 README 檔案   看需求編譯



make -j $(nproc) TARGET=linux-glibc                 USE_OPENSSL=1 USE_ZLIB=1 USE_LUA=1 USE_PCRE=1 USE_SYSTEMD=1 LUA_INC=/usr/local/lua-5.3.5/include LUA_LIB=/usr/local/lua-5.3.5/lib    

make PREFIX=/usr/local/haproxy-2.2.19 install     #編譯安裝
ln -sv /usr/local/haproxy-2.2.19/ /usr/local/haproxy   #做個軟連線




用 systemd 管理 haproxy

vim /usr/lib/systemd/system/haproxy.service   #加入如下程式碼,或者用yum 安裝一個 直接照抄 修改一些關鍵屬性  

[Unit]
Description=HAProxy Load Balancer
After=network-online.target
Wants=network-online.target

[Service]
EnvironmentFile=-/etc/sysconfig/haproxy
Environment="CONFIG=/etc/haproxy/haproxy.cfg" "PIDFILE=/run/haproxy.pid"
ExecStartPre=/usr/local/haproxy/sbin/haproxy -f $CONFIG -c -q $OPTIONS
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f $CONFIG -p $PIDFILE $OPTIONS
ExecReload=/usr/local/haproxy/sbin/haproxy -f $CONFIG -c -q $OPTIONS
ExecReload=/bin/kill -USR2 $MAINPID
KillMode=mixed
SuccessExitStatus=143
Type=notify

[Install]
WantedBy=multi-user.target





systemctl daemon-reload       # 重啟一下system 服務






還不能啟動   需要 根據上述程式碼中的指定的路徑 建立編寫配置檔案
mkdir /var/lib/haproxy
mkdir /etc/haproxy
vim /etc/haproxy/haproxy.service   加入如下程式碼, PS企業常用配置  


——————————————————————————————————————————————————————————————————————————————————-——


global
maxconn 100000
chroot /usr/local/haproxy
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 99
gid 99
daemon
#nbproc 4
#cpu-map 1 0
#cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
#nbthread 4
spread-checks 5
pidfile /var/lib/haproxy/haproxy.pid
log 127.0.0.1 local3 info


defaults
option redispatch
#option abortonclose
option http-keep-alive
option forwardfor
maxconn 100000
mode http
timeout connect 30s
timeout client 60ms
timeout server 60ms



listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth luoluo:angel4239360


————————————————————————————————-————————————————————-——————--——

systemctl start haproxy









 

 

 

 

haproxy 配置引數

 

image-20211214221312020

 

image-20211214224137314

 

global             #全域性配置
maxconn 100000       #單個程式的最大併發數,建議調大一點


最大連線數
chroot /usr/local/haproxy                                           #鎖定執行目錄
#stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin #沒有多程式用這個
stats socket /var/lib/haproxy/haproxy.sock1 mode 600 level admin process 1
stats socket /var/lib/haproxy/haproxy.sock2 mode 600 level admin process 2
這樣寫, 防止開啟多程式模式下,伺服器上線,下線時,利用 socat 動態關閉,開啟,或者更改 權重時,會有其他程式沒有關掉,或開啟。用socat關閉或者開啟的時候要把多個sock全都關閉或者開啟 (通俗來說就是多個人幹活,我只通知了一個人,其他人不知道)

uid 99     #nobody 使用者
gid 99      
daemon         #已守護程式方式執行
spread-checks 5   #後端server狀態check隨機提前或延遲百分比時間,建議2-5(20%-50%)之間
#nbproc 4       # 相當於 nginx 的繫結 cpu 開啟多程式 cpu-map 表示哪個程式繫結在哪個cpu上
#cpu-map 1 0
#cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
nbthread 4       # 表示開啟多個執行緒   跟nbproc是衝突的,只能選擇一個   建議開啟多程式的,除非單核資源有限
#pidfile /var/lib/haproxy/haproxy.pid     #pid 檔案指定路徑
log 127.0.0.1 local3 info    


defaults   #預設設定模組,如果後邊寫到了這裡就不生效了
option redispatch     #當server ID對應的伺服器掛掉後,強制定向到其他健康的伺服器,重新派發
#option abortonclose   #當伺服器負載很高的時候,自動結束掉當前佇列處理比較久的連線   不建議開啟,看具體需求
option http-keep-alive #開啟會話保持
option forwardfor     #透傳客戶端真實IP至後端web伺服器
maxconn 100000     # 單個程式的最大併發數,建議調大一點
mode http     #設定預設工作型別
timeout http-keep-alive 120s     # session 會話保持超時時間,範圍內會轉發到相同的後端伺服器
timeout connect 30s # 客戶端請求從 haproxy 到後端 server 的最長連線等待時間 (TCP之前)
timeout client 60s   #設定 haproxy 與客戶端的最長非活動時間  
timeout server 60s # 客戶端請求從 haproxy 到後端伺服器的請求處理時長 (TCP之後)
timeout check 5s   #對後端伺服器的預設檢測超時時間
           



listen stats           這一段頁面監控
mode http  
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth luoluo:angel4239360






frontend WEB_PORT         負載後端伺服器 第一種 寫法   不常用 建議用下面的
bind :80
use_backend luoluo-host

backend luoluo-host
server web1 192.168.154.129:80 check addr 192.168.154.129 port 80 inter 2s fall 3 rise 5




listen luo                     負載後端伺服器 第二種寫法   建議用這種
bind 192.168.154.173:2333
  server web1 192.168.154.129:80 weight 1 check addr 192.168.154.129 port 80 inter 2s fall 3 rise 5
  server diertai 192.168.154.172:80 weight 1 check inter 2s fall 3 rise 5






 

 

 

 

 

 

 

排程演算法

 

 

 

 

image-20211215114437435

 

image-20211215153417077

 

image-20211215154102652

image-20211215155043385

 

 

image-20211215155522813

image-20211216214220887

image-20211216214823745

 

socat 動態操作 haproxy


socat 動態更改的操作,會在 haproxy 重啟,或者reload 時 失效,以配置檔案為準



socat - /var/lib/haproxy/haproxy.sock   #互動式操作
for i in `seq 5`;do socat - /var/lib/haproxy/haproxy.sock ; done   #迴圈操作
echo "help" | socat stdio /var/lib//haproxy/haproxy.sock   #檢視幫助資訊
echo "get weight luoluo-host/web1" | socat stdio /var/lib//haproxy/haproxy.sock 檢視當前伺服器的權重
echo "set weight luoluo-host/web1 5" | socat stdio /var/lib//haproxy/haproxy.sock 更改當前伺服器的權重,靜態演算法不支援更改
echo "set disable server luoluo-host/web1" | socat stdio /var/lib//haproxy/haproxy.sock   關閉當前後端伺服器的轉發
echo "set enable server luoluo-host/web1" | socat stdio /var/lib//haproxy/haproxy.sock 開啟當前後端伺服器的轉發