HAProxy概述與配置
一、HAProxy概述
HAProxy是由 WillyTarreau開發的一款具備高可用性、負載均及基於 TCP和 HTTP的應用代理開源軟件,基於HAProxy的負載均衡架構是最為常見的免費、快速且具備可靠性的集群負載均衡架構解決方案。此外,HAProxy特別適合應用於需要會話保持或七層處理的高負載 web站點,就當前常見硬件體系架構,基於HAProxy的負載均衡系統完全可以支撐數以萬計的並發連接.同時,HAProxy的運行模式使其整合到用戶當前的基礎架構中是個非常簡單且安全的過程。通過 HAProxy的代理,還可以避免用戶的 Web服務器直接暴露到外部網絡中。
HAProxy實現的是一種事件驅動、單一進程的架構模型,此類模型的優點在於能夠支撐高並發大規模的連接。反之,多進程或多線程模型受內存和系統調度器的限制以及無處不在的鎖限制,很難應對數以萬計的高並發連接。HAProxy支持連接拒絕,通過拒絕連接,可以限制某些非法或有意的攻擊型連接,從而降低其對網站帶來的危害。的這一功能已成為目前應對小型 DDOS攻擊的主要方法之一,並且其他負載均衡器很難做到這點。此外, HAProxy還支持全透明代理,即可以將客戶端地址或者任何指定地址直接連接到后端服務器,通過全透明代理,可以不用修改某些特殊服務器地址而使其直接接收並處理部分特定流量。
HAProxy主要為基於 HTTP和 TCP訪問的應用服務提供負載均衡,如基於 Internet的連接服務和基於 web的應用服務。通過負載均衡算法, HAproxy能夠接受數以萬計的訪問請求並將其轉發到后端服務器池中進行處理,而后端服務器池就如一個強大的虛擬服務器接受 HAProxy轉發的請求並進行處理。 HAproxy的請求調度器(Scheduler)決定了后端服務器中每個服務器接受和處理的請求量,在沒有權重的調度算法下,調度器為每台服務器分配相同數量的請求,而在加權調度算法下,調度器根據每台服務器的權重為每個后端服務器分配不同數量的請求。 HAProxy允許用戶自定義多個代理,並為每個代理提供負載均衡服務,代理由一個前端和一個或多個后端構成,前端定義了代理監聽的IP地址(Virtual IP )和端口,同時還需在前端定義中關聯與其相關的后端,而在HAProxy中,后端主要用於定義服務器池和負載均衡算法。HAProxy的負載均衡服務在7層,即應用層,在很多情況下,由於商業應用連續性的要求,管理員通常需要部署HAProxy,從而為基於HTTP的應用提供負載均衡和高可用性。
HAProxy的配置文件是/etc/haproxy/haproxy.cfg,該文件是 HAProxy功能配置的集中文件,其代理和負載均衡功能的配置均位於該配置文件中。 HAProxy的配置文件主要分為四個部分,即全局功能配置段、默認屬性配置段、前端代理配置段、后端負載均衡配置段,各個配置段常見屬性設置和功能描述如下。
1、全局配置段
全局配置段的參數將被應用到全部運行 HAProxy的節點中,全局配置段並不針對具體的代理和負載均衡進行設置,其需要配置的參數也相對簡單,典型的haproxy.cfg全局配置段內容如下:
global daemon maxconn 4000 Pidfile /var/run/HAproxy.pid user HAproxy group HAproxy stats socket /var/lib/HAproxy/stats log 127.0.0.1 ocal0
上述HAProxy的全局配置段中,用戶為HAProxy常用的全局變量配置了參數,這些參數通常是進程級別並與操作系統相關的參數,並在全局`限定了HAProxy的工作特性,幾個重要的參數解釋如下。
daemon:指定HAProxy以后台進程的形式運行。
group:運行 HAproxy的用戶屬組,此處為 HAproxy。
maxconn:HAProxy代理允許的最大並行連接數,此處為4000,默認為2000。
user:運行HAProxy的用戶,此處為 HAproxy。
pidfile:HAProxy的進程文件,此處為/var/run/haproxy.pid。
log:設置HAProxy運行日志的輸出設備,通常默認為本機的並默認記錄 INFO級別的日志,用戶可以將 HAProxy的日志輸出到本機或者遠程主機的日志設備上,並設置需要記錄的日志級別,如 ERROR和 WARN。
全局配置段需要注意 HAPrxoy的日志設備配置,對於大規模集群,負載均衡器可能會由運行 HAProxy的多個節點組成,如果每個 HAProxy節點都將日志存放到本地,則日志監控和查看極為不便,因此通常會借助遠程日志記錄功能(如 rsyslog)將分散的節點日志集中到某台日志服務器上,這時就需要在每個 HAProxy的全局配置段中指定遠程日志服務器的地址和對應的日志記錄設備,同時在遠程日志記錄服務器上進行相應的設置。在雲端日志服務器上開啟 rsyslog的 HAProxy日志記錄功能所需做的設置如下:
1、將/etc/rsyslog.onf中的如下兩行注釋取消 $M0dLoad imudp $UDPServerRun514
2、為HAProxy設置日志設備和輸出文件,這里定義的日志設備要與haproxy·cfg全局配置段中log參故設置的匹配,在/etc/rsyslog.conf中添加如下語句:
local0.* /var/log/haproxy/haproxy.log
在/etc/sysconfig/rsyslog中修改SYSLOGD_OPTIONS的值為如下:
SYSLOGD_OPTIONS="-r -m 0 -c 2"
3、分別重啟 rsyslog和 haproxy
systemctl restart rsyslog.server
systemctl restart haproxy.service
4、跟蹤 haproxy的日志
tail -f /var/10g/haproxy/haproxy.log
2、默認配置段
默認(default)配置段設置的參數會被haproxy.cfg的其他配置段繼承,如frontend、backend和 listen配置段都會繼承 default配置段參數,同時這些配置段也可以寫default配置段的參數值,通常情況下,用戶可以將具有共性的參數放到default段進行統一配置,然后再到各個配置段中進行個性修改,常見的 default配置段如下:
defaults mode http
log global
option httplog
option dontlognull
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
maxconn 10000 timeout client 1m timeout server 1m timeout check 10s
默認配置段主要配置參數的解釋如下:
mode:指定 HAProxy實例使用的連接協議,即源請求到后端服務器之間的連接協議,可能值為 HTTP和 TCP。對基於HTTP的 web應用服務,通常使用 HTTP模式,對於其他應用服務,通常使用 TCP模式。
log:指定日志地址和記錄日志條目的 syslog/rsyslog日志設備,此處的 global表示使用 global配置段中設定的log值。
option:日志記錄選項, httplog表示記錄與 HTTP會話相關的各種屬性值,包括 HTTP請求、會話狀態、連接數、源地址以及連接時間等。dontlognull表示不記錄空會話連接日志,
即 HAProxy不會記錄沒有數據傳輸的會話連接日志,基於互聯網的 web應用中不推薦使用dontlognull因為很多空會話連接可能包含有惡意行為,如惡意的端口漏洞掃描就是
一種沒有數據傳輸的空連接。 retries:在連接失敗后重新嘗試請求連接的次數,超過設置的嘗試次數將認為連接失敗。
timeout:設置各種請求、連接、響應的 Timeout時間,單位為秒(s)或者毫秒(m)。
HTTP-Request:等待客戶端完整 HTTP請求的時間,此處為等待10s。
queue:設置刪除連接和客戶端收到503或服務不可用等提示信息前的等待時間,此處等待時間為10毫秒。
connect:設置等待服務器連接成功的時間,此處為等待10s。
client:設置允許客戶端處於非活動狀態,即既不發送數據也不接收數據的時間,此處為1毫秒。
server:設置服務器超時時間,即允許服務器處於既不接收也不發送數據的非活動時間,此處為1毫秒。
3、Frontend配置
前端配置主要完成兩個功能:一是配置監聽客戶端請求的 IP地址和端口,在高可用環境下,此處的監聽 IP地址通常為虛擬 IP;二是將監聽到的客戶端請求轉發到指定的后端配置中進行負載均衡。典型的 HAProxy前端配置如下。
frontend WEB bind 192.168.0.10:80 default_backend app
HAProxy中允許配置多個前端,前端名稱可以自定義,此處設置了名為 web的HAProxy前端,通過bind參數指定該前端監聽的IP為192.168.0.10,端口為80,而該前端對應的后端名稱是app,一旦前端監聽到連接,就會將該連接直接轉給名為app的后端處理,前端與后端是HAProxy配置中的關鍵部分,通常前端負責監聽請求連接,后端負責負載均衡。在 openstack高可用集群配中,由於要為每個 openstack服務進行高可用配置,因此最佳做法就是將每個服務配置為一個前端和后端的組合,並將前端監聽的 VIP通過Pacemaker或者Keeplived進行高可用設計。基於HAProxy的Openstack高可用集群前端配置的例子為:
數據庫服務前端:
frontend vip-db bind 192.168.142.201:3306 timeout client 90m default—backend db-vms-Galera
qpid消息服務前端: froatend Vip-qpid bind192·168、142·215:5672 timeout client120s default—backend qpid-vms
dashboard服務前端: frontendvip—horizon bind192.168、142·211:80 timeout client180s cookie SERVERID insert indirect nocache default backend horizon-vms
4、 Backend配置
后端配置主要實現兩個主要功能:一是負載均衡調度算法的設置;二是設置最終響應請求的服務器池各個節點的IP地址和端口,並設置每個節點的健康檢查方式。一個典型的后端配置如下。
backend app balance roundrobin server appl 192.168.1.1:80 check server app2 192.168.1.2:80 check server app3 192.168.1.3:80 check inter 2s rise 4 fall 3 server app4 192.168.1.4:80 backup
HAProxy允許配置多個后端,並且每個后端都有一個前端與其對應,后端實例的名稱可以用戶自定義,但是一定要與對應前端中設置的后端名稱一致。上述后端配置中,后端實例的名稱是 app,采用 Round-Robin負載均衡算法,server行定義后端的真實服務器,服務器的名稱為app1、app2、app3和 app4,這里的服務器名稱並非真實的后端服務器主機名,而只是便於識別的自定義服務器名稱,服務器的具體地址通過緊隨其后的地址和端口號來確定。此外,在定義后端服務器的同時,通過check參數還可指定HAProxy對服務器的健康檢查方式,上述配置中,后端服務器app3中的inter 2s指定了對app3進行健康檢查的時間隔是2s,rise 4 表示 HAproxy對app3發起4次健康檢查均正常則認為app3正常,3表示連續3次健康檢查失敗則認為app3己經故障,HAproxy后端配置中指定了負載均衡所采用的算法, HAProxy支持多種負載均衡算法,用戶可以根據后端服務器池中各個節點的實際資源配置進行不同的算法選取, HAProxy支持的負載均衡算法有以下幾種。
Round-Robin(roundrobin):與Keeplived的Round-Robin類似,使用這種算法服務請求會被輪詢轉發到服務器池中的每一個服務器上,而不去評估服務器的‰負載和處理能力,服務器池中的每個節點都被輪詢轉發請求。
Static Round-Robin(static-rr):與 Round-Robin一樣輪詢轉發請求到每一個后端服務器,但是不允許對后端服務器進行動態加權設置,即服務器的權重是靜態固定的,而由於權重靜態固定,后端服務器池中的節點數目不受限。
Least-connection(leastconn):即最少連接數算法,與Keepalived的最少連接數算法類似,后端服務器活動連接數越多,則接收到的服務請求就越少,反之,則接收到的服務請求越多。
Source(source):該算法將請求中的源IP地址進行HASH后除以全部正常運行的后端服務器權重來決定接收服務請求的服務器,在這種算法中,同一個客戶端(相同的源 IP地址)發出的請求會被固定轉發給某一個固定的后端服務器。
但是,如果服務器權重大小發生改變或者服務器數目出現變動,則響應該客戶端請求的后端服務器會改變,因為這時的 HASH/Wight值已經改變。
URL(url):該算法將請求URL字符串進行HASH並除以全部正常運行的后端服務器權重來決定接收服務請求的服務器,在這種算法中,指向同一目標站點的服務請求會被固定轉發到相同的后端服務器上。URL也稱為基於目標地址
的HASH負載均衡算法,主要用於Web Cache集群中,通過URL負載均衡算法,可以避免請求因為指向不同的cache服務器而導致缺頁,而缺頁會導致刷新 cache最終降低系統響應速率。
URL Parameter(uri_param):該算法通過查詢源 HTTP請求報文中的某一字符串參數並將其進行 HASH后除以全部服務器權重來決定接收服務請求的服務器。如果HTTP報文中沒有需要的參數,則默認使用Round_Robin算法
Header Name(hdr):該算法通過查詢HTTP請求報文中的HEAD字段並將HASH后除以全部服務器權重來決定接收服務請求的服務器。如果報文中沒有HEAD參數,則默認使用Round_Robin算法。
在高可用集群配置中,為了實現服務的高可用,通常每個后端配置中都需要提供兩個以上的后端服務器進行負載均衡。
5、HAProxy監控頁面
HAProxy為每個監聽代理提供了實時監控,並可以將監控參數以 GUI頁而的形式呈現給用戶。要使用HAProxy的GUI頁面,需要在/etc/haproxy/haproxy.cfg配置文件中配置相應的監聽參數,通常需要配置一個Listen置段(也可以是 Frontend或 Backend配置段),即可通過 HTTP協議訪問HAProxy的監控頁面,最為常用的HAProxy監控頁面配置如下:
listen status #定義一個listen,也可以放在frontend或backend段中 mode http #使用協議 bind 192.168.142.110:8080 #監聽地址和端口 stats enable #啟用信息統計功能 stats hide-version #隱藏版本號 stats uri /HAproxy #訪問URL stats realm HAProxy\Statistics #登錄提示信息 stats auth admin:admin #admin界面,驗證成功后允許管理節點 stats refreah 10s #頁面刷新時間
HAProxy的監控頁面:
HAProxy的監控頁面將每項資源的監控參數以表格形式呈現給用戶,並將監控參划分為七個類別,即 Queue、Session rate、Sessions、Bytes、Denied、Errors、 Warning、server,每組參數類別下又有多個詳細參數,其中各個參數的解釋如下。
(1)Queue cur:表示當前隊列的請求數量。 Max:表是當前隊列最大的請求數量。 Limit:表示隊列的限制數量。 (2) Session rate Cur:每秒會話連接數量。 Max:每秒會話數量最大值。囗 Limit:每秒會話數量的限制值。 (3) Sessions Total:總共會話數量。 Cur:當前的會話數量。 Max:最大會話數量。 Limit;會話連接限制。 Lbtot:選中一台服務器所用的總時間。 Last:最后一次會話時間。 (4) Bytes In:網絡會話輸人字節數總量。 Out:網絡會話輸出字節數總量。 (5) Denied Req:被拒絕的會話請求數量。 Resp:拒絕回應的請求數量。 (6) Errors Req:錯誤的請求數量。 Conn:錯誤連接數量。 Resp:錯誤響應數量。
(7) Warnings Retr:重新嘗試連接的請求數量。 Redis:重新發送的請求數量。 (8) Server status:后端服務器狀態,可以有 UP和 DOWN兩種狀狀態。 LastChk:持續檢查后端服務器的時間。 Wght:服務器權重。 Act:活動后端服務器數量。 Bck:后端備份服務器的數量。 Down:狀態為 Down的后端服務器數量。 Downtime:服務器總的 Downtime時間。 Throttle:狀態 Backup變為 Active的服務器數量。
6、 HAProxy配置參考
作為一個專業的負載均衡代理軟件, HAProxy具有非常豐富的配置選項, HAProxy還有很多詳細功能配置項,為了滿足不同應用場景下用戶的 HAProxy配置參考,本節將會對 HAProxy配置文件 haproxy.cfg中各個配置段的配置參數,以及這些參數的功能作用進行解釋和總結,用戶可以根據自己的需求在相應配置段中進行參數取舍,HAProxy各個配置段示例如下。
1、全局配置段參考
global maxconn20000 #默認最大連接數 log $host_ip local0 #level為 err/warning/info/debug日志記錄設備 chroot /var/haproxy/ #chroot運行的路徑 uid 200 #HAProxy進程屬組UID gid 200 #HAproxy進程屬組 daemon #以后台形式運行HAProxy nbproc 2 #進程數量,可以設置多個進程提高性能 pidfile /var/run/haproxy.pid #HAProixy的pid存放路徑 ulimit-n 65535 #ulimit讓的數量限制
2、默認配置段參考
defaults log global #使用global定義的日志記錄設備 mode {tcp|http|health} #設置實例的運行模式或協議,當實現內容交換時,前端和后端,必須作在同一種模式 maxconn 20000 #最大連接數 option httplog #日志類別為http日志格式 option httpclose #每次請求完畢后主動關閉http通道 option dontlognull #不記錄健康檢查的日志信息 option forwardfor #允許在發往服務器的請求頭部中插入“X-Forwarded-For”頭部 option Redispath #serverid對應的服務器掛掉后,強制定向到其它健康的服務器 option abortonclose #允許結束掉當前隊列中一直pending的連接 stats refresh 30 #統計頁面刷新間隔 retries 3 #認為服務不可用的嘗試連接次數 balance roundrobin #默認的負載均衡的方式,這里為輪詢方式,也可以是balance source contimeout 5000 #連接超時 clitimeout 50000 #客戶端超時 srvtimeout 50000 #服務器超時 timeout check 2000 #心跳檢測超時
3、監控頁面配置段參考:
listen admin_status #對Frontend和Backend進行監控統計,監控組名稱可以自定義 mode http #使用協議 bind 192.168.142.110:8080 #監聽地址和端口 stats enable #啟用信息統計功能 stats hide-version #隱藏版本號 stats uri /HAproxy #訪問URL stats realm HAProxy\Statistics #登錄提示信息 stats auth admin:admin #admin界面,驗證成功后允許管理節點 stats refreah 10s #頁面刷新時間 #下面語句用於捕獲並將指定的請求/響應首部記錄到HAProxy的日志中,日志中記錄的是指定首部的值: capture request header host len 40 capture request header content-length len 10 capture request header referer len 200 capture request header server len 40 capture response header content-length len 10 capture response header cache-control len 8
4、 FrontEnd配置段參考:
FrontEnd配置段主要通過bind配置監聽的虛擬IP地址和端口,同時Frontend配置里面可以定義多個acl以進行請求精確匹配,Frontend配置段中還可以定義與全局默認配置段重名的參數以覆蓋全局配置段的參數。
frontend web_server #定義前端名稱,可自定義。 bind 0.0.0.0:80 #監聽IP地址與端口
mode http #使用http協議
log global #應用全局的日志配置
option httplog #啟用http的log
option httpclose #每次請求完主動關閉http通道
option forwardfor 允許發往服務器的請求頭部中插入“X-Forwarded For”頭部
acl warrior_blog hdr_dom(host) -i blog.warrior.cn #如果請求的域名滿足www.warrior.cn,則返回true,-i表示忽略大小寫。
acl(缺)
5、BackEnd配置段參考:
Backend配置段主要配置負載均衡算法,定義后端服務器以及相應的健康檢查方式等參數,同時Backend配置段也可以定義與默認全局配置段重名的參數,從而覆蓋全局參數值以進行局部后端定義。
backend server_web #后端名稱 mode http #http七層模式 balance roundrobin #負載均衡的方式 option ignore-persist {if | unless} <condition> #在某些條件下拒絕持續連接,適用於靜態文件的負載均衡。 option independant-streams #啟用雙向超時處理,如socket的read和write option log-health-checks #記錄健康檢查日志 option log—separate—errors #對非完全成功的連接改變日志記錄等級 option logasap #傳輸大文件時可以提前記錄日志 option mysql-check #mysql健康檢查 option persist #強制將http請求發往已經down掉的server option redispatch #是否允許重新分配在session失敗后 option smtpchk #smtp檢查 option httpchk #通過http協議進行健康檢查 option socket-stats #允許對單個socket進行統計 option srvtcpka #是否允許向server發送 keepalive option tcpka #是否允許向 server和 client發送 keepalive option tcplog #允許記錄tcp連接的狀態和時間 option transparent #允許客戶端透明代理 option httpchk GET /1b.html HTTP/1·0 #心跳檢測的文件 tick-table type ip size 1024 #為當前后端配置粘性表;表存儲條目類型為IP地址,允許存儲1k大小的IP地址 stick on dst #定義一個請求模式dst,以將一個客戶端同某個后端服務器關聯起來 timeout server 90m #后端服務器最大等待時間,超過此時間則認為服務器不可用。
如下進行多后端服務器定義, check inter 1500是檢測心跳頻率, rise 3表示3次檢查結果正確則認為服務器可用,fall 3表示檢測結果失敗3次則認為服務器不可用, weight代表服務器權重。port 9200表示通過端口9200來進行基於 http的健康檢查, backup表示該服務器是備份服務器,只有在其他非 backup服務器均不可用的情況下負載均衡器才會使用該后端服務器,默認情況下使用第一個標記為 backup的后端服務器, upon-marked-down shutdown-sessions表示當該服務器被認為是 shutdown的時候,關閉全部與該服務器的請求連接。
server 192.168.51.78 192.168.151.78:80 check inter 1500 rise 3 fall 3 weight 1 port 9200 backup on-marked-down shutdown-sessions
server 192.168.51.79 192.168.151.79:80 check inter 1500 rise 3 fall 3 weight 1 port 9200 backup on-marked-down shutdown-sessions
server 192.168.51.80 192.168.151.80:80 check inter 1500 rise 3 fall 3 weight 1 port 9200 backup on-marked-down shutdown-sessions