使用Haproxy搭建Web羣集的方法

常見的 Web集羣調度器

目前常見的 Web 集羣調度器分爲軟件和硬件,軟件一般使用開源的LVS、Haproxy、Nginx,硬件通常使用比較多的是 F5,也有不少人使用國內的一些產品,如梭子魚、綠盟等

Haproxy應用分析

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

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

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

特別適用於負載特別大的Web站點
運行在當前的硬件上可支持數以萬計的併發鏈接鏈接請求

Haproxy 調度算法原理

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 配置文件詳解

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 日誌管理

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優化參數

隨着企業網站負載增長,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

第一步:搭建 Haproxy調度服務器

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

第二步:搭建Nginx服務器

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搭建Web羣集採用輪詢機制


配置haproxy日誌

#重啓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 "

謝謝閱讀!!!

相關文章
相關標籤/搜索