理論+實驗:Haproxy搭建Web群集

2020-09-26 09:00:19

一、常見的WEB叢集排程器

  • 目前常見的WEB叢集排程器分為軟體和硬體
  • 軟體通常使用LVS、Haproxy、Nginx
  • 硬體一般使用比較多的是F5,也有很多人使用國內的一些產品,如梭子魚、綠盟等。

二、Haproxy應用分析

■LVS在企業應用中抗負載能力很強,但存在不足

  • LVS不支援正則處理,不能實現動靜分離
  • 對於大型網站,LVS的實施設定複雜,維護成本相對於較高

■Haproxy是一款可提供高可用性、負載均衡、及基於TCP和HTTP應用代理的軟體

  • 適用於負載大的web站點
  • 執行在硬體上可支援數以萬計的並行連線的連線請求

三、Haproxy排程演演算法原理

3.1、RR (Round Robin)

■ Haproxy支援多種排程演演算法,最常用的有三種

  • RR (Round Robin)
    ◆ RR演演算法是最簡單最常用的一種演演算法,即輪詢排程

  • 理解舉例
    ◆ 有三個節點A、B、C
    ◆ 第一個使用者存取會被指派到節點A
    ◆ 第二個使用者存取會被指派到節點B
    ◆ 第三個使用者存取會被指派到節點C
    ◆ 第四個使用者存取繼續指派到節點A,輪詢分配存取請求實現負載均衡效果

3.2、LC (Least Connections)

■ 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.3、SH(Source Hashing)

■ SH(Source Hashing)

  • 基於來源存取排程演演算法,用於一些有Session對談記錄在伺服器端的場景,可以基於來源的IP、Cookie等做叢集排程

■理解舉例

  • 有三個節點A、B、C,第一個使用者第一次存取被指派到了A,第二個使用者第一次存取被指派到了B
  • 當第一個使用者第二次存取時會被繼續指派到A,第二個使用者第二次存取時依舊會被指派到B,只要負載均衡排程器不重新啟動,第一個使用者存取都會被指派到A,第二個使用者存取都會被指派到B,實現叢集的排程
  • 此排程演演算法好處是實現對談保持,但某些IP存取量非常大時會引起負載不均衡,部分節點存取量超大,影響業務使用

四、使用Haproxy搭建Web群集

4.1、實驗設定
###########  使用Haproxy搭建Web群集  #######
場景介紹:
     主機           作業系統                 IP地址                         主要軟體
Haproxy伺服器       CentoS7.6             192.168.100.21                haproxy-1.5.19.tar.gz
Nginx伺服器1        CentoS7.6             192.168.100.22                Nginx-1.12.2.tar.gz
Nginx伺服器2        CentoS7.6             192.168.100.23                Nginx-1.12.2.tar.gz
儲存伺服器          CentoS7.6             192.168.100.24                nfs-utils   rpcbind
######偵錯儲存伺服器  192.168.100.24 #####
[root@localhost ~]#rpm -q nfs-utils    ###如果沒裝,yum -y install nfs-utils
[root@localhost ~]#rpm -q rpcbind      ###如果沒裝,yum -y install rpcbind

[root@localhost ~]# mkdir /opt/51xit /opt/52xit   ###建立51和52目錄
[root@localhost ~]# echo "this is www.51xit.com" >/opt/51xit/index.html  ###建一個51xit首頁並寫入東西
[root@localhost ~]# echo "this is www.52xit.com" >/opt/52xit/index.html  ###建一個52xit首頁並寫入東西
[root@localhost ~]# vi /etc/exports   ###釋出出去
/opt/51xit 192.168.100.0/24 (rw,sync)   
/opt/52xit 192.168.100.0/24 (rw,sync)

[root@localhost ~]# systemctl start rpcbind   ###啟動rpcbind 先啟動rpcbind在啟動nfs
[root@localhost ~]# systemctl start nfs 
[root@localhost ~]# systemctl enable nfs
[root@localhost ~]# systemctl enable rpcbind
######編譯安裝Nginx伺服器1  192.168.100.22 ######
1、編譯安裝 Nginx
Nginx 安裝檔案可以從官方網站 http://www.nginx.org/下載。
下面以穩定版 Nginx 1.12.2為例   上傳至/opt下
[root@localhost ~]#yum -y install pcre-devel zlib-devel gcc-c++   ### 依賴環境裝一下
[root@localhost ~]# useradd -M -s /sbin/nologin nginx       #### 建立賬戶
[root@localhost ~]# cd /opt
[root@localhost ~]# tar zxvf nginx-1.12.2.tar.gz
[root@localhost ~]# cd nginx-1.12.2
[root@localhost nginx-1.12.2]# 
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx

