Haproxy - Web負載均衡解決方案
- 一、常用的負載調度演算法
- 1. 輪詢[RR]
- 2. 最小連接數[LC]
- 3. 來源訪問[SH]
- 二、Web負載均衡解決方案
- 1. 拓撲圖
- 2. 部署Nginx服務器
- 3. 部署Haproxy服務器
- 4. 配置Haproxy服務器
- 5. 添加并開啟Haproxy服務
- 6. 測驗Web集群
- 三、Haproxy 的日志
- 1. 修改 Haproxy 組態檔
- 2. 修改 rsyslog 配置
- 四、Haproxy 的引數優化
Haproxy是一款支持虛擬主機提供高可用性、負載均衡以及基于TCP和HTTP應用的代理
一、常用的負載調度演算法
1. 輪詢[RR]
后端節點有序的輪流分配到任務
2. 最小連接數[LC]
當第一個節點被分配的任務量大于第二節點時任務將被分配到第二個節點上,以此類推
3. 來源訪問[SH]
會記錄下客戶訪問的節點,之后當客戶再次訪問時,就訪問那個節點[可以基于IP、Cookie等]
二、Web負載均衡解決方案
1. 拓撲圖
一臺作為Haproxy以及兩臺Nginx模擬Web集群

| 主機 | 作業系統 | IP 地址 | 主要軟體 |
|---|---|---|---|
| Nginx 服務器 1 | CentOS 7 | 192.168.0.10 | nginx |
| Nginx 服務器 2 | CentOS 7 | 192.168.0.20 | nginx |
| Haproxy 服務器 | CentOS 7 | 192.168.0.50 | haproxy |
2. 部署Nginx服務器
yum -y install pcre pcre-devel zlib zlib-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
wget -P /opt http://nginx.org/download/nginx-1.20.0.tar.gz
cd /opt
tar -zxvf nginx-1.20.0.tar.gz
cd /opt/nginx-1.20.0
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx
make -j && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx
ln -s /usr/local/nginx/conf/nginx.conf /etc/nginx.conf
echo '
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target' > /lib/systemd/system/nginx.service
chmod 754 /lib/systemd/system/nginx.service
echo "<h1>HelloCat</h1>" > /usr/local/nginx/html/index.html
#echo "<h1>HelloDog</h1>" > /usr/local/nginx/html/index.html
systemctl start nginx.service
systemctl enable nginx.service
3. 部署Haproxy服務器
yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
wget -P /opt https://www.haproxy.org/download/1.5/src/haproxy-1.5.19.tar.gz
cd /opt
tar -zxvf haproxy-1.5.19.tar.gz
cd haproxy-1.5.19
uname -r
#查看內核,kernel 大于 2.6.2 則使用以下引數
#否則為 TARGET=linux26
#比如我當前版本時3.10.0則填入3100
make TARGET=linux3100 ARCH=x86_64
#內核版本,系統位數,64位系統
make install
4. 配置Haproxy服務器
mkdir /etc/haproxy
cp examples/haproxy.cfg /etc/haproxy/
cd /etc/haproxy/
vim haproxy.cfg
global
#為設定的全域配置部分
#屬于行程級別的配置,通常和使用的作業系統配置相關
#4~5行,修改配置全域日志記錄,local0為日志設備,默認存放到系統日志
log /dev/log local0 info
log /dev/log local0 notice
#log loghost local0 info
maxconn 4096 #每個 haproxy 行程可以接受的最大連接數,需考慮 ulimit-n 的限制
#8行,注釋,chroot運行路徑,為該服務自設定的根目錄,一般需將此行注釋掉
#chroot /usr/share/haproxy
uid 99 #用戶UID
gid 99 #用戶GID
daemon #守護行程模式
defaults
#為預設默認配置部分
#這些設定引數屬于公共配置,一般會被自動集成到 listen、frontend 和 backend 中
#如果沒有在這幾部分特別宣告,將按照配置引數設定
log global #預設日志配置,定義日志為global配置中的日志記錄定義
mode http #設定 Haproxy 默認運行模式,為http
option httplog #采用http日志格式記錄日志
option dontlognull #不記錄健康檢查日志資訊
retries 3 #檢查節點服務器失敗次數,連續達到三次失敗,則認為節點不可用
redispatch #當服務器負載很高時,自動結束當前佇列處理比較久的連接
maxconn 2000 #最大連接數
contimeout 5000 #連接超時時間
clitimeout 50000 #客戶端超時時間
srvtimeout 50000 #服務器超時時間
#增加一條監聽
listen webcluster 0.0.0.0:80
option httpchk GET /index.html
#負載均衡調度演算法
#輪詢演算法:roundrobin;最小連接數演算法:leastconn;來源訪問調度演算法:source
balance roundrobin
#check inter 2000:表示haproxy服務器和節點之間的一個心跳頻率
server inst1 192.168.0.10:80 check inter 2000 fall 3
server inst2 192.168.0.20:80 check inter 2000 fall 3
#洗掉多余的項


