Linux架構----Haproxy與Nginx羣集

前言

HAProxy是一個使用C語言編寫的自由及開放源代碼軟件,其提供高可用性、負載均衡,以及基於TCP和HTTP的應用程序代理。

HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。

HAProxy實現了一種事件驅動, 單一進程模型,此模型支持非常大的併發連接數。多進程或多線程模型受內存限制 、系統調度器限制以及無處不在的鎖限制,很少能處理數千併發連接。事件驅動模型因爲在有更好的資源和時間管理的用戶空間(User-Space) 實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程序通常擴展性較差。這就是爲什麼他們必須進行優化以 使每個CPU時間片(Cycle)做更多的工作。

包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter和 Tuenti在內的知名網站,及亞馬遜網絡服務系統都使用了HAProxy。

一、Haproxy 簡介

1.1 常見Web羣集調度器
  • 目前常見的Web集羣調度器分爲軟件和硬件,軟件通常使用開源的LVS、Haproxy、Nginx,硬件一般使用比較多的是F5(負載均衡產品),如梭子魚、綠盟等
1.2 Haproxy應用分析
  • LVS在企業應用中抗負載均衡能力很強,但存在不足
    • LVS不支持正則處理(因爲是應用層),不能實現動靜分離
    • 對於大型網站,LVS的實施配置複雜,維護成本相對較高
  • Haproxy是一塊可提供高可用性、負載均衡及基於TCP和HTTP應用的代理軟件
    • 特別適合於負載特別大的Web站點(可以承受高併發,可與Nginx配合)
    • 運行在當前的硬件上可支持數以萬計的併發連接請求
1.3 Haproxy調度算法
  • Haproxy 支持多種調度算法,最常用的有三種:RR(Round Robin)、LC(Least Connections),SH(Source Hashing)
1.3.1 RR(Round Robin)
  • RR算法是最簡單最常用的一種算法,即輪詢調度
  • 示例
    • 有三個節點A、B、C,第一個用戶訪問會被指派到節點A,第二個用戶訪問會被指派到節點B,第三個用戶當問會被指派到節點C,此爲一輪
    • 第四個用戶訪問會繼續指派到節點A,輪詢分配訪問請求實現了負載均衡的效果
1.3.2 LC(Least Connections)
  • 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算法而言有很大的改進,是目前使用比較多的算法
1.3.3 SH(Sourve Hashing)
  • SH 即基於來源訪問的調度算法,此算法大用於一些有Session會話記錄在服務器端的場景,可以基於來源的IP、Cookie等做集羣調度
  • 示例:
    • 有三個節點A、B、C,第一個用戶第一次訪問被指派到了A,第二個用戶第一次訪問被指派到了B
    • 當地一個用戶第二次訪問時會被直接指派到A,同理第二個用戶二次訪問會被直接指派到B,只要負載均衡調度器不重啓,第一個用戶訪問都會被指派到A,第二個用戶訪問都會被指派到B,實現集羣的調度
    • 此調度算法的好處是實現會話保持,但某些IP訪問量非常大時會引起負載不均衡,部分節點訪問量過大,會影響業務使用

二、Haproxy 集羣部署實驗

2.1 實驗拓撲圖

在這裏插入圖片描述

2.2 實驗環境
  • 準備三臺centos7虛擬機

  • ① Nginx節點1 IP地址:192.168.226.132

    軟件包

    • Nginx-1.12.2.tar.gz
  • ② Nginx節點2 IP地址:192.168.226.133

    軟件包

    • Nginx-1.12.2.tar.gz
  • ③ Haproxy調度器:IP地址:192.168.226.128

    軟件包

    • haproxy-1.5.19.tar.gz
2.3 環境部署
  • 修改主機名便於識別
hostnamectl set-hostname haproxy
su

hostnamectl set-hostname nginx1
su

hostnamectl set-hostname nginx2
su
  • 關閉三臺服務器防火牆和增強性安全功能
systemctl stop firewalld
setenforce 0
2.4 配置Nginx服務器
2.4.1 Nginx1服務器配置
  • 安裝環境依賴包
[root@nginx1 ~]# yum install -y gcc gcc-c++ pcre-devel zlib-devel make
  • 編譯安裝Nginx
#創建程序用戶
[root@nginx1 ~]# useradd -M -s /sbin/nologin nginx

[root@nginx1 ~]# mount.cifs //192.168.226.1/LAMP-C7 /mnt
Password for root@//192.168.226.1/LAMP-C7: 
[root@nginx1 ~]# cd /mnt
[root@nginx1 mnt]# tar zxvf nginx-1.12.2.tar.gz -C /opt
[root@nginx1 mnt]# 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
.....省略部分內容
  • 編輯站點目錄
[root@nginx1 nginx-1.12.2]# cd /usr/local/nginx/html/
[root@nginx1 html]# ls
50x.html  index.html  xiaomao.jpg
[root@nginx1 html]# vim test.html
<h1>wellcome to nginx ~~~</h1>
<img height=300 src="xiaomao.jpg"/>
------>wq
  • 創建軟鏈接、檢查語法
[root@nginx1 html]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin

#檢查語法
[root@nginx1 html]# 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
  • 開啓服務
[root@nginx1 html]# nginx
[root@nginx1 html]# netstat -natp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      38436/nginx: master 
  • 使用主機訪問頁面測試
    在這裏插入圖片描述
2.4.2 Nginx2服務器配置
  • Nginx2與Nginx1的配置相同,只有站點不同,這裏就省略步驟,直接展示訪問頁面啦~
    在這裏插入圖片描述
2.5 配置haproxy調度服務器
  • 安裝依賴環境
[root@haproxy ~]# yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
  • haproxy編譯安裝
[root@haproxy ~]# mount.cifs //192.168.226.1/LAMP-C7 /mnt
Password for root@//192.168.226.1/LAMP-C7:  
[root@haproxy ~]# cd /mnt
[root@haproxy mnt]# tar zxvf haproxy-1.5.19.tar.gz -C /opt
.....省略部分內容
[root@haproxy mnt]# cd /opthaproxy-1.5.19/
#64位系統
[root@haproxy haproxy-1.5.19]# make TARGET=linux26
[root@haproxy haproxy-1.5.19]# make install
......省略部分內容
  • 創建工作目錄、複製模板、編輯配置文件
#創建工作目錄
[root@haproxy haproxy-1.5.19]# mkdir /etc/haproxy

#複製模板到工作目錄
[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
#27行以下刪除,我們自己添加內容
# this config needs haproxy-1.1.28 or haproxy-1.2.1

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  					#監聽任意網段80端口的IP地址
        option httpchk GET /test.html			#使用展現test.html內容的提交方式
        balance roundrobin						#使用輪詢機制(RR)
        server inst1 192.168.226.132:80 check inter 2000 fall 3
        server inst2 192.168.226.133:80 check inter 2000 fall 3
#輪詢調度對象爲Nginx1和Nginx2兩個服務器,設置2000毫秒一次健康檢查,如過三次健康檢查失敗,調度服務器則不會再將請求發給該服務器
-----》wq
  • 配置服務控制方式(service管理)
[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 init.d]# service haproxy start
Starting haproxy (via systemctl):                          [  確定  ]
[root@haproxy init.d]# netstat -natp | grep haproxy 
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      127962/haproxy  
  • haproxy配置文件詳解

    haproxy配置文件一般分爲三個部分

    • global:全局配置(在整個服務器都生效)
    • defaults:默認配置
    • listen:應用組件配置
  • global 全局配置:作用範圍爲整個服務器端

    • log127.0.0.1 lcal0:配置日誌記錄,local0爲日誌設備,默認存放到系統日誌
    • log127.0.0.1 loca1 notice:notice爲日誌級別,通常有24個級別
    • maxconn4096:最大連接數
    • uid 99:用戶uid
    • gid 99:用戶gid
  • defaults 默認配置:一般會被應用組件繼承。如果在應用組件中沒有特別聲明,將安裝默認配置參數設置

    • log global:定義日誌爲global配置中的日誌定義
    • mode http:模式爲http
    • option httplog:採用http日誌格式記錄日誌
    • retries 3:檢查節點服務器失敗連續達到三次則認爲節點不可用
    • maxconn2000:最大連接數
    • contimeout5000:連接超時時間
    • clitimeout50000:客戶端超時時間
    • srvtimeout50000:服務器超時時間
  • 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 inst2 192.168 114.56:81 check inter 2000 fall 3 backup:定義備份節點
  • 訪問Haproxy服務器web頁面,刷新後會以輪詢的方式展現Nginx1和Nginx2的頁面,如下
    在這裏插入圖片描述

在這裏插入圖片描述

三、Haproxy日誌管理

  • Haproxy的日誌默認是輸出到syslog中的,在生產環境中一般單獨定義出來

  • 定義的過程:

    ① 修改Haproxy配置文件中關於日誌配置的選項,加入配置

    • log /dev/log local0 info
    • log /dev/log local0 notice

    ② 修改rsyslog配置,將Haproxy相關的配置獨立定義到

    • haproxy.conf,並放到/etc/rsyslog.d/目錄下
  • 保存配置文件並重啓rsyslog服務,完成rsyslog配置,如下:

[root@haproxy haproxy]# vim haproxy.cfg 
#在全局設置中設置日誌配置項
global
        log /dev/log    local0 info
        log /dev/log    local1 notice
------》wq
[root@haproxy haproxy]# service haproxy restart
Restarting haproxy (via systemctl):                        [  確定  ]  

#創建新的haproxy配置文件
[root@haproxy haproxy]# touch /etc/rsyslog.d/haproxy.conf
#編寫haproxy配置文件腳本
[root@haproxy haproxy]# vim /etc/rsyslog.d/haproxy.conf 
if ($programname == 'haproxy' and $syslogserverity-text == 'info')
        then -/var/log/haproxy/haproxy-info.log
&~
if ($programname == 'haproxy' and $syslogserverity-text == 'notice')
        then -/var/log/haproxy/haproxy-notice.log
&~
------>wq
#重啓日誌服務
[root@haproxy haproxy]# systemctl restart rsyslog.service 
  • 訪問站點,查看日誌
#訪問網頁後纔會產生haproxy文件
[root@haproxy haproxy]# cd /var/log
[root@haproxy log]# ls
haproxy
[root@haproxy log]# cd haproxy
[root@haproxy log]# cat haproxy-info.log
#可以看到來訪的信息

總結

  • 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左右

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章