[root@localhost nginx-1.12.2]# make && make install   ###編譯安裝

[root@localhost nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@localhost nginx-1.12.2]# nginx                 ### 啟動nginx
[root@localhost nginx-1.12.2]# netstat -anutp |grep nginx        ### 檢視啟動情況
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      21135/nginx: master 

■啟動、 停止 Nginx
[root@localhost nginx-1.12.2]# killall -3 nginx        ###停止服務    -1是安全重新啟動
如果出現: -bash: killall: command not found

[root@localhost nginx-1.12.2]#  yum -y install psmisc    ###如果出現上面報錯就代表沒有安裝killall功能,yum安裝一下
[root@localhost nginx-1.12.2]# killall -3 nginx    ###然後停止nginx服務
[root@localhost nginx-1.12.2]# nginx -t                 ###對組態檔檢查一下
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

■新增 Nginx 系統服務
[root@localhost ~]# vim /lib/systemd/system/nginx.service  ###注意目錄別進錯了
[Unit]
Description=nginx                                                 ####描述
After=network.target                                            ####描述服務類別
[Service]
Type=forking                                                          ####後臺執行形式
PIDFile=/usr/local/nginx/logs/nginx.pid                ####PID 檔案位置
ExecStart=/usr/local/nginx/sbin/nginx                  ####啟動服務
ExecReload=/usr/bin/kill -s HUP $MAINPID         ####根據 PID 過載設定
ExecStop=/usr/bin/kill -s QUIT $MAINPID           ####根據 PID 終止程序
PrivateTmp=true
[Install]
WantedBy=multi-user.target

################下面是刷的#############
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking 
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/bin/kill -s HUP $MAINPID
ExecStop=/usr/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

[root@localhost nginx-1.12.2]# systemctl start nginx       ### 啟動nginx
[root@localhost nginx-1.12.2]# systemctl enable nginx    ### 開機自啟nginx
[root@localhost nginx-1.12.2]# chmod 754 /lib/systemd/system/nginx.service   ### 許可權也要給一下

[root@localhost nginx-1.12.2]# yum -y install nfs-utils  ### 把nfs裝一下,有的已經裝了的就不用裝了
[root@localhost nginx-1.12.2]# showmount -e 192.168.100.24    ###測試一下

[root@localhost ~]# mount 192.168.100.24:/opt/51xit    /usr/local/nginx/html/  ###臨時掛載,可以直接永久掛載

[root@localhost ~]# vi /etc/fstab             ###編輯永久掛載
192.168.100.24:/opt/51xit/ /usr/local/nginx/html/    nfs    defaults,_netdev 0 0        ###開機自動掛載,注意格式對齊
[root@localhost nginx-1.12.2]# init6  ###重新啟動伺服器
[root@localhost nginx-1.12.2]# systemctl restart nginx       ###重新啟動nginx
######編譯安裝Nginx伺服器2  192.168.100.23 ######
1、編譯安裝 Nginx
Nginx 安裝檔案可以從官方網站 http://www.nginx.org/下載。
下面以穩定版 Nginx 1.12.2為例   上傳至/opt下
[root@localhost ~]#yum -y install pcre-devel zlib-devel gcc-c++   ### 依賴環境裝一下
[root@localhost ~]# useradd -M -s /sbin/nologin nginx       #### 建立賬戶
[root@localhost ~]# cd /opt
[root@localhost ~]# tar zxvf nginx-1.12.2.tar.gz
[root@localhost ~]# cd nginx-1.12.2
[root@localhost nginx-1.12.2]# 
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx

[root@localhost nginx-1.12.2]# make && make install   ###編譯安裝

[root@localhost nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@localhost nginx-1.12.2]# nginx                 ### 啟動nginx
[root@localhost nginx-1.12.2]# netstat -anutp |grep nginx        ### 檢視啟動情況
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      21135/nginx: master 

■啟動、 停止 Nginx
[root@localhost nginx-1.12.2]# killall -3 nginx        ###停止服務    -1是安全重新啟動
如果出現: -bash: killall: command not found