5. 添加并開啟Haproxy服務
cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
cd /etc/init.d
chmod +x haproxy
#賦權
chkconfig --add /etc/init.d/haproxy
#增加該服務,讓chkconfig指令得以管理它,并同時在系統啟動的敘述檔案內增加相關資料
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
#優化路徑,把 haproxy 放入系統命令路徑以識別
service haproxy start
或
/etc/init.d/haproxy start
#開啟服務

6. 測驗Web集群
負載均衡


高可用
Nginx1突然宕機,再次訪問站點

在Haproxy上查看日志顯示Nginx1掛掉了

客戶端再次訪問

Nginx2繼續維持服務

三、Haproxy 的日志
默認 haproxy 的日志是輸出到系統的 syslog 中,查看起來不是非常方便,為了更好的管理 haproxy 的日志,我們在生產環境中一般單獨定義出來
1. 修改 Haproxy 組態檔
需要將 haproxy 的 info 及 notice 日志分別記錄到不同的日志檔案中
vim /etc/haproxy/haproxy.cfg
global
log /dev/log local0 info
log /dev/log local0 notice
service haproxy restart
2. 修改 rsyslog 配置
將 haproxy 相關的配置獨立定義到 haproxy.conf,并放到 /etc/rsyslog.d/ 下,rsyslog 啟動時會自動加載此目錄下的所有組態檔
&~表示當日志寫入到日志檔案后,rsyslog 停止處理這個資訊
vim /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&?~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
systemctl restart rsyslog.service
#重啟完后,再用客戶端重新訪問頁面,然后就可以看到由日志檔案生成了
cd /var/log/
cd /var/log/haproxy/
ls
cat haproxy-info.log
#查看新生成的日志檔案的內容
四、Haproxy 的引數優化
| 引數 | 引數說明 | 優化建議 |
|---|---|---|
| maxconn | 最大連接數 | 此引數根據應用的實際使用情況進行調整,推薦使用 10 240 |
| daemon | 守護行程模式 | Haproxy 可以使用非守護行程模式啟動,生產環境建議使用守護行程模式啟動 |
| nbproc | 負載均衡的并發行程數 | 建議與當前服務器 CPU 核數相等或為其 2 倍 |
| retries | 重試次數 | 此引數主要用于對群集節點的檢查,如果節點多且并發量大,設定為 2 次或 3 次;而在服務器節點不多的情況下,可以設定為 5 次或 6 次 |
| option http-server-close | 主動關閉 http 請求選項 | 建議在生產環境中使用此選項,避免由于 timeout 時間設定過長導致 http 連接堆積 |
| timeout http-keep-alive | 長連接超時時間 | 此選項設定長時間連接超時時間,具體可參考應用自身特點設定,可以設定為 10s |
| timeout http-request | http 請求超時時間 | 建議將此事件設定為 5~10s,增加 http 連接釋放速度 |
| timeout client | 客戶端超時時間 | 如果訪問量過大,節點回應慢,可以將此事件設定短一些,建議設定為 1min 左右就可以了 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/281359.html
標籤:其他
