Haproxy搭建Web群集
- 一、Haproxy前言
- 二、Haproxy簡介
- 2.1常見的web集群調度器
- 2.2Haproxy應用分析
- 2.3Haproxy高性能負載均衡的主要優點:
- 2.4四層與七層負教的主要|區別
- 三、Haproxy調度演算法原理
- 3.1 RR
- 3.2 LC
- SH
- 四、LVS、Haproxy、nginx區別
- 4.1 LVS和Haproxy應用分析
- 4.2 nginx和Lvs、Haproxy的區別
- 五、 部署haproxy-nginx服務
- 5.1 部署環境
- 5.2 安裝haproxy服務器
- 5.3Haproxy服務器配置
- 5.4 啟動Haproxy服務
- 5.5編譯安裝Nginx服務器
- 5.6訪問測驗
- 六、Haproxy引數優化
- 七、小結
一、Haproxy前言
Haproxy是一個使用c語言撰寫的自由及開放源代碼軟體,其提供高可用性、負載均衡,以及基于TOP和HTT的應用程式代理,
Haproxy特別適用于那些負載特大的web站點,這些站點通常又需要會話保持或七層處理,Haproxy運行在當前的硬體上,完全可以支持數以萬計的并發連接,并且它的運行模式使得它可以很簡單安全的整合進您當前的架構中,同時可以保護你的web服務器不被暴露到公共網路上,
Haproxy實作了一種事件驅動,單一行程模型,此模型支持非常大的并發連接數,多行程或多執行緒模型受記憶體限制系統調度器限制以及無處不在的鎖限制,很少能處理數千并發連接,
事件驅動模型因為在有更好的資源和時間管理的用戶空間(User-Space)實作所有這些任務,所以沒有這些問題,
此模型的弊端是,在多核系統上,這些程式通常擴展性較差,這就是為什么他們必須進行優化以使每個CPU時間片(cycle)做更多的作業,
關于CPU分片
CPU時間片(借助一些虛擬化的概念、資源控制概念)
一個CPU處理10個任務要0.2秒 1秒內5個0.2秒50個任務,10個任務交給CPU 去做,cpu會有0.2的作業時間和0.8秒的發呆時間
CPU時問進行分片,以輪詢的方式讓CPU不斷的處理任務
例:
80個任務1.6秒
cpu 0.2單位進行分片,分5份分別處理10個任務(CPU趨近于飽和狀態)
包括GitHub,Bitbucket,stack overflow,Reddit Tumblr,Twitter 和 Tuenti在內的知名網站,及亞馬遜網路服務系統都便用了Haproxy
二、Haproxy簡介
2.1常見的web集群調度器
目前常見的web集群調度器分為軟體和硬體
軟體通常使用開源的LVS、 Haproxy、Nginx
LVS性能最好,但是搭建相對復雜;Nginx的upstream模塊支持群集功能,但是對群集節點健康檢查功能不強,高并發性能沒有Haproxy好,
硬體一般使用比較多的是F5,也有很多人使用國內的一些產品,如梭子魚、綠盟等
2.2Haproxy應用分析
①LVS在企業應用中抗負載能力很強,但存在不足
②LVS不支持正則處理,不能實作動靜分離
③對于大型網站,LVS的實施配置復雜,維護成本相對較高
Haproxy是一款可提供高可用性、負載均衡、及基于TCP和HTTP應用的代理的軟體適用于負載大的web站點運行在硬體上可支持數以萬計的并發連接的連接請求
2.3Haproxy高性能負載均衡的主要優點:
①Haproxy在負載均衡速度和并發處理上是優于Nginx
②Haproxy支持虛擬主機,可以作業在四,七層
③能夠補充Nginx (以ip_hash的方式)的一些缺點,比如session的保持、Cookie的引導等作業
④支持以url的方式檢測后端的服務器的狀態
⑤Haproxy可以對Mysql進行負載均衡,對后端的DB節點進行檢測和負載均衡
⑥支持很多負載均衡演算法(豐富),Round-robin (輪詢) 、weight-round-robin(加權輪詢)、source hashing(原地址保持)、RI(請求URL) 、 rdp-cookie(根據cookie)
2.4四層與七層負教的主要|區別
四層負載均衡器是通過分析IP層及"TCP/UDP"層的流量實作的基于"IP+埠”的負載均衡,主要通過報文的目標地址和埠配合負載均衡演算法選擇后端真實服務器,確定是否需要對報文進行修改(根據需求,可能會修改目標地址、源地址、MAC地址等)并將資料轉發至選出的后端真實服務器,
七層負載均衡器是基于應用層資訊(如URL、Cookies等)的負載均衡,主要依據報文的內容配合負載均衡演算法選擇后端真實服務器,然后再分發請求到真實服務器進行處理,也稱"內容交換器",客戶端與負載均衡器、負載均衡器與后端真實服務器之間會分別建立TCP連接,
三、Haproxy調度演算法原理
Haproxy支持多種調度演算法,最常用的有三種
3.1 RR
RR (Round Robin) :RR演算法是最簡單常用的一種演算法,即輪詢調度
理解舉例
有三個節點A、B、C
第一個用戶訪問會被指派到節點A
第二個用戶訪問會被指派到節點B
第三個用戶訪問會被指派到節點C
第四個用戶訪問繼續指派到節點A,輪詢分配訪問請求實作負載均衡效果
3.2 LC
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
SH (Source Hashing):基于來源訪問調度演算法,用于一些有session會話記錄在服務器端的場景,可以基于來源的IP、Cookie等做集群調度
理解舉例
有三個節點A、B、C,第一個用戶第一次訪問被指派到了A,第二個用戶第一次訪問被指派到了B
當第一個用戶第二次訪問時會被繼續指派到A,第二個用戶第二次訪問時依舊會被指派到B,只要負載均衡調度器不重啟,第一個用
戶訪問都會被指派到A,第二個用戶訪問都會被指派到B,實作集群的調度
此調度演算法好處是實作會話保持,但某些IP訪問量非常大時會引起負載不均衡,部分節點訪問量超大,影響業務使用
四、LVS、Haproxy、nginx區別
4.1 LVS和Haproxy應用分析
LVs在企業應用中抗負載均衡能力很強,但存在不足
LVS不支持正則處理,不能實作動靜分離
對于大型網站,LVS的實施配置復雜,維護成本相對較高
Haproxy是一塊可提供高可用性、負載均衡及基于TCP和HTTP應用的代理軟體
特別適合于負載特別大的web站點(可以承受高并發,可與Nginx配合)
運行在當前的硬體上可支持數以萬計的并發連接請求
4.2 nginx和Lvs、Haproxy的區別
①nginx
支持正則
只支持基于埠的健康檢查
不支持session的直接保持,但能通過IP_hash來解決
對網路穩定性要求不高
反向代理能力強
nginx社區活躍(社區:維護,更新服務的組織)
②Lvs
只能基于四層埠轉發
在四曇做分發作用,抗負教能力強
應用范圍廣(幾乎可以對所有應用做負教)
③Haproxy
支持8種負載均衡策略
僅做負載均衡軟體使用,在高并發情況下性能優于nginx支持URL健康檢測、支持session保持
對后端具備監控的能力
五、 部署haproxy-nginx服務
5.1 部署環境
happory 服務器一臺: 192.168.80.1
Nginx服務器兩臺: 192.168.80.2 192.168.80.3
5.2 安裝haproxy服務器
①三臺服務器同步阿里云服務器
ntpdate ntp2.aliyun.com
②安裝組件
yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
③上傳軟體包至/opt目錄,解壓
cd /opt
tar zxvf haproxy-1.5.19.tar.gz
④make編譯安裝
cd haproxy-1.5.19/
make TARGET=linux2628 ARCH=x86_64
make install
引數說明
TARGET=linux2628 #內核版本
#使用uname -r 查看內核,如2.6.18-371.e15 #此時該引數用TARGET=linux26;kernel大于2.6.28的用TARGET=linux2628
ARCH=x86_64 #系統位數,64位系統
5.3Haproxy服務器配置
[root@hapory haproxy-1.5.19]# mkdir /etc/haproxy
[root@hapory haproxy-1.5.19]# cp examples/haproxy.cfg /etc/haproxy/
[root@hapory haproxy-1.5.19]# mkdir /etc/haproxy
[root@hapory haproxy-1.5.19]# cp examples/haproxy.cfg /etc/haproxy/
[root@hapory haproxy-1.5.19]# vim /etc/haproxy/haproxy.cfg
#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 #守護行程模式
defaults
log global #定義日志為global配置中的日志定義
mode http #模式為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 /test.html #檢查服務器的test.html檔案
balance roundrobin #負載均衡調度演算法使用輪詢演算法roundrobin
server inst1 192.168.80.2:80 check inter 2000 fall 3 #定義在線節點
server inst2 192.168.80.3:80 check inter 2000 fall 3
balance roundrobin #負載均衡調度演算法
#輪詢演算法:roundrobin;最小連接數演算法:leastconn;來源訪問調度演算法:source hashing,
類似于nginx的ip_hash
check inter 2000 #表示haproxy服務器和節點之間的一個心跳頻率
fall 3 #表示連續三次檢測不到心跳頻率則認為該節點失效
若節點配置后帶有“backup”表示該節點只是個備份節點,只有主節點失效該節點才會上,不攜帶“backup”,表示為主節點,和其它主節點共同提供服務,
5.4 啟動Haproxy服務
[root@hapory haproxy-1.5.19]# cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
[root@hapory haproxy-1.5.19]# cd /etc/init.d/
[root@hapory init.d]# chmod +x haproxy
[root@hapory init.d]# chkconfig --add /etc/init.d/haproxy
[root@hapory init.d]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
[root@hapory haproxy]# service haproxy start
5.5編譯安裝Nginx服務器
①上傳nginx-1.15.9.tar.gz包至192.168.80.2服務器/opt目錄下
scp nginx-1.15.9.tar.gz root@192.168.80.3:/opt #遠程拷貝
②安裝依賴環境
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
⑦軟連接
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx 啟動nginx 服務
⑧編輯訪問首頁
----192.168.80.2----
echo "this is my web" > /usr/local/nginx/html/test.html
----192.168.80.3----
echo "this is benet web" > /usr/local/nginx/html/test.html
5.6訪問測驗
192.168.80.1/test.html


