內容要點:html
1、常見的 Web集羣調度器:前端
2、Haproxy 應用分析:linux
3、Haproxy 調度算法原理:nginx
4、實驗示例:c++
第一步:搭建兩臺 Nginx 服務器web
第二步:搭建 Haproxy算法
第三步:在 win7 上用瀏覽器訪問調度服務器(192.168.100.100/test.html)vim
第四步:優化日誌後端
1、常見的 Web集羣調度器:瀏覽器
目前常見的 Web 集羣調度器分爲軟件和硬件,軟件一般使用開源的LVS、Haproxy、Nginx,硬件通常使用比較多的是 F5,也有不少人使用國內的一些產品,如梭子魚、綠盟等。
2、Haproxy 應用分析:
(1)LVS 在企業應用中抗負載能力很強,但存在不足:
LVS 不支持正則處理,不能實現動靜分離;
對於大型網站,LVS 的實現配置複雜,維護成本相對較高
(2)Haproxy 是一款可提供高可用性、負載均衡、及基於 TCP 和 HTTP 應用的代理的軟件
特別適用於負載特別大的 Web站點;
運行在當前的硬件上可支持數以萬計的併發鏈接請求
3、Haproxy 調度算法原理:
Haproxy 支持多種調度算法,最經常使用的有三種:
(1)RR:
RR 算法是最簡單最經常使用的一種算法,即輪詢調度;
理解舉例
有三個節點A、B、C,第一個用戶訪問會被指派到節點A,第二個用戶訪問會被指派到節點B,第三個用戶訪問會被指派到節點
第四個用戶訪問繼續指派到節點A,輪詢分配訪問請求實現負載均衡效果
(2)LC:
LC 算法即最小鏈接數算法,根據後端的節點鏈接數大小動態分配前端請求;
理解舉例
有三個節點A. B、C,各節點的鏈接數分別爲A:四、B:五、 C:6, 此時若是有第一個用戶鏈接請求,會被指派到A上,鏈接數變爲A:五、B:五、 C:6
第二個用戶請求會繼續分配到A上,鏈接數變爲A:六、B:五、 C:6; 再有新的請求會分配給B,每次將新的請求指派給鏈接數最小的客戶端
因爲實際狀況下A. B、C的鏈接數會動態釋放,很難會出現同樣鏈接數的狀況,所以此算法相比較r算法有很大改進,是目前用到比較多的-種算法
(3)SH:
SH 即基於來源訪問調度算法,次算法用於一些有 Session 會話記錄在服務器端的場景,能夠基於來源的 IP、Cookie 等作集羣調度。
理解舉例
有三個節點A. B、C,第一個用戶第一-次訪問被指派到了A,第二個用戶第一次訪問被指派到了B
當第一個用戶第二次訪問時會被繼續指派到A,第二個用戶第二次訪問時依舊會被指派到B,只要負載均衡調度器不重啓,第一個用戶訪問都會被指派到A,第二個用戶訪問都會被指派到B,實現集羣的調度
此調度算法好處是實現會話保持,但某些IP訪問量很是大時會引發負載不均衡,部分節點訪問量超大,影響業務使用
4、實驗示例:
(1)環境準備:
兩臺 Nginx 服務器,一臺 Haproxy調度服務器,一臺window做爲測試用;
在兩臺 Nginx服務器寫兩個測試網頁;
全部主機網卡都設置成僅主機模式,修改好網卡信息;
客戶端能夠經過訪問調度服務器,訪問到兩臺節點服務器,不須要訪問真實服務器地址。
角色 | IP地址 |
Haproxy | 192.168.100.100 |
Nginx 01 | 192.168.100.201 |
Nginx 02 | 192.168.100.202 |
window7(做爲測試用) | 192.168.100.50 |
第一步:搭建兩臺 Nginx 服務器
關於nginx的搭建能夠看我以前的博客,有詳細的搭建過程和細節,這邊具體細節再也不寫了。
搭建好 Nginx服務以後,在 Nginx主頁 html 中添加一個測試主頁,便於驗證明驗結果:
第一臺:
echo "this is kgc web" > /usr/local/nginx/html/tset.html
第二臺:
echo "this is accp web" > /usr/local/nginx/html/tset.html
第二步:搭建 Haproxy
(1)安裝編譯工具:
yum install bzip2-devel pcre-devel gcc gcc-c++ make -y
(2)能夠經過遠程掛載將 haproxy壓縮包掛載到本地,再解壓縮:
tar zxvf haproxy-1.5.19.tar.gz -C /opt/ //解壓到/opt目錄下
(3)編譯:
make TARGET=linux3100 注:這個版本號,可使用 uname -a 命令來查看版本號
make install
(4)建立文件,進行備份修改:
mkdir /etc/haproxy cp examples/haproxy.cfg /etc/haproxy/ vim /etc/haproxy/haproxy.cfg global log 127.0.0.1 local0 log 127.0.0.1 local1 notice #log loghost local0 info maxconn 4096 uid 99 gid 99 daemon #debug #quiet defaults log global mode http option httplog option dontlognull retries 3 maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000 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
(5)啓動腳本:
cp examples/haproxy.init /etc/init.d/haproxy //複製到init.d啓動進程中 chmod +x /etc/init.d/haproxy //添加執行權限 chkconfig --add haproxy //添加到service,便於識別 ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy //建立軟鏈接
(6)開啓服務:
service haproxy start
關閉防火牆等環境
[root@Haproxy haproxy-1.5.19]# systemctl stop firewalld.service [root@Haproxy haproxy-1.5.19]# setenforce 0
第三步:在 win7 上用瀏覽器訪問調度服務器(192.168.100.100/test.html)
http://192.168.100.100/test.html
第四步:優化日誌
對調度器的配置文件進行優化和修改,能夠將正常的訪問信息和錯誤的信息分別存放在不一樣的日誌文件中,方便管理;Haproxy的日誌默認是輸出到系統的 syslog 中,在生產環境中通常單獨定義出來。
(1)修改主配置文件
vim/etc/haproxy/haproxy.cfg 修改global段: log /dev/log local0 info //正常訪問的信息存放地 log /dev/log local0 notice //提示、警告等信息存放地
(2)重啓服務
service haproxy restart
(3)建立文件,並添加規則
[root@Haproxy haproxy]# touch /etc/rsyslog.d/haproxy.conf [root@Haproxy haproxy]# cd /etc/rsyslog.d/ [root@Haproxy rsyslog.d]# vim 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 &~
(4)重啓日誌服務
systemctl restart rsyslog.service
(5)查看日誌文件: /var/log/haproxy/haproxy-info.log
cat haproxy-info.log