????????Hapraxy是目前比較流行的一種群集調度工具,同類群集調度工具有很多,如LVS 和Nginx。相 比較而言,LVS.性能最好,但是搭建相對復雜:Nginx的 upstream 模塊支持群集功能,但是對群集節 點健康檢查功能不強,性能沒有Haproxy好。Heproxy官方網站是http://www.haproxy.org/?
索例前置知識點
(1)HTTP請求
????????通過URL訪問網站使用的協議是HTTP協議,此類請求一般稱為HTTP請求。HTTP請求的方式分 為GET方式和 POST方式。當使用瀏覽器訪問某一個URL,會根據請求URL返回狀態碼,通常正常的 狀態碼為2xx.3xx(如200、301),如果出現異常會返回4xx、5xx(如400,500).
????????例如,訪問http://www.test.com/a.php?ld=123,就是一個GET請求,如果訪問正常,會從服 務器的日志中獲取200狀態碼.假如此請求使用POST方式,那么傳遞給a.php的Id參數依舊是123, 但是瀏覽器的URL將不會顯示后面的Id=123字樣,因此表單類或者有用戶名,密碼等內容提交時建 議使用POST方式。不管使用哪種方式,最終a.php獲取的值是一樣的。
(2)負載均衡常用調度算法
????????LVS, Haproxy. Nginx最常用的調度算法有三種,如下所述,
1.RR(Round Robin)。RR算法是最簡單最常用的一種算法,即輪詢調度。例如,有三個節點A、B、C.第一個用戶訪問會被指派到節點A,第二個用戶訪問會被指派到節點B,第三個用戶訪問會 被指派到節點C,第四個用戶訪問繼續指派到節點A,輪詢分配訪問請求實現負載均衡效果。此算 法還有一種加權輪詢,即根據每個節點的權重輪詢分配訪問請求。
2.LC (Least Comections).LC 算法即最小連接數算法,根據后端的節點連接數大小動態分配 前端請求。例如,有三個節點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的連接數會動態釋放,很難會出現一樣連接數的情況,因此此算 法相比較爪算法有很大改進,是目前用到比較多的一種算法。
3.SH (Source Hashing).SH即基于來源訪問調度算法,此算法用于一些有Session 會話記錄在 服務器端的場景,可以基于來源的P.Cookie 等做群集調度。例如,使用基于源P的群集調度算法, 有三個節點A.B.C.第一個用戶第一次訪問被指派到了A,第二個用戶第一次訪問被指派到了B. 當第一個用戶第二次訪問時會被繼續指派到A.第二個用戶第二次訪問時依舊會被指派到B.只要負 載均衡調度髁不重啟,第一個用戶訪問都會被指派到A.第二個用戶訪問都會被指派到B,實現群集 的調度。此調度算法好處是實現會話保持,但某些尸訪問最非常大時會引起負載不均衡,部分節點 訪問量超大,影響業務使用。
(3)常見的Web群集調度器
????????目前常見的Web群集調度器分為軟件和硬件,軟件通常使用開源的LVS. Haproxy, Nginx,硬件 一般使用比較多的是F5,也有很多人使用國內的一些產品,如梭子魚、綠盟等.
案例環境
? ? ? ? 本案例使用三臺服務器模擬搭建一套Web群集,拓撲圖如下所示:
案例實施
關閉防火墻:systemctl disable firewalld --now
關閉Selinux:setenforce 0
????????????????????????sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
配置IP DNS 網關:nmtui
1.編譯安裝Nginx服務器
(1)搭建Nginx1,使用nginx-1.12.0.tar.gz安裝包進行編譯安裝。
[root@Nginx1 ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 寫保護,將以只讀方式掛載
[root@Nginx1 ~]# yum -y install pcre-devel zlib-devel //掛載后在本地yum倉庫安裝[root@Nginx1 ~]#useradd -M -s /sbin/nologin nginx //創建nginx用戶[root@Nginx1 ~]# rz -E //把源碼包nginx-1.24.0.tar.gz拉進來
rz waiting to receive.[root@Nginx1 ~]# tar zxf nginx-1.24.0.tar.gz //解壓文件[root@Nginx1 ~]# cd nginx-1.24.0/ //執行編譯安裝
[root@Nginx1 nginx-1.24.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
[root@Nginx1 nginx-1.24.0]# make && make install
[root@Nginx1 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ //創建主程序鏈接文件[root@Nginx1 ~]# echo "<h1>This is nginx Server 192.168.55.49</h1>" > /usr/local/nginx/html/test.html //建立測試頁面[root@Nginx1 ~]# /usr/local/nginx/sbin/nginx //啟動Nginx[root@Nginx1 ~]# netstat -anpt | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 11121/nginx: master [root@Nginx1 ~]# systemctl stop firewalld.service
?????????為了方便實驗,網站沒有配置域名,直接使用IP地址。在客戶端訪問http://192.168.55.49/ test.huml測試。
(2)搭建Nginx2.
????????編譯安裝的步驟與Nginx1相同,不同之處在于建立測試頁面。
[root@Nginx2 ~]# echo "<h1>This is nginx Server 192.168.55.50</h1>" > /usr/local/nginx/html/test.html
?2.編譯安裝Haproxy
使用 haproxy-1.5.19.tar.gz安裝包進行編譯安裝
[root@Haproxy ~]# yum -y install pcre-devel bzip2-devel //組件[root@Haproxy ~]# rz -E
rz waiting to receive. //將源碼包haproxy-1.5.19.tar.gz上傳拉進來[root@Haproxy ~]# tar zxf haproxy-1.5.19.tar.gz
[root@Haproxy ~]# cd haproxy-1.5.19/
[root@Haproxy haproxy-1.5.19]# make TARGET=linux26 //64位系統
[root@Haproxy haproxy-1.5.19]# make install
3.Haproxy服務器配置
(1)建立Haproxy的配置文件。
[root@Haproxy haproxy-1.5.19]# mkdir /etc/haproxy //創建主配置文件[root@Haproxy haproxy-1.5.19]# cp examples/haproxy.cfg /etc/haproxy/ //將haproxy.cfg文件復制到配置文件目錄
(2)Haproxy配置項介紹。
(3)根據目前的群集設計,將haproxy.cfg配置文件的內容修改如下。
[root@Haproxy ~]# vim /etc/haproxy/haproxy.cfg
4.創建自啟動腳本
[root@Haproxy haproxy-1.5.19]# mkdir /usr/share/haproxy //創建群集根目錄添加haproxy系統服務:
[root@Haproxy haproxy-1.5.19]# cp examples/haproxy.init /etc/init.d/haproxy
[root@Haproxy haproxy-1.5.19]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
[root@Haproxy haproxy-1.5.19]# chmod +x /etc/init.d/haproxy
[root@Haproxy haproxy-1.5.19]# chkconfig --add haproxy啟動服務:
[root@Haproxy haproxy-1.5.19]# /etc/init.d/haproxy start
Starting haproxy (via systemctl): [ 確定 ]啟動服務:
[root@Haproxy haproxy-1.5.19]# systemctl start haproxy關閉防火墻瀏覽器可以進入:
[root@Haproxy haproxy-1.5.19]# systemctl stop firewalld
5.測試Web群集?
????????通過上面的步驟,已經搭建完成Haproxy 的Web群集,接下來需要驗證群集是否工作正常。一 個群集一般需要具備兩個特性,第一個是高性能,第二個是高可用,
(1)測試高性能
在客戶端使用瀏覽器打開http://192.168.55.47/test.html,瀏覽器顯示信息
?
再次打開一個新的瀏覽器頁面訪問http://192.168.55.47/test.html,瀏覽器顯示信息?
?
?
(2)測試高可用
現在將 192.168.55.49的Nginx服務停用,在客戶端使用瀏覽器打開http://192.168.55.47/ test.html,瀏覽器顯示信息
從中可以看出,當一臺節點故障,不會影響群集的使用,這祥就滿足了群集的高可用性。也可 以將192.168.1.62的Nginx服務恢復,再將192.168.1.61的Nginx服務停用,測試高可用性。?