使用Haproxy與nginx配合搭建web群集

八橘子發表於2020-11-10

1,常見的web叢集排程器

  • 目前常見的web叢集排程器分為軟體和硬體
  • 軟體通常使用開源lvs,haproxy,nginx
  • 硬體一般使用比較多的是f5,也有很多人使用國內的一些產品,如梭子魚,綠盟等

三款比較:

  • lvs在企業應用中抗負載能力很強,但存在不足
    • LVS不支援正則處理,不能實現動靜分離
    • 對於大型網站,LVS的實施配置複雜,維護成本相對較高
  • Haproxy是一款可提供高可用性,負載均衡,及基於TCP和HTTP應用的代理軟體
    • 適用於負載大的web站點
    • 執行在硬體上可支援數以萬計的併發連線的連線請求

2,Haproxy排程演算法原理

(1) Haproxy支援多種排程演算法,最常用的有三種
  • 第一種:RR
    + RR演算法是最簡單最常用的一種演算法,即輪詢排程

  • 理解舉例

    • 有三個節點a,b,c
    • 第一個使用者訪問會被指派到節點A
    • 第二個使用者訪問會被指派到節點B
    • 第三個使用者訪問會被指派到節點C
    • 第四個使用者訪問繼續指派到節點A,輪詢分配訪問請求實現負載均衡效果
  • 第二種: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的連線數會動態釋放,很難會出現一樣連線數的情況
    • 此演算法相比較rr演算法有很大改進,是目前用到比較多的一種演算法
  • 第三種:SH

    • 基於來源訪問排程演算法,用於一些有Session會話記錄在伺服器端的場景, 可以基於來源的IP、Cookie等做叢集排程
  • 理解舉例

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

3,案例:使用haproxy搭建web群集

(1)Nginx的安裝與啟動

  • 在兩臺網站伺服器上安裝nginx,並啟動服務
    • 使用原始碼編譯的方式進行安裝
    • 關閉firewalld防火牆
    • 安裝基礎軟體包
    • 增加系統使用者賬號nginx
    • 編譯安裝nginx並啟動
  • 在兩臺nginx上配置測試網站,注意測試網頁的內容應該不同,以便進行測試

(2)haproxy安裝與啟動

  • 在負載均衡器上安裝haproxy
  • 安裝步驟
    • 安裝基礎軟體包
    • 編譯安裝haproxy
    • 要注意作業系統版本,是32位系統還是64位
  • 建立haproxy的配置檔案
    • 建立配置檔案目錄 /etc/haproxy
    • 將原始碼包提供的配置檔案樣例haproxy.cfg複製到配置檔案目錄中

(3)haproxy配置檔案詳解

3.1 haproxy配置檔案通常分為三個部分
  • global:為全域性配置
  • defaults:為預設配置
  • listen:為應用元件配置
  • global配置引數
引數說明
log 127.0.0.1 local0配置日誌記錄,local0為日誌裝置,預設存放到系統日誌
log 127.0.0.1 local noticenotice為日誌級別,通常有24各級別
maxconn 4096最大連線數
uid 99使用者 uid
gid 99使用者 gid
3.2 defaults配置項配置預設引數,一般會被應用元件繼承
3.3 如果應用組建中沒有特別宣告,將按預設配置引數設定
  • log global:定義日誌為global配置彙總的日誌定義
  • mode http: 模式為http
  • option httplog:採用http日誌格式記錄日誌
  • retries 3:檢查節點伺服器失敗連續達到三次則認為節點不可用
  • maxconn 2000:最大連線數
  • contimeout 5000:連線超時時間
  • clitimeout 50000:客戶端超時時間
  • clitimeout 50000:客戶端超時時間
3.4 listen配置專案一般為配置應用模組引數
  • 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 fall 3: 定義在節點
  • server inst1 192.168.114.56:80 check inter 2000 fall 3 backup:定義線上節點
  • server inst2192.168.114.56:81 check inter 2000 fall 3backup:定義備份節點

