Haproxy叢集
一、Haproxy
1.1、常見的web叢集排程器
目前常見的web群集排程器分為軟體和硬體
軟體通常使用開源的LVS、Haproxy、Nginx
LVS效能最好,但是搭建相對複雜;Nginx的upstream模組支援群集功能,但是對群集節點健康檢查功能不強,高併發效能沒有Haproxy好
硬體一般使用比較多的是F5,也有很多人使用國內的一些產品,如梭子魚、綠盟等
1.2、Hapeoxy應用分析
LVS在企業應用中抗負載能力很強,但存在不足
LVS不支援正則處理,不能實現動靜分離,對於大型網站,LVS的實施配置複雜,維護成本相對較高
Haproxy是一款可提供高可用性、負載均衡、及基於TCP和HTTP應用的代理軟體
適用於負載大的web站點,執行在硬體上可支援數以萬計的併發連線的連線請求
1.3、Haproxy排程演算法原理
Haproxy支援多種排程演算法,最常用的有8種
RR(Round Robin)
RR演算法是最簡單最常用的一種演算法,即輪詢排程
理解舉例:有三個節點A、B、C
第一個使用者訪問會被指派到節點A
第二個使用者訪問會被指派到節點B
第三個使用者訪問會被指派到節點C
第四個使用者訪問繼續指派到節點A,輪詢分配訪問請求實現負載均衡效果
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演算法有很大改進,是米錢用到比較多的一種演算法
SH(Source Hashing)
基於來源訪問排程演算法,用於一些有Session會話記錄在服務端的場景,可以基於來源的IP、Cookie等做叢集排程
理解舉例 有三個節點A、B、C,第一個使用者第一次訪問被指派到了A,第二個使用者第一次訪問被指派到了B
當第一個使用者第二次訪問時會被繼續指派到A,第二個使用者第二次訪問時依舊會被指派到B,只要負載均衡器不重啟,第一個使用者都會被指派到A,第二個使用者訪問都會被指派到B,實現叢集的排程
此排程演算法好處是實現會話保持,但某些IP訪問量非常大時會引起負載不均衡,部分節點訪問量超大,影響業務使用
source 表示根據請求源IP
uri 表示根據請求的URI,做cdn需使用
url_param 表示根據請求的URI引數
hdr(name)表示根據HTTP請求通來鎖定每一次HTTP請求
rdp—cookie(name)表示根據cookie(name)來鎖定並雜湊每次TCP請求
1.4、Haproxy的主要特性
- 可靠性和穩定性非常好,可以與硬體級的F5負載均衡裝置相媲美
- 最高可以同時維護40000-50000個併發連線,單位時間內處理的最大請求數為20000個,最大處理能力可達10Git/s
- 支援多大8中負載均衡演算法,同時也支援會話保持
- 支援虛擬主機功能,從而實現web負載均衡更加靈活
- 支援連線拒絕、全透明代理等獨特功能
- 擁有強大的ACL支援,用於訪問控制
- 其獨特的彈性二叉樹資料結構,使資料結構的複雜性上升到了0(1),即資料的查詢速度不會隨著資料條目的增加而速度有所下降
- 支援客戶端的keepalive功能,減少客戶端與haproxy的多次三次握手導致資源量費,讓多個請求在一個tcp連線中完成
- 支援TCP加速,零複製功能,類似於mmap機制
- 支援響應池(response buffering)
- 支援RDP協議
- 基於源的粘性,類似於nginx的ip_hash功能,把來自同一客戶端的請求在一定時間內始終排程到上游的同一伺服器
- 更好統計資料介面,其web介面顯示後端冀全中各個伺服器的接受、傳送、拒絕、錯誤等資料的統計資訊
- 詳細的健康狀態檢測,web介面中有關對上流伺服器的健康檢測狀態,並提供了一定的管理功能
- 基於流量的健康評估機制
- 基於http認證
- 基於命令列的管理介面
- 日誌分析器,可對日誌進行分析
1.5、Haproxy的優點
- Haproxy也是支援虛擬主機的
- Haproxy支援8種負載均衡器策略
- Haproxy的優點能補充nginx的一些缺點,比如支援Session的保持,Cookie的引導,同時支援通過獲取指定url來檢測後端伺服器的狀態
- Haproxy跟LVS類似,本身就只是一款負載均衡軟體,單純從效率上來講Haproxy會比Nginx有更出色的負載均衡速度,在併發處理上也是優於Nginx的
- Haproxy支援TCP協議的負載均衡轉發
1.6、LVS、Haproxy、Nginx區別
- LVS基於Linux作業系統實現軟負載均衡,而Haproxy和Nginx是基於第三方應用實現的軟負載均衡
- LVS是可實現4層的IP負載均衡技術,無法實現基於目錄、URL的轉發。而實現Haproxy和Nginx都可以實現4層和7層技術,Haproxy可提供TCP和Http應用的負載均衡綜合解決方案
- LVS因為工作在ISO模型的第四層,其狀態監測功能單一,而Haproxy在狀態監測方面功能更豐富、強大,可支援埠、URL、指令碼等多種狀態監測方式
- Haproxy功能強大,但整體效能低於4層模式的LVS負載均衡
- Nginx主要用於web伺服器或快取伺服器
二、部署Haproxy搭建web叢集
2.1、案例環境
Haproxy伺服器:192.168.80.11
nginx伺服器1:192.168.80.12
nginx伺服器2:192.168.80.13
客戶端訪問:192.168.80.16
2.2、部署haproxy伺服器(192.168.80.11)
2.2.1、關閉防火牆、安全功能並傳到opt目錄下
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
cd /opt
2.2.2、編譯安裝haproxy
yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
tar zxvf haproxy-1.5.19.tar.gz
cd haproxy-1.5.19/
make TARGET=linux2628 ARCH=x86_64
make install
注:使用uname -r檢視核心,如:2.6.18-371.el5,此時該引數用TARGET=linux26;kernel大於2.6.28的用TARGET=linux2628
2.2.3、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 #最大連線數,需考慮ulimit-n限制
#8行–註釋,chroot執行路徑,為該服務自設定的根目錄,一般需將此行註釋掉
#chroot /usr/share/haproxy
uid 99 #使用者UID
gid 99 #使用者GID
daemon #守護程序模式
nbproc 1 #設定併發程序數
defaults #配置預設引數,可被用到Listen、frontend、backend元件
log global #定義日誌為global配置中的日誌定義
mode http #模式為http
option httplog #採用http日誌格式記錄日誌
option dontlognull #不記錄健康檢查日誌資訊
retries 3 #檢查節點伺服器失敗次數,連續達到三次失敗,則認為節點不可用
redispatch #當伺服器負載很高時,自動結束當前佇列處理比較久的連線
maxconn 2000 #最大連線數
#contimeout 5000 #連線超時時間
#clitimeout 50000 #客戶端超時時間
#srvtimeout 50000 #伺服器超時時間
timeout http-request 10s #預設http請求超時時間 timeout queue 1m #預設佇列超時時間
timeout connect 10s #預設連線超時時間,新版本中替代contimeout, 該引數向後相容
timeout client 1m #預設客戶端超時時間,新版本中替代clitimeout,該引數向後相容
timeout server 1m #預設伺服器超時時間,新版本中替代srvtimeout,該引數向後相容
timeout http-keep-alive 10s #預設持久連線超時時間
timeout check 10s #設定心跳檢查超時時間
listen webcluster 0.0.0.0:80
option httpchk GET /test.html #健康檢查伺服器的test.html檔案
balance roundrobin #負載均衡排程演算法使用輪詢演算法roundrobin
server inst1 192.168.80.12:80 check inter 2000 fall 3 #定義線上節點
server inst2 192.168.80.13:80 check inter 2000 fall 3
2.2.4、新增haproxy系統服務
cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
chmod +x /etc/init.d/haproxy
chkconfig --add /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy service haproxy start 或 /etc/init.d/haproxy start
2.3、部署Nginx伺服器(192.168.80.12/13)
之前部署過nginx,我們這邊直接新增網頁內容
#192.168.80.12
echo '111111' > /usr/local/nginx/html/test.html
#192.168.80.13
echo '222222' > /usr/local/nginx/html/test.html
2.4、客戶機訪問(192.168.80.16)
2.5、關閉伺服器1檢視haproxy健康狀態
#192.168.80.12
systemctl stop nginx
#192.168.80.11
systemctl status haproxy
2.6、haproxy日誌
2.6.1、修改主配置檔案
預設haproxy的日誌是輸出到系統的syslog中,檢視起來不是非常方便,為了更好的管理haproxy的日誌,我們在生產環境中一般單獨定義出來。需要將haproxy的info及notice日誌分別記錄到不同的日誌檔案中
vim /etc/haproxy/haproxy.cfg
global
log /dev/log local0 info
log /dev/log local0 notice
2.6.2、修改rsyslog配置
要修改rsyslog配置,為了便於管理。將haproxy相關的配置獨立定義到haproxy.conf,並放到/etc/rsyslog.d/下,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
&~
2.6.3、檢視haproxy的訪問請求日誌
systemctl restart rsyslog.service
tail -f /var/log/haproxy/haproxy-info.log #檢視haproxy的訪問請求日誌資訊
2.7、haproxy優化
- maxconn:最大連線數,根據應用實際情況進行調整,推薦使用10240
- daemon:守護程序模式,Haproxy可以使用非守護程序模式啟動,建議使用守護程序模式啟動
- nbprod:負載均衡的併發程序數,建議與當前伺服器CPU核數相等或為其2倍
- retries:重試次數,主要用於對叢集節點的檢查,如果節點多,且併發量大,設定為2次或3次
- option http-server-close:主動關閉http請求選項,建議在生產環境中使用此選項
- timeout http-keep-alive:長連線超時時間,設定長連線超時時間,可以設定為10s
- timeout http-request:http請求超時時間,建議將此時間設定為5~10s,增加http連線釋放速度
- timeout client:客戶端超時時間,如果訪問量過大,節點響應慢,可以將此時間設定短一些,建議設定為1min左右