haproxy 日志管理
①修改Haproxy組態檔中關于日志配置的選項,加入配置
log / dev/log loacl0 info
log /dev /log local0 notice
②修改rsyslog配置,將haproxy相關配置獨立定義到haproxy.conf,并放到/etc/rsyslog.d/下
保存組態檔并重啟rsyslog服務,完成rsyslog配置
六、Haproxy引數優化
隨著企業網站負載增加,haproxy引數優化相當重要
①maxconn:最大連接數,根據應用實際情況進行調整,推薦使用10 240
②daemon:守護行程模式,Haproxy可以使用非守護行程模式啟動,建議使用守護行程模式啟動
③nbproc:負載均衡的并發行程數,建議與當前服務器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左右就可以了
七、小結
負載均衡:
如果是中小型的 web應用,比如日PV小于1000萬,用 Nginx就完全可以了;如果機器不少,可以用DNS輪詢,IVS所耗費的機器還是比較多的;大型網站或重要的服務,且服務器比較多時,可以考慮用LVS,
目前關于網站架構一般比較合理流行的架構方案: Web 前端采用Nginx/HAProxy+Keepalived作負載均衡器;后端采用MysQL資料庫一主多從和讀寫分離,采用LVS+Keepalived 的架構
PS:
PV(訪問量): Page View,即頁面瀏覽量或點擊量,用戶每次訪問即被計算一次,
UV(獨立訪客):Unique Visitor,訪問您網站的一臺電腦客戶端為一個訪客,00:00-24:00內相同的客戶端只會被計算一次.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/290613.html
標籤:其他