(4)配置與測試

  • 根據實際的案例修改相應的引數

    • listen webcluster 0.0.0.0:80
    • option httpchk GET/index.htmi
    • option httpchk GET/index.htmi
    • server inst1 192.168.10.61:80 check inter 2000 fall 3
    • server inst2192.168.10.62:80 check inter 2000 fall 3
  • 建立自啟動指令碼,並啟動Haproxy服務

  • 測試haproxy叢集

    • 測試高效能

      • 可在兩個不同的瀏覽器中分別訪問兩個測試網站,正常情況下應該出現兩個網站的測試頁面
    • 高可用性

      • 將其中一臺nginx伺服器停用,在客戶端瀏覽器中訪問haproxy,正常情況下應出現另外一臺nginx伺服器的網站測試頁面

      (5)haproxy日誌管理

    • 預設是輸出到系統中的syslog中,生產環境中一般單獨定義
    • 定義的方法步驟
      • 修改Haproxy配置檔案中關於日誌配置的選項,加入配置
        • log ldev/log local0 info
        • log ldevlog local0 notice
    • 修改rsyslog配置,將Haproxy相關的配置獨立定義到haproxy.conf,並放到/etc/rsyslog.d/下
    • 儲存配置檔案並重啟rsyslog服務,完成rsyslog配置
    • 訪問Haproxy叢集測試網頁並檢視日誌資訊

    (haproxy)引數優化

    • ·隨著企業網站負載增加,haproxy引數優化相當重要
      • maxconn:最大連線數,根據應用實際情況進行調整,推薦使用10 240

      • daemon:守護程式模式,Haproxy可以使用非守護程式模式啟動,建議使用守護程式模式啟動

      • nbproc:負載均衡的併發程式數,建議與當前伺服器CPU核數相等或為其2倍

        • retries:重試次數,主要用於對叢集節點的檢查,如果節點多,且併發量大,設定為2次或3次
      • .option http-server-close:主動關閉http請求選項,建議在生產環境中使用此選項

      • timeout http-keep-alive:長連線超時時間,設定長連線超時時間,可以設定為10s

      • timeout http-request: http請求超時時間,建議將此時間設定為5~10s,增加http連線釋放速度

      • timeout client:客戶端超時時間,如果訪問量過大,節點響應慢,可以將此時間設定短一些,建議設定為1min左右就可以了

4. Haproxy案例實施搭建過程

主機要求
  • 用1臺客戶端,三臺虛擬伺服器搭建一套web叢集
  • 虛擬機器安裝centos 7.4 64位系統
主機作業系統IP地址主要軟體
haproxy伺服器centos7.4 x86_6420.0.0.30haproxy
nginx伺服器1centos7.3 x86_6420.0.0.20nginx
nginx伺服器2centos7.4 x86_6420.0.0.10nginx
客戶端centos7.4 x86_6420.0.0.50瀏覽器
  • nginx伺服器1
yum -y install gcc gcc-c++ pcre-devel zlib-devel
useradd -M -s /sbin/nologin nginx    //新增系統賬號
tar zxf nginx-1.12.2.tar.gz
cd nginx-1.12.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/   //優化命令路徑
nginx    //啟動服務
nginx -t    //檢查配置檔案和語法狀態
echo "web1" > /usr/local/nginx/html/index.html

  • nginx伺服器2部署與1部署基本相同,不同點在於在設定測試網頁內容的時候應該設定為不同

Haproxy伺服器

yum -y install pcre-devel bzip2-devel make 
tar zxf haproxy-1.4.24.tar.gz 
cd haproxy-1.4.24/ 
make TARGET=linux26 
make install 
mkdir /etc/haproxy
cp examples/haproxy.cfg /etc/haproxy/
vi /etc/haproxy/haproxy.cfg 
# this config needs haproxy-1.1.28 or haproxy-1.2.1
global   
        log /dev/log    local0 info     #配置日誌記錄,local0為日誌裝置,預設存放到系統日誌
        log /dev/log    local0 notice   #日誌級別為 info、notice
        #log loghost    local0 info
        maxconn 4096                    #最大連線數
        #chroot /usr/share/haproxy  #註釋掉,不讓伺服器從自己的目錄獲取,而從節點伺服器
        uid 99
        gid 99
        daemon
        #debug
        #quiet
defaults
        log     global   #定義日誌為global中的日誌
        mode    http    #模式為http
        option  httplog   #採用http格式記錄日誌
        option  dontlognull
        retries 3   #檢查節點伺服器失敗三次後,判定節點不可用
        #redispatch
        maxconn 2000    #最大連線數
        contimeout      5000    #連線超時時間
        clitimeout      50000   #客戶端超時時間
        srvtimeout      50000    #伺服器超時時間
listen webcluster 0.0.0.0:80    #當有訪問80埠的請求則進行
  # option httpchk GET /index.html   #獲取web伺服器池中伺服器的index.html檔案
    balance roundrobin          #定義採用輪詢演算法
    server web1 20.0.0.10:80 check inter 2000 fall 3   #定義線上節點伺服器
    server web2  20.0.0.20:80 check inter 2000 fall 3

注意: 配置檔案主要改的是
註釋掉下面兩個
#chroot /usr/share/haproxy #註釋掉,不讓伺服器從自己的目錄獲取,而從節點伺服器
和
#redispatch
並且刪除所有監聽listen
增加
listen webcluster 0.0.0.0:80
        option httpchk GET /index.html
        balance roundrobin
        server web1 20.0.0.10:80 check inter 2000 fall 3
        server web2 20.0.0.20:80 check inter 2000 fall 3
cp examples/haproxy.init /etc/init.d/haproxy
vi /etc/init.d/haproxy 
# chkconfig: - 85 15  #改為35
chmod 755 /etc/init.d/haproxy 
chkconfig --add /etc/init.d/haproxy 
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
haproxy-1.4.24]# service haproxy start 
systemctl enable haproxy


  • 最後進行測試
    在win10上與Linux下分別測排程伺服器出現兩個網頁內容,說明配置成功
    在這裡插入圖片描述
    在這裡插入圖片描述

相關文章