Haproxy搭建web叢集
目錄:
四、Haproxy特性
五、Haproxy搭建 Web 群集
- 目前常見的web叢集排程器分為軟體和硬體
- 軟體通常使用開源的LVS、Haproxy、Nginx
- 硬體一般使用比較多的是F5,也有很多人使用國內的一些產品,如梭子魚、綠盟等
二、Haproxy應用分析
1.LVS在企業應用中抗負載能力很強,但存在不足
- • LVS不支援正則處理,不能實現動靜分離
- • 對於大型網站,LVS的實施配置複雜,維護成本相對較高
2.Haproxy是一款可提供高可用性、負載均衡、及基於TCP和HTTP應用的代理軟體
- • 適用於負載大的web站點
- • 執行在硬體上可支援數以萬計的併發連線的連線請求
三、Haproxy排程演算法原理
Haproxy 支援多種排程演算法,最常用的有三種
(1)RR(Round Robin)
RR演算法是最簡單最常用的一種演算法,即輪詢排程
例如:
• 有三個節點A、B、C
• 第一個使用者訪問會被指派到節點A
• 第一個使用者訪問會被指派到節點B
• 第一個使用者訪問會被指派到節點C
• 第四個使用者訪問會被指派到節點A,輪詢分配訪問請求實現負載均衡效果
(2)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演算法有很大改進,是目前用到比較多的一-種演算法
(3)SH(Source Hashing)
基於來源訪問排程演算法,用於一些有Session會記錄在伺服器端的場景,可以基於來源的IP、Cookie等做叢集排程
例如:
• 有三個節點A、B、C,第一個使用者第一次訪問被指派到了A,第二個使用者第一次訪問被指派到了B
• 當第一個使用者第二次訪問時會被繼續指派到A,第二個使用者第二次訪問時依舊會被指派到B,只要負載均衡排程器不重啟,第一個使用者訪問都會被指派到A,第二個使用者訪問都會被指派到B,實現叢集的排程
• 此排程演算法好處是實現會話保持,但某些IP訪問量非常大時會引|起負載不均衡,部分節點訪問量超大,影響業務使用
四、Haproxy特性
HAProxy是可提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,是免費、快速並且可靠的一種解決方案。HAProxy非常適用於併發大(併發達1w以上)web站點,這些站點通常又需要會話保持或七層處理。HAProxy的執行模式使得它可以很簡單安全的整合至當前的架構中,同時可以保護web伺服器不被暴露到網路上。
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認證;
- 基於命令列的管理介面;
- 日誌分析器,可對日誌進行分析。
HAProxy負載均衡策略非常多,常見的有如下8種:
- roundrobin:表示簡單的輪詢。
- static-rr:表示根據權重。
- leastconn:表示最少連線者先處理。
- source:表示根據請求的源IP,類似Nginx的IP_hash機制。
- ri:表示根據請求的URI。
- rl_param:表示根據HTTP請求頭來鎖定每一次HTTP請求。
- rdp-cookie(name):表示根據據cookie(name)來鎖定並雜湊每一次TCP請求。
LVS、Nginx、HAproxy的區別:
- 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 群集
環境準備
Haproxy伺服器:192.168.91.5 Nginx 伺服器1:192.168.91.10 Nginx 伺服器2:192.168.91.15 客戶端:192.168.91.100
1、haproxy 伺服器部署
1 1.關閉防火牆,將安裝Haproxy所需軟體包傳到/opt目錄下 2 systemctl stop firewalld 3 setenforce 0 4 5 haproxy-1.5.19.tar.gz 6 7 2.編譯安裝 Haproxy 8 yum install -y pcre-devel bzip2-devel gcc gcc-c++ make 9 10 tar zxvf haproxy-1.5.19.tar.gz 11 cd haproxy-1.5.19/ 12 make TARGET=linux2628 ARCH=x86_64 13 make install 14 15 ---------------------引數說明--------------------------------------------------------------------------- 16 TARGET=linux26 #核心版本, 17 #使用uname -r檢視核心,如:2.6.18-371.el5,此時該引數用TARGET=linux26;kernel大於2.6.28的用TARGET=linux2628 18 19 ARCH=x86_64 #系統位數,64位系統 20 ---------------------------------------------------------------------------------------------------------- 21 22 3.Haproxy伺服器配置 23 mkdir /etc/haproxy 24 cp examples/haproxy.cfg /etc/haproxy/ 25 26 cd /etc/haproxy/ 27 vim haproxy.cfg 28 global 29 --4~5行--修改,配置日誌記錄,local0為日誌裝置,預設存放到系統日誌 30 log /dev/log local0 info 31 log /dev/log local0 notice 32 #log loghost local0 info 33 maxconn 4096 #最大連線數,需考慮ulimit -n限制 34 --8行--註釋,chroot執行路徑,為該服務自設定的根目錄,一般需將此行註釋掉 35 #chroot /usr/share/haproxy 36 uid 99 #使用者UID 37 gid 99 #使用者GID 38 daemon #守護程序模式 39 40 defaults 41 log global #定義日誌為global配置中的日誌定義 42 mode http #模式為http 43 option httplog #採用http日誌格式記錄日誌 44 option dontlognull #不記錄健康檢查日誌資訊 45 retries 3 #檢查節點伺服器失敗次數,連續達到三次失敗,則認為節點不可用 46 redispatch #當伺服器負載很高時,自動結束當前佇列處理比較久的連線 47 maxconn 2000 #最大連線數 48 contimeout 5000 #連線超時時間 49 clitimeout 50000 #客戶端超時時間 50 srvtimeout 50000 #伺服器超時時間 51 52 --刪除下面所有listen項--,新增 53 listen webcluster 0.0.0.0:80 #定義一個名為webcluster的應用 54 option httpchk GET /index.html #檢查伺服器的index.html檔案 55 balance roundrobin #負載均衡排程演算法使用輪詢演算法roundrobin 56 server inst1 192.168.116.60:80 check inter 2000 fall 3 #定義線上節點 57 server inst2 192.168.116.80:80 check inter 2000 fall 3 58 59 ---------------------引數說明--------------------------------------------------------------------------- 60 balance roundrobin #負載均衡排程演算法 61 #輪詢演算法:roundrobin;最小連線數演算法:leastconn;來源訪問排程演算法:source,類似於nginx的ip_hash 62 63 check inter 2000 #表示haproxy伺服器和節點之間的一個心跳頻率 64 fall 3 #表示連續三次檢測不到心跳頻率則認為該節點失效 65 若節點配置後帶有“backup”表示該節點只是個備份節點,只有主節點失效該節點才會上。不攜帶“backup”,表示為主節點,和其它主節點共同提供服務。 66 ---------------------------------------------------------------------------------------------------------- 67 68 69 4.新增haproxy 系統服務 70 cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy 71 chmod +x haproxy 72 chkconfig --add /etc/init.d/haproxy 73 74 ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy 75 service haproxy start 或 /etc/init.d/haproxy start
2、節點伺服器部署
1 systemctl stop firewalld 2 setenforce 0 3 4 yum install -y pcre-devel zlib-devel gcc gcc-c++ make 5 6 useradd -M -s /sbin/nologin nginx 7 8 cd /opt 9 tar zxvf nginx-1.12.0.tar.gz -C /opt/ 10 11 cd nginx-1.12.0/ 12 ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install 13 14 make && make install 15 16 --192.168.91.10--- 17 echo "this is accp web" > /usr/share/nginx/html/index.html 18 19 --192.168.91.15--- 20 echo "this is benet web" > /usr/share/nginx/html/index.html 21 22 ln -s /usr/share/nginx/sbin/nginx /usr/local/sbin/ 23 24 nginx #啟動nginx 服務 25 26 或者用yum安裝 27 cat > /etc/yum.repos.d/nginx.repo << 'EOF' 28 [nginx] 29 name=nginx repo 30 baseurl=http://nginx.org/packages/centos/7/$basearch/ 31 gpgcheck=0 32 EOF 33 34 yum install nginx -y
兩個節點伺服器的配置是一樣的,yum安裝Nginx更快。這裡就只展示其中一臺的配置圖
3、測試 Web群集
在客戶端使用瀏覽器開啟 http://192.168.91.5/index.html ,不斷重新整理瀏覽器測試負載均衡效果
4、日誌定義
1 #預設haproxy的日誌是輸出到系統的syslog中,檢視起來不是非常方便,為了更好的管理haproxy的日誌,我們在生產環境中一般單獨定義出來。需要將haproxy的info及notice日誌分別記錄到不同的日誌檔案中。 2 vim /etc/haproxy/haproxy.cfg 3 global 4 log /dev/log local0 info 5 log /dev/log local0 notice 6 7 service haproxy restart 8 9 #需要修改rsyslog配置,為了便於管理。將haproxy相關的配置獨立定義到haproxy.conf,並放到/etc/rsyslog.d/下,rsyslog啟動時會自動載入此目錄下的所有配置檔案。 10 vim /etc/rsyslog.d/haproxy.conf 11 if ($programname == 'haproxy' and $syslogseverity-text == 'info') 12 then -/var/log/haproxy/haproxy-info.log 13 &~ 14 if ($programname == 'haproxy' and $syslogseverity-text == 'notice') 15 then -/var/log/haproxy/haproxy-notice.log 16 &~ 17 18 #說明: 19 這部分配置是將haproxy的info日誌記錄到/var/log/haproxy/haproxy-info.log下,將notice日誌記錄到/var/log/haproxy/haproxy-notice.log下。“&~”表示當日志寫入到日誌檔案後,rsyslog停止處理這個資訊。 20 21 systemctl restart rsyslog.service 22 23 tail -f /var/log/haproxy/haproxy-info.log #檢視haproxy的訪問請求日誌資訊