目前常見的 Web 集羣調度器分爲軟件和硬件,軟件一般使用開源的LVS、Haproxy、Nginx,硬件通常使用比較多的是 F5,也有不少人使用國內的一些產品,如梭子魚、綠盟等
■LVS在企業應用中抗負載能力很強,但存在不足html
LVS不支持正則處理,不能實現動靜分離 對於大型網站,LVS的實施配置複雜,維護成本相對較高
■Haproxy是一款可提供高可用性、負載均衡、及基於TCP和HTTP應用的代理的軟件前端
特別適用於負載特別大的Web站點 運行在當前的硬件上可支持數以萬計的併發鏈接鏈接請求
Haproxy 支持多種調度算法,最經常使用的有三種:linux
●RR (Round Robin) RR算法是最簡單最經常使用的一-種算法,即輪詢調度 理解舉例 有三個節點A、B、C,第一個用戶訪問會被指派到節點A,第二個用 戶訪問會被指派到節點B,第三個用戶訪問會被指派到節點 第四個用戶訪問繼續指派到節點A,輪詢分配訪問請求實現負載均衡效果
●LC (Least Connections) LC算法即最小鏈接數算法,根據後端的節點鏈接數大小動態分配前端請求 理解舉例 有三個節點A、B、C,各節點的鏈接數分別爲A:四、B:五、 C:6, 此時若是有第 一個用戶鏈接請求,會被指派到A上,鏈接數變爲A:五、B:五、 C:6 第二個用戶請求會繼續分配到A上,鏈接數變爲A:六、B:五、 C:6; 再有新的請求會分配給B,每次將新的請求指派給鏈接數最小的客戶端 因爲實際狀況下A、B、C的鏈接數會動態釋放,很難會出現-樣鏈接數的狀況 所以此算法相比較rr算法有很大改進,是目前用到比較多的-種算法
●SH (Source Hashing) SH即基於來源訪問調度算法,此算法用於一些有Session會話記錄在服務器端 的場景,能夠基於來源的IP、Cookie等作集羣調度 理解舉例 有三個節點A、B、C,第一個用戶第一次訪問被指派到了A,第二個用戶第一 次訪問被指派到了B 當第一個用戶第二次訪問時會被繼續指派到A,第二個用戶第二次訪問時依舊 會被指派到B,只要負載均衡調度器不重啓,第一個用戶訪問都會被指派到A, 第二個用戶訪向都會被指派到B,實現集羣的調度 此調度算法好處是實現會話保持,但某些IP訪問量很是大時會引發負載不均衡 部分節點訪問量超大,影響業務使用
Haproxy配置文件一般分爲三個部分nginx
●global:爲全局配置 ●defaults:爲默認配置 ●listen:爲應用組件配置
global配置參數c++
●log 127.0.0.1 local0:配置日誌記錄,配置日誌記錄,ocal0爲日 志設備,默認存放到系統日誌 ●log 127.0.0.1 local1 notice: notice爲 日誌級別一般有24個級別 ●maxconn4096:最大鏈接數 ●uid 99:用戶uid ●gid 99:用戶gid
defaults配置項配置默認參數,-般會被應用組件繼承,若是在應
用組件中沒有特別聲明,將安裝默認配置參數設置web
●log global:定義日誌爲global配置中的日誌定義 ●mode http:模式爲http ●option httplog:採用http日誌格式記錄日誌 ●retries 3:檢查節點服務器失敗連續達到三次則認爲節點不可用 ●maxconn 2000:最大鏈接數 ●contimeout 5000:鏈接超時時間 ●clitimeout 50000:客戶端超時時間 ●srtimeout 50000:服務器超時時間
listen配置項目一 般爲配置應用模塊參數redis
●listen appli4-backup 0.0.0.0:10004: 定義一-個appli4-backup的 應用 ●option httpchk /index.html: 檢查服務器的index.html文件 , option persist :強制將請求發送到已經down掉的服務器 ) Balance roundrobin: 負載均衡調度算法使用輪詢算法 ●server inst1 192.168.114 .56:80 check inter 2000 fall3: 定義在 線節點 server inst2 192. 168.114.56:81 check inter 2000 fall 3 backup :定義備份節點
Haproxy的日誌默認是輸出到系統的syslog中,在生產
環境中通常單獨定義出來
定義的方法步驟算法
●修改Haproxy配置文件中關於日誌配置的選項,加入配置: p log /dev/log local0 info 。log /dev/log local0 notice ●修改rsyslog配置,將Haproxy相關的配置獨立定義到 haproxy.conf,並放到etclrsyslog.d下 ●保存配置文件並重啓rsyslog服務,完成rsyslog配置
訪問Haproxy集羣測試網頁並測試日誌信息vim
隨着企業網站負載增長,haproxy參數優化至關重要windows
●maxconn:最大鏈接數,根據應用實際狀況進行調整,推薦使用 10 240 ●daemon:守護進程模式, Haproxy能夠使用非守護進程模式啓 動,建議使用守護進程模式啓動 ●nbproc:負載均衡的併發進程數,建議與當前服務器CPU核數相 等或爲其2倍 ●oretries:重試次數,主要用於對集羣節點的檢查,若是節點多,且並 髮量大,設置爲2次或3次 ●option http-server-close:主動關閉http請求選項,建議在生產環 境中使用此選項 ●timeout http-keep-alive:長鏈接超時時間,設置長鏈接超時時間 能夠設置爲10s ●timeout http-request: http請求超時時間,建議將此時間設置爲5 ~ 10s,增長http鏈接釋放速度 ●timeout client:客戶端超時時間,若是訪問量過大,節點響應慢 能夠將此時間設置短一些,建議設置爲1min左右就能夠了
實驗要求
1.一臺 Haproxy調度服務器,兩臺 Nginx 服務器,一臺windows7做爲客戶端; 2.三臺服務器爲CentOS 7.3的64位系統; 3.全部主機網卡都設置成僅主機模式,綁定靜態地址; 4.客戶端能夠經過訪問調度服務器,訪問到兩臺節點服務器,不須要訪問真實服務器地址。
主機角色 | IP地址 |
---|---|
Haproxy服務器 | 192.168.100.210 |
Nginx服務器1 | 192.168.100.201 |
Nginx服務器2 | 192.168.100.202 |
windows7客戶端 | 192.168.100.50 |
1.使用yum安裝編譯工具
[root@haproxy ~]# yum install bzip2-devel pcre-devel gcc gcc-c++ make -y
2.修改網卡爲僅主機模式,並綁定靜態地址
[root@haproxy ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 #將dhcp替換爲static BOOTPROTO=static #在末行追加IP地址\子網掩碼\網關 IPADDR=192.168.100.210 NETMASK=255.255.255.0 GATEWAY=192.168.100.1 [root@haproxy ~]# service network restart Restarting network (via systemctl): [ 肯定 ]
3.遠程共享並掛載haproxy源碼包到本地服務器
[root@haproxy ~]# smbclient -L /192.168.100.1 Sharename Type Comment --------- ---- ------- haproxy Disk LNMP Disk
4.解壓haproxy源碼包並編譯
[root@haproxy ~]# cd /mnt #解壓haproxy源碼包到.opt目錄 [root@haproxy mnt]# tar zxvf haproxy-1.5.19.tar.gz -C /opt [root@haproxy mnt]# cd /opt [root@haproxy opt]# ls haproxy-1.5.19 rh #切換至haproxy目錄 [root@haproxy opt]# cd haproxy-1.5.19/ #查看系統版本號3100 [root@haproxy haproxy-1.5.19]# uname -a Linux haproxy 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux #編譯haproxy [root@haproxy haproxy-1.5.19]# make TARGET=linux3100 #編譯安裝 [root@haproxy haproxy-1.5.19]# make install
5.修改haproxy.cfg配置文件,並開啓服務
#建立haproxy文件目錄 [root@haproxy haproxy-1.5.19]# mkdir /etc/haproxy #複製模板文件到haproxy目錄 [root@haproxy haproxy-1.5.19]# cp examples/haproxy.cfg /etc/haproxy/ #修改haproxy.cfg文件 [root@haproxy haproxy-1.5.19]# vim /etc/haproxy/haproxy.cfg #註釋chroot和redispatch條目,防止啓動失敗 global log 127.0.0.1 local0 log 127.0.0.1 local1 notice #log loghost local0 info maxconn 4096 #chroot /usr/share/haproxy uid 99 gid 99 daemon #debug #quiet defaults log global mode http option httplog option dontlognull retries 3 #redispatch maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000 #刪除原有的全部listen條目,添加一下條目 listen webcluster 0.0.0.0:80 option httpchk GET /test.html balance roundrobin server inst1 192.168.100.201:80 check inter 2000 fall 3 server inst2 192.168.100.202:80 check inter 2000 fall 3 #複製haproxy啓動腳本到系統啓動進程中 [root@haproxy haproxy-1.5.19]# cp examples/haproxy.init /etc/init.d/haproxy #授予腳本執行權限 [root@haproxy haproxy-1.5.19]# chmod +x /etc/init.d/haproxy #添加腳本到service管理條目中 [root@haproxy haproxy-1.5.19]# chkconfig --add haproxy #創建腳本命令軟連接 [root@haproxy haproxy-1.5.19]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy #啓動服務 [root@haproxy haproxy-1.5.19]# service haproxy start Starting haproxy (via systemctl): [ 肯定 ] #關閉防火牆和安全功能 [root@Haproxy haproxy-1.5.19]# systemctl stop firewalld.service [root@Haproxy haproxy-1.5.19]# setenforce 0
1.兩臺Nginx服務器都要使用yum安裝編譯工具
[root@haproxy ~]# yum install zlib-devel pcre-devel gcc gcc-c++ make -y
2.修改網卡爲僅主機模式,並綁定靜態地址
[root@nginx1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 #將dhcp替換爲static BOOTPROTO=static #在末行追加IP地址\子網掩碼\網關 IPADDR=192.168.100.201 NETMASK=255.255.255.0 GATEWAY=192.168.100.1 [root@nginx1 ~]# service network restart Restarting network (via systemctl): [ 肯定 ] [root@nginx2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 #將dhcp替換爲static BOOTPROTO=static #在末行追加IP地址\子網掩碼\網關 IPADDR=192.168.100.202 NETMASK=255.255.255.0 GATEWAY=192.168.100.1 [root@nginx2 ~]# service network restart Restarting network (via systemctl): [ 肯定 ]
3.遠程共享掛載Nginx源碼包到本地服務器
[root@nginx1 ~]# mount.cifs //192.168.100.1/LNMP /mnt Password for root@//192.168.100.1/LNMP:
4.解壓源碼包並建立管理用戶
[root@nginx1 ~]# cd /mnt #解壓Nginx源碼包到/opt目錄 root@nginx1 mnt]# tar zxvf nginx-1.12.0.tar.gz -C /opt #建立Nginx管理用戶 root@nginx1 mnt]# cd /opt [root@nginx1 opt]# useradd -M -s /sbin/nologin nginx
5.配置Nginx
[root@nginx1 opt]# cd nginx-1.12.0/ [root@nginx1 nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
6.編譯安裝
[root@nginx1 nginx-1.12.0]# make && make install
7.建立測試網頁
[root@nginx1 nginx-1.12.0]# cd /usr/local/nginx/html/ [root@nginx1 html]# echo "this is kgc web" >test.html [root@nginx2 nginx-1.12.0]# cd /usr/local/nginx/html/ [root@nginx2 html]# echo "this is accp web" >test.html
8.建立Nginx命令軟連接到系統
[root@nginx1 html]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
9.關閉防火牆和安全功能,啓動服務
[root@nginx1 html]# systemctl stop firewalld.service [root@nginx1 html]# setenforce 0 [root@nginx1 html]# nginx
10.使用客戶端訪問網頁,在瀏覽器中輸入192.168.100.210/test/html進行訪問
#重啓haproxy 服務 [root@haproxy etc]# service haproxy restart Restarting haproxy (via systemctl): [ 肯定 ] #建立 [root@haproxy haproxy-1.5.19]# touch /etc/rsyslog.d/haproxy.conf [root@haproxy haproxy-1.5.19]# vim /etc/rsyslog.d/haproxy.conf #定義haproxy信息日誌 if ($programname == 'haproxy' and $syslogseverity-text == 'info') then -/var/log/haproxy/haproxy-info.log &~ #定義haproxy通知日誌 if ($programname == 'haproxy' and $syslogseverity-text == 'notice') then -/var/log/haproxy/haproxy-notice.log &~ #重啓日誌服務 [root@haproxy etc]# systemctl restart rsyslog.service #切換到日誌目錄下查看haproxy日誌文件 [root@haproxy etc]# cd /var/log/haproxy/ [root@haproxy haproxy]# ls haproxy-info.log #查看日誌文件 [root@haproxy haproxy]# cat haproxy-info.log Nov 30 16: 53: 30 Haproxy haproxy[119165]: 192.168.100.50: 49191 [ 30/Nov/2019:16: 53: 30.100 webcluster. webcluster/inst2 168/0/1/0/169 200 252 - - --- 1/1/0/1/0 0/0 "GET /test.h tml HTTP/1.1" Nov 30 16: 53:42 Haproxy haproxy[119165]: 192.168.100.50: 49191[ 30/Nov/2019: 16:53: 42.290 : webcluster. webcluster/inst1 159/0/0/0/159 200 253 - - ---- 1/1/0/1/0 0/0 "GET /test.h tml HTTP/1.1 "