[root@localhost nginx-1.12.2]#  yum -y install psmisc    ###如果出現上面報錯就代表沒有安裝killall功能,yum安裝一下
[root@localhost nginx-1.12.2]# killall -3 nginx    ###然後停止nginx服務
[root@localhost nginx-1.12.2]# nginx -t                 ###對組態檔檢查一下
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

■新增 Nginx 系統服務
[root@localhost ~]# vim /lib/systemd/system/nginx.service  ###注意目錄別進錯了
[Unit]
Description=nginx                                                 ####描述
After=network.target                                            ####描述服務類別
[Service]
Type=forking                                                          ####後臺執行形式
PIDFile=/usr/local/nginx/logs/nginx.pid                ####PID 檔案位置
ExecStart=/usr/local/nginx/sbin/nginx                  ####啟動服務
ExecReload=/usr/bin/kill -s HUP $MAINPID         ####根據 PID 過載設定
ExecStop=/usr/bin/kill -s QUIT $MAINPID           ####根據 PID 終止程序
PrivateTmp=true
[Install]
WantedBy=multi-user.target

################下面是刷的#############
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking 
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/bin/kill -s HUP $MAINPID
ExecStop=/usr/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

[root@localhost nginx-1.12.2]# systemctl start nginx       ### 啟動nginx
[root@localhost nginx-1.12.2]# systemctl enable nginx    ### 開機自啟nginx
[root@localhost nginx-1.12.2]# chmod 754 /lib/systemd/system/nginx.service   ### 許可權也要給一下

[root@localhost nginx-1.12.2]# yum -y install nfs-utils  ### 把nfs裝一下,有的已經裝了的就不用裝了
[root@localhost nginx-1.12.2]# showmount -e 192.168.100.24    ###測試一下

[root@localhost ~]# mount 192.168.100.24:/opt/51xit    /usr/local/nginx/html/  ###臨時掛載,可以直接永久掛載

[root@localhost ~]# vi /etc/fstab             ###編輯永久掛載
192.168.100.24:/opt/52xit/ /usr/local/nginx/html/    nfs    defaults,_netdev 0 0        ###開機自動掛載,注意格式對齊
[root@localhost nginx-1.12.2]# init 6  ###重新啟動伺服器
[root@localhost nginx-1.12.2]# systemctl restart nginx       ###重新啟動nginx
#####設定Haproxy 伺服器  192.168.100.21  #####
1、編譯安裝 Haproxy  
上傳 haproxy-1.4.24.tar.gz 到/opt目錄下
[root@localhost ~]# yum -y install pcre-devel bzip2-devel gcc gcc-c++
[root@localhost ~]# cd /opt
[root@localhost opt]# tar xzvf haproxy-1.4.24.tar.gz 
[root@localhost opt]# cd haproxy-1.4.24/
[root@localhost haproxy-1.4.24]# make TARGET=linux26
[root@localhost haproxy-1.4.24]# make install

2、設定Haproxy 服務
[root@localhost haproxy-1.4.24]# mkdir /etc/haproxy
[root@localhost haproxy-1.4.24]# cp examples/haproxy.cfg /etc/haproxy/
[root@localhost haproxy-1.4.24]# vi /etc/haproxy/haproxy.cfg 
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  webcluster 0.0.0.0:80
        option httpchk GET /index.html
        balance roundrobin
        server inst1 192.168.100.22:80 check inter 2000 fall 3
        server inst2 192.168.100.23:80 check inter 2000 fall 3



[root@localhost haproxy-1.4.24]# cp examples/haproxy.init /etc/init.d/haproxy   ###拷貝一下
[root@localhost haproxy-1.4.24]# chmod 755 /etc/init.d/haproxy   ###給許可權
[root@localhost haproxy-1.4.24]# chkconfig --add haproxy   ###把這個服務加到系統裡
[root@localhost haproxy-1.4.24]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy   ###建立軟連線
[root@localhost haproxy-1.4.24]# service haproxy start  ###啟動一下
[root@localhost haproxy-1.4.24]# systemctl stop haproxy.service   ###另一種啟動方法 先關閉
[root@localhost haproxy-1.4.24]# systemctl start haproxy.service    ###另一種啟動方法 在啟動
##########測試網站#######
瀏覽器輸入192.168.100.21    重新整理會發現來回切換兩個網站頁面,說明已經實現了負載均衡

注意:不要用7.4版本的做儲存伺服器,會出現bug不能共用!!!