Haproxy搭建 Web 群集實現負載均衡
1 Haproxy HAProxy是可提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,是免費、快速並且可靠的一種解決方案。HAProxy非常適用於併發大(併發達1w以上)web站點,這些站點通常又需要會話保持或七層處理。HAProxy的執行模式使得它可以很簡單安全的整合至當前的架構中,同時可以保護web伺服器不被暴露到網路上。
1.1 HAProxy的主要特性
●可靠性和穩定性非常好,可以與硬體級的F5負載均衡裝置相媲美;
●最高可以同時維護40000-50000個併發連線,單位時間內處理的最大請求數為20000個,最大處理能力可達10Git/s;
●支援多達8種負載均衡演算法
●支援Session會話保持,Cookie的引導;
●支援透過獲取指定的url來檢測後端伺服器的狀態;
●支援虛機主機功能,從而實現web負載均衡更加靈活;
●支援連線拒絕、全透明代理等獨特的功能;
●擁有強大的ACL支援,用於訪問控制;
●支援TCP和HTTP協議的負載均衡轉發;
●支援客戶端的keepalive功能,減少客戶端與haproxy的多次三次握手導致資源浪費,讓多個請求在一個tcp連線中完成;
1.2 HAProxy負載均衡策略
常見的有如下8種:
(1)roundrobin,表示簡單的輪詢
(2)static-rr,表示根據權重
(3)leastconn,表示最少連線者先處理
(4)source,表示根據請求源IP
(5)uri,表示根據請求的URI,做cdn需使用;
(6)url_param,表示根據請求的URl引數'balance url_param' requires an URL parameter name (7)hdr(name),表示根據HTTP請求頭來鎖定每一次HTTP請求;
(8)rdp-cookie(name),表示根據cookie(name)來鎖定並雜湊每一次TCP請求。
1.3 LVS、Nginx、HAproxy的區別 ●LVS基於Linux作業系統核心實現軟負載均衡,而HAProxy和Nginx是基於第三方應用實現的軟負載均衡;
●LVS是可實現4層的IP負載均衡技術,無法實現基於目錄、URL的轉發。而HAProxy和Nginx都可以實現4層和7層技術,HAProxy可提供TCP和HTTP應用的負載均衡綜合解決方案;
●LVS因為工作在ISO模型的第四層,其狀態監測功能單一,而HAProxy在狀態監測方面功能更豐富、強大,可支援埠、URL、指令碼等多種狀態檢測方式;
●HAProxy功能強大,單純從效率上來講HAProxy會比Nginx有更出色的負載均衡速度,在併發處理上也是優於Nginx的。但整體效能低於4層模式的LVS負載均衡;
●Nginx主要用於Web伺服器或快取伺服器。Nginx的upstream模組雖然也支援群集功能,但是效能沒有LVS和Haproxy好,對群集節點健康檢查功能不強,只支援透過埠來檢測,不支援透過URL來檢測。
2 Haproxy搭建 Web 群集
Haproxy伺服器:192.168.30.105
Nginx 伺服器1:192.168.30.107
Nginx 伺服器2:192.168.30.109
客戶端:192.168.30.115
2.1 haproxy 伺服器部署
2.1.1 關閉防火牆
systemctl stop firewalld
setenforce 0
2.1.2 核心配置(實驗環境可有可無)
vim /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
#啟用埠重用,允許一個伺服器程式在進行完一個連線後立即再次使用相同的連線埠。
net.ipv4.ip_local_port_range = 1024 65023
#本地埠範圍。指定可用於本地TCP/UDP埠的埠號範圍。
net.ipv4.tcp_max_syn_backlog = 10240
#TCP半連線請求的最大長度,如果超過這個值,對方就會收到RST響應。
net.ipv4.tcp_max_tw_buckets = 400000
#系統中同時保持TIME_WAIT狀態的最大數量,一般設定為TCP建立連線次數的2倍。
net.ipv4.tcp_max_orphans = 60000
#系統中允許存在的最大orphan連線數(沒有對應的socket檔案),這個數字越大,系統支援的TCP連線數也越多。
net.ipv4.tcp_synack_retries = 3
#嘗試傳送SYN+ACK應答報文的最大次數。
net.core.somaxconn = 10000
#伺服器套接字排隊長度的最大值
2.1.3 安裝 Haproxy
//編譯安裝
yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
tar zxvf haproxy-2.2.11.tar.gz
cd haproxy-2.2.11/
make TARGET=linux31 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
---------------------引數說明---------------------------------------------------------------------------
TARGET=linux26 #核心版本,
#使用uname -r檢視核心,如:2.6.18-371.el5,此時該引數用TARGET=linux26;kernel大於2.6.28的用TARGET=linux2628
安裝依賴環境
編譯安裝HAproxy
2.1.4 Haproxy伺服器配置
useradd -M -s /sbin/nologin haproxy
mkdir -p /usr/local/haproxy/conf
cd /usr/local/haproxy/conf
HAProxy 的配置檔案共有 5 個域:
●global:用於配置全域性引數
●default:用於配置所有frontend和backend的預設屬性
●frontend:用於配置前端服務(即HAProxy自身提供的服務)例項
●backend:用於配置後端服務(即HAProxy後面接的服務)例項組
●listen:frontend + backend的組合配置,可以理解成更簡潔的配置方法,frontend域和backend域中所有的配置都可以配置在listen域下
global #全域性配置,主要用於定義全域性引數,屬於程式級的配置,通常和作業系統配置有關
log 127.0.0.1 local1 warning
daemon #讓haproxy以守護程式的方式工作於後臺
option dontlognull #不在日誌中記錄空連線
option abortonclose #當伺服器負載很高的時候,自動結束掉當前佇列處理比較久的連結
maxconn 20000 #最大連線數,“defaults”中的值不能超過“global”段中的定義
timeout queue 3s #預設客戶端請求在佇列中的最大時長
timeout connect 1s #預設haproxy和服務端建立連線的最大時長,新版本中替代contimeout,該引數向後相容
frontend http-in
bind *:80
acl url_jsp path_end -i .jsp
use_backend tomcat_server if url_jsp
default_backend nginx_server
backend nginx_server
balance roundrobin
option httpchk GET /test.html
server ngx01 192.168.1.101:80 check inter 2000 fall 3 rise 2
server ngx02 192.168.1.100:80 check inter 2000 fall 3 rise 2
backend tomcat_server
balance roundrobin
option http-server-close
cookie HA_STICKY_dy insert indirect nocache
server tomcat01 192.168.1.102:8080 cookie tomcat01 check inter 2000 fall 3 rise 2
server tomcat02 192.168.1.150:8080 cookie tomcat02 check inter 2000 fall 3 rise 2
listen stats
bind *:1080
stats enable
stats refresh 30s
stats uri /stats
stats realm HAProxy\ Stats
stats auth admin:admin
2.1.4 新增為系統服務
新增執行的許可權
chmod +x /etc/init.d/haproxy
將 /etc/init.d/haproxy 指令碼新增到 chkconfig 管理工具中
chkconfig --add /etc/init.d/haproxy
chkconfig --level 35 haproxy on
chkconfig --level 35 haproxy on
service haproxy start
開啟haproxy服務
2.2 節點伺服器部署
systemctl stop firewalld
setenforce 0
yum install -y pcre-devel zlib-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/
cd nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
make && make install
--192.168.1.100---
echo "this is kgc web" > /usr/local/nginx/html/test.html
--192.168.1.101---
echo "this is benet web" > /usr/local/nginx/html/test.html
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx #啟動nginx 服務
---Nginx 伺服器1:192.168.1.100---
---Nginx 伺服器1:192.168.1.101---
2.3 測試 Web群集
在客戶端使用瀏覽器開啟 ,不斷重新整理瀏覽器測試負載均衡效果