文章目錄
前言
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左右