簡述:
Haproxy是目前比較流行的一種羣集調度工具,同類羣集調度工具還有很多,比如,LVS和Nginx。相比較而言,LVS性能最好,但是搭建相對複雜,Nginx的upstream模塊支持羣集功能,但是對羣集節點健康檢查功能並不強,性能也不及Haproxy好。
前置知識點
1.http請求
通過URL訪問網站使用協議是http協議,一般稱爲http請求。http的請求分爲CET和post方式,使用瀏覽器訪問某一個URL,會根據請求URL返回狀態碼,通常正常是的狀態碼是:2 X X、3 XX(比如201、301),如果出現異常就會返回4 X X、5 XX(比如401、501)
2.負載均衡常用調度算法
1)RR(Round Robin輪詢):RR算法是最簡單常用的算法,即輪詢調度。(如:有三個節點分別是a,b,c。第一個用戶訪問會指派到a,第二個用戶訪問指派到b,第三個用戶訪問會指派到c,第四個用戶訪問會繼續指派到節點a,這就是輪詢算法。)此算法還有一種加權輪詢,即根據每個節點的權重輪詢分配訪問請求。
2)LC(Least Connections最小連接算法):即最小連接數算法,根據後端的節點連接數大小動態分配前端請求。(如:各節點的連接數爲a:4,b:5,c6,現在有用戶訪問請求連接,會分配到最少連接數的節點上去,也就是a節點,以此類推)每次新的請求分配給連接數最少的客戶端。由於實際情況中,各個節點的連接數對動態釋放,很難出現一樣連接數的情況,因此此算法相比較rr算法有很大的改進,是目前用到最多的一種算法。
3)SH(Source Hashing基於來源訪問調度算法):即基於來源訪問調度算法,此算法用於一些有Session會話記錄在服務器端的場景,可以基於來源的IP、Cookie等做羣集調度。(如:有三個節點分別爲:a,b,c,第一個用戶訪問會指派到a,第二個用戶會指派到b,當第一個用戶第二次訪問還是會指派到a,只要負載均衡服務器不重啓,第一個用戶訪問都回指派到a)此算法的好處就是實現會話保持,但某些IP訪問量非常大時會引起負載不均衡,部分節點訪問量大,影響業務使用。
3.常見的Web羣集調度器
目前最常見的Web羣集調度器分爲軟件和硬件;軟件通常使用開源的LVS、Haproxy、Nginx;硬件一般使用比較多的是F5,也有很多人使用國內的一些產品。如梭子魚、綠盟等。
案例環境拓補圖
實施過程
1.安裝Nginx服務器
1)搭建Nginx1
[root@localhost ~]# yum -y install pcre-devel zlib-devel //安裝依賴包
[root@localhost ~]# useradd -s /sbin/nologin nginx
[root@localhost 桌面]# tar zxf nginx-1.12.0.tar.gz
[root@localhost 桌面]# cd /usr/src/nginx-1.12.0/
[root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
[root@localhost ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@localhost ~]# nginx -t
[root@localhost ~]# echo "192.168.1.10" > /usr/local/nginx/html/index.html //首頁
[root@localhost ~]# nginx //開啓服務
默認安裝路徑:/usr/local/nginx
默認日至路徑:/usr/local/nginx/logs
默認web目錄:/usr/local/nginx/html
測試Nginx1:
2.搭建Nginx2
參考搭建Nginx1
測試Nginx2
3.編譯安裝haproxy
[root@localhost ~]# yum -y install pcre-devel bzip2-devel
[root@localhost Desktop]# tar zxf haproxy-1.5.19.tar.gz -C /usr/src/
[root@localhost Desktop]# cd /usr/src/haproxy-1.5.19/
[root@localhost haproxy-1.5.19]# make TARGET=linux26 && make install //64位系統
3.haproxy服務配置
1)建立haproxy配置文件
[root@localhost ~]# mkdir /etc/haproxy //創建配置文件目錄
[root@localhost ~]# cd /usr/src/haproxy-1.5.19/
[root@localhost haproxy-1.5.19]# cp examples/haproxy.cfg /etc/haproxy/
//將haproxy.cfg文件複製到配置文件目錄
2)Haproxy配置項介紹
Haproxy配置文件分爲三個部分,global,defaults和,listen 。global爲全局配置,defaults爲默認配置,listen爲應用組件配置
①global配置參數
global
log 127.0.0.1 local0 //配置日誌記錄,local0爲日誌設備,默認存放到系統日誌
log 127.0.0.1 local1 notice //notice爲日誌級別,通常有24個級別
#log loghost local0 info
maxconn 4096 //最大連接數
#chroot /usr/share/haproxy
uid 99 //用戶UID
gid 99 //用戶GID
daemon
②defaults一般會被應用組件繼承,如果在應用組件中沒有特別聲明,將安裝默認配置參數設置
defaults
log global //定義日誌爲global配置中的日誌定義
mode http //模式爲http
option httplog //採用http日誌格式記錄日誌
option dontlognull
retries 3 //檢查節點服務器失敗次數,連續達到三次失敗,則認爲節點不可用
redispatch //當服務器負載很高時,自動結束當前隊列處理比較久的連接
maxconn 2000 //最大連接數
contimeout 5000 //連接超時時間
clitimeout 50000 //客戶端超時時間
srvtimeout 50000 //服務器超時時間
③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 //定義備份節點
3)根據目前的羣集設計,將haproxy.cfg配置文件內容修改如下:
global
log /dev/log local0 info
log /dev/log local0 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 webserver 0.0.0.0:80
option httpchk GET /index.html
balance roundrobin
server inst1 192.168.1.10:80 check inter 2000 fall 3
server inst2 192.168.1.20:80 check inter 2000 fall 3
4.創建自啓動腳本
[root@localhost ~]# cd /usr/src/haproxy-1.5.19/
[root@localhost haproxy-1.5.19]# cp examples/haproxy.init /etc/init.d/haproxy
[root@localhost haproxy-1.5.19]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
[root@localhost haproxy-1.5.19]# chmod +x /etc/init.d/haproxy
[root@localhost haproxy-1.5.19]# chkconfig --add /etc/init.d/haproxy
[root@localhost haproxy-1.5.19]# /etc/init.d/haproxy start
Starting haproxy (via systemctl): [ OK ]
[root@localhost ~]# systemctl stop firewalld
5.測試
刷新幾下
6.haproxy日誌
Haproxy的日誌默認輸出到系統的syslog中,查看起來非常不方便,爲了更好的管理Haproxy的日誌信息,我們在生產環境中一般單獨定義出來
1)修改關於日誌配置的選項修改如下:
log /dev/log local0 info
log /dev/log local0 notice
2)添加下面代碼
[root@localhost ~]# vim /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info') then -/var/log/haproxy/haproxy-info.log
& ~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice') then -/var/log/haproxy/haproxy-notice.log
& ~
[root@localhost ~]# systemctl restart rsyslog.service
[root@localhost ~]# /etc/init.d/haproxy restart
3)查看日誌
[root@localhost ~]# cat /var/log/haproxy/haproxy-info.log
Jan 3 10:43:20 localhost haproxy: /etc/rc.d/init.d/haproxy: line 26: [: =: unary operator expected
Jan 3 10:43:20 localhost haproxy: Shutting down haproxy: [ OK ]
Jan 3 10:43:20 localhost haproxy: /etc/rc.d/init.d/haproxy: line 26: [: =: unary operator expected
Jan 3 10:43:20 localhost haproxy: Starting haproxy: [WARNING] 002/104320 (42612) : parsing [/etc/haproxy/haproxy.cfg:19]: keyword 'redispatch' is deprecated in favor of 'option redispatch', and will not be supported by future versions.
Jan 3 10:43:20 localhost haproxy: [WARNING] 002/104320 (42612) : parsing [/etc/haproxy/haproxy.cfg:21] : the 'contimeout' directive is now deprecated in favor of 'timeout connect', and will not be supported in future versions.
Jan 3 10:43:20 localhost haproxy: [WARNING] 002/104320 (42612) : parsing [/etc/haproxy/haproxy.cfg:22] : the 'clitimeout' directive is now deprecated in favor of 'timeout client', and will not be supported in future versions.
Jan 3 10:43:20 localhost haproxy: [WARNING] 002/104320 (42612) : parsing [/etc/haproxy/haproxy.cfg:23] : the 'srvtimeout' directive is now deprecated in favor of 'timeout server', and will not be supported in future versions.
Jan 3 10:43:20 localhost haproxy: [ OK ]