常見的Web集 羣調度器
- 目前常見的Web集羣調度器分爲軟件和硬件,軟件通常使用開源的LVS、Haproxy、Nginx,硬件一般使用比較多的F5,也有很多的人使用國內的一些產品,比如梭子、綠盟等
Haproxy應用分析
LVS在企業應用中抗負載能力很強,但存在不足
- LVS不支持正則處理,不能實現動靜分離
- 對於大型網站,LVS實施配置複雜,維護成本相對較高
Haproxy是一款可提供高可用性、負載均衡、及基於TCP和HTTP應用的代理的軟件
- 特別適用於負載特別大的Web站點
- 運行在當前的硬件上可支持數以萬計的併發連接請求
Haproxy調度算法原理
Haproxy支持多種調度算法,最常見的有三種
- RR(Round Robin)
RR算法最簡單最常見的一種算法,即輪詢調度 - 理解舉例
(1)有三個節點A、B、C,第一個用戶訪問會被指派到節點A,第二個用戶訪問會被指派到節點B,第三個用戶訪問會被指派到節點
(2)第四個用戶訪問繼續指派到節點A,輪詢分配訪問請求實現負載均衡效果 - LC (Least Connections)
LC算法即最小連接數算法,根據後端的節點連接數大小動態分配前端請求 - 理解舉例
(1)有三個節點A、B、C,各節點的連接數分別爲A:4、B:5、 C:6,此時如果有第一個用戶連接請求,會被指派到A上,連接數變爲A:5、B:5、 C:6
(2)第二個用戶請求會繼續分配到A上,連接數變爲A:6、B:5、 C:6,再有新的請求會分配給B,每次將新的請求指派給連接數最小的客戶端
(3)由於實際情況下A、B、C的連接數會動態釋放,很難會出現一樣連接數的情況,因此此算法相比較rr算法有很大改進,是目前用到比較多的一種算法 - SH (Source Hashing)
SH即基於來源訪問調度算法,此算法用於一 些有Session會話記錄在服務器端的場景,可以基於來源的IP、Cookie等做集羣調度 - 理解舉例
(1)有三個節點A、B、C,第一個用戶第一次訪問被指派到了A,第二個用戶第一次訪問被指派到了B
(2)當第一個用戶第二次訪問時會被繼續指派到A,第二個用戶第二次訪問時依舊會被指派到B,只要負載均衡調度器不重啓,第一個用戶訪問都會被指派到A,第二個用戶訪問都會被指派到B,實現集羣的調度
(3)此調度算法好處是實現會話保持,但某些IP訪問量非常大時會引起負載不均衡部分節點訪問量超大,影響業務使用
實驗案例
1、實驗環境
- 實驗拓撲圖
- IP地址分配
主機名 | IP地址 |
---|---|
客戶端 | 192.168.150.128 |
haproxy | 192.168.150.147 |
nginx1 | 192.168.150.148 |
nginx2 | 192.168.150.158 |
2、在兩臺web網站上安裝nginx服務器
(1)安裝基礎軟件包
[root@nginx1 ~]# yum install gcc gcc-c++ pcre-devel zlib-devel make -y
(2)創建系統用戶賬號nginx
[root@nginx1 ~]# useradd -M -s /sbin/nologin nginx
(3)編譯安裝nginx服務
[root@nginx1 LNMP-C7]# tar zxvf nginx-1.12.2.tar.gz -C /opt
[root@nginx1 LNMP-C7]# cd /opt/nginx-1.12.2/
[root@nginx1 nginx-1.12.2]# ./configure \
> --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx
[root@nginx1 nginx-1.12.2]# make && make install
(4)編輯網頁內容,注意測試網頁的內容不能一樣,以便進行測試
[root@nginx2 nginx-1.12.2]# cd /usr/local/nginx/html/
[root@nginx2 html]# vim test.html
this is aaa test web
(5)創建軟連接,啓動服務,關閉防火牆功能
[root@nginx2 html]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@nginx2 html]# nginx
[root@nginx2 html]# systemctl stop firewalld.service
[root@nginx2 html]# setenforce 0
3、安裝haproxy服務器
(1)安裝基礎軟件包
[root@haproxy ~]# yum install gcc gcc-c++ pcre-devel bzip2-devel make -y
(2)編譯安裝haproxy服務
[root@haproxy Y2C7]# tar zxvf haproxy-1.5.19.tar.gz -C /opt
[root@haproxy Y2C7]# cd /opt/haproxy-1.5.19
[root@haproxy haproxy-1.5.19]# make TARGET=linux26
[root@haproxy haproxy-1.5.19]# make install
(3)建立haproxy的配置文件
- 創建配置文件目錄 /etc/haproxy
[root@haproxy haproxy-1.5.19]# mkdir /etc/haproxy
- 將源碼包提供的配置文件樣例haproxy.cfg複製到配置文件目錄中
[root@haproxy haproxy-1.5.19]# cp examples/haproxy.cfg /etc/haproxy/
- 修改配置文件
[root@haproxy haproxy-1.5.19]# cd /etc/haproxy/
[root@haproxy haproxy]# vim haproxy.cfg
#註釋chroot /usr/local/haproxy
#註釋redispach
#刪除原有的listen,重新添加
listen webcluster 0.0.0.0:80
option httpchk GET /test.html
server inst1 192.168.7.148:80 check inter 2000 fall 3
server inst1 192.168.7.158:80 check inter 2000 fall 3
(4)將源碼包提供的啓動腳本複製到/etc/init.d目錄下,並添加到server服務中,啓動haproxy服務
[root@haproxy haproxy]# cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
[root@haproxy haproxy]# chmod +x /etc/init.d/haproxy
[root@haproxy haproxy]# chkconfig --add /etc/init.d/haproxy
[root@haproxy haproxy]# ln -s /usr/local/sbin/haproxy /usr/sbin/
[root@haproxy haproxy]# service haproxy start
(5)網頁測試,使用客戶端訪問網址:http://192.168.150.147/test.html
4、日誌定義
(1)修改haproxy配置文件中關於日誌配置的選項
[root@haproxy sbin]# vim /etc/haproxy/haproxy.cfg
log /dev/log local0 info
log /dev/log local1 notice
#重啓haproxy服務
[root@haproxy sbin]# service haproxy restart
Restarting haproxy (via systemctl): [ 確定 ]
(2)修改rsyslog配置將haproxy相關的配置獨立定義到haproxy.conf,並放到/etc/rsyslog.d/下,重啓rsyslog服務
[root@haproxy sbin]# vim /etc/rsyslog.d/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
&~
[root@haproxy sbin]# systemctl restart rsyslog.service
(3)重新訪問網頁即可查看到日誌文件產出