haproxy安裝配置(筆記一)
四層負載均衡
以常見的 TCP 應用為例,負載均衡器在接收到第一個來自客戶端的 SYN 請求時,會通過設定的負載均衡演算法選擇一個最佳的後端伺服器,同時將報文中目標 IP 地址修改為後端伺服器 IP,然後直接轉發給該後端伺服器,這樣一個負載均衡請求就完成了。從這個過程來看,一個 TCP 連線是客戶端和伺服器直接建立的,而負載均衡器只不過完成了一個類似路由器的轉發動作。在某些負載均衡策略中,為保證後端伺服器返回的報文可以正確傳遞給負載均衡器,在轉發報文的同時可能還會對報文原來的源地址進行修改。整個過程下圖所示。
七層負載均衡
這裡仍以常見的 TCP 應用為例,由於負載均衡器要獲取到報文的內容,因此只能先代替後端伺服器和客戶端建立連線,接著,才能收到客戶端傳送過來的報文內容,然後再根據該報文中特定欄位加上負載均衡器中設定的負載均衡演算法來決定最終選擇的內部伺服器。縱觀整個過程,七層負載均衡器在這種情況下類似於一個代理伺服器。整個過程如下圖所示。
對比四層負載均衡和七層負載均衡執行的整個過程,可以看出,在七層負載均衡模式下, 負載均衡器與客戶端及後端的伺服器會分別建立一次 TCP 連線,而在四層負載均衡模式下, 僅建立一次 TCP 連線。由此可知,七層負載均衡對負載均衡裝置的要求更高,而七層負載均衡的處理能力也必然低於四層模式的負載均衡。
二、快速安裝 HAProxy 叢集軟體
1、訪問www.haproxy.org下載haproxy原始碼包,需要翻牆下載
2、編譯安裝原始碼包
[[email protected] ~]# tar zxvf haproxy-1.8.13.tar.gz
[[email protected] ~]# cd haproxy-1.8.13/
[[email protected] haproxy-1.8.13]# make TARGET=linux31
####這裡需要使用uname -r檢視系統版本centos6.X需要使用TARGET=linux26 centos7.x使用linux31
[[email protected] haproxy-1.8.13]# uname -r #查詢系統核心版本
3.10.0-862.el7.x86_64
[[email protected] haproxy-1.8.13]# make install PREFIX=/usr/local/haproxy
[ [email protected] haproxy-1.8.13]# mkdir /usr/local/haproxy/conf
[[email protected] haproxy-1.8.13]# cp examples/option-http_proxy.cfg /usr/local/haproxy/conf/haproxy.cfg
3、啟動haproxy
[[email protected] ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg
三、HAProxy 基礎配置檔案詳解
HAProxy 配置檔案根據功能和用途,主要有 5 個部分組成,但有些部分並不是必須的, 可以根據需要選擇相應的部分進行配置。
1、global 部分
用來設定全域性配置引數,屬於程序級的配置,通常和作業系統配置有關。
2、defaults 部分
預設引數的配置部分。在此部分設定的引數值,預設會自動被引用到下面的 frontend、
backend 和 listen 部分中,因此,如果某些引數屬於公用的配置,只需在 defaults 部分新增一次即可。而如果在 frontend、backend 和 listen 部分中也配置了與 defaults 部分一樣的引數,那麼defaults 部分引數對應的值自動被覆蓋。
3、frontend 部分
此部分用於設定接收使用者請求的前端虛擬節點。frontend 是在 HAProxy1.3 版本之後才引入的一個元件,同時引入的還有 backend 元件。通過引入這些元件,在很大程度上簡化了 HAProxy 配置檔案的複雜性。frontend 可以根據 ACL 規則直接指定要使用的後端
4、backend 部分
此部分用於設定集群后端服務叢集的配置,也就是用來新增一組真實伺服器,以處理前端使用者的請求。新增的真實伺服器類似於 LVS 中的real server 節點。
5、listen 部分
此部分是 frontend 部分和 backend 部分的結合體。在 HAProxy1.3 版本之前,
HAProxy 的所有配置選項都在這個部分中設定。為了保持相容性,HAProxy 新的版本仍然保留了 listen 元件的配置方式。目前在 HAProxy 中,兩種配置方式任選其一即可。
四、 HAProxy 配置檔案詳解
global
log 127.0.0.1 local0 info maxconn 4096
user nobody
group nobody
daemon
nbproc 1
pidfile /usr/local/haproxy/logs/haproxy.pid
defaults
mode http
retries 3
timeout connect 10s
timeout client 20s
timeout server 30s
timeout check 5s
frontend www
bind *:80
mode http
option httplog
option forwardfor
option httpclose
log global
default_backend htmpool
backend htmpool
mode http
option redispatch
option abortonclose
balance roundrobin
cookie SERVERID
option httpchk GET /index.php
server web1 10.200.34.181:80 cookie server1 weight 6 check inter 2000 rise 2 fall 3
server web2 10.200.34.182:8080 cookie server2 weight 6 check inter 2000 rise 2 fall
listen admin_stats
bind 0.0.0.0:9188
mode http
log 127.0.0.1
local0 err stats
refresh 30s
stats uri /haproxy-status
stats realm welcome login\ Haproxy
stats auth admin:admin123
stats hide-version
stats admin if TRUE
global配置
log:全域性的日誌配置,local0 是日誌裝置,info 表示日誌級別。其中日誌級別有err、warning、info、debug 四種可選。這個配置表示使用 127.0.0.1 上的 rsyslog 服務中的local0 日誌裝置,記錄日誌等級為info。
maxconn:設定每個 haproxy 程序可接受的最大併發連線數,此選項等同於 Linux命令列選項“ulimit -n”。
user/ group:設定執行 haproxy 程序的使用者和組,也可使用使用者和組的 uid 和gid 值來替代。
daemon:設定 HAProxy 程序進入後臺執行。這是推薦的執行模式。
nbproc:設定 HAProxy 啟動時可建立的程序數,此引數要求將HAProxy 執行模式設定為“daemon”,預設只啟動一個程序。根據使用經驗,該值的設定應該小於伺服器的 CPU 核數。建立多個程序,能夠減少每個程序的任務佇列,但是過多的程序可能會導致程序的崩潰。
pidfile:指定 HAProxy 程序的 pid 檔案。啟動程序的使用者必須有訪問此檔案的許可權。
defaults 部分
mode:設定 HAProxy 例項預設的執行模式,有 tcp、http、health 三個可選值。
tcp 模式 | 在此模式下,客戶端和伺服器端之間將建立一個全雙工的連線,不會對七層報文做任何型別的檢查,預設為 tcp 模式,經常用於 SSL、SSH、SMTP 等應用。 |
http 模式 | 在此模式下,客戶端請求在轉發至後端伺服器之前將會被深度分析,所有不與 RFC 格式相容的請求都會被拒絕。 |
health 模式 | 目前此模式基本已經廢棄,不在多說。 |
retries:設定連線後端伺服器的失敗重試次數,連線失敗的次數如果超過這裡設定的值,HAProxy 會將對應的後端伺服器標記為不可用。此引數也可在後面部分進行設定。
timeout connect:設定成功連線到一臺伺服器的最長等待時間,預設單位是毫秒,但也可以使用其他的時間單位字尾。
timeout client:設定連線客戶端傳送資料時最長等待時間,預設單位是毫秒,也可以使用其他的時間單位字尾。
timeout server:設定伺服器端迴應客戶度資料傳送的最長等待時間,預設單位是毫秒,也可以使用其他的時間單位字尾。
timeout check:設定對後端伺服器的檢測超時時間,預設單位是毫秒,也可以使用其他的時間單位字尾。
frontend 部分
bind:此選項只能在 frontend 和 listen 部分進行定義,用於定義一個或幾個監聽的套接字。bind 的使用格式為:bind [<address>:<port_range>] interface <interface>其中,address 為可選選項,其可以為主機名或IP 地址,如果將其設定為“*”或“0.0.0.0”,將監聽當前系統的所有 IPv4 地址。port_range 可以是一個特定的 TCP 埠,也可是一個埠範圍,小於 1024 的埠需要有特定許可權的使用者才能使用。interface 為可選選項,用來指定網路介面的名稱,只能在 Linux 系統上使用。
option httplog:在預設情況下,haproxy 日誌是不記錄 HTTP 請求的,這樣很不方便 HAProxy 問題的排查與監控。通過此選項可以啟用日誌記錄 HTTP 請求。
option forwardfor:如果後端伺服器需要獲得客戶端的真實 IP,就需要配置此引數。由於 HAProxy 工作於反向代理模式,因此發往後端真實伺服器的請求中的客戶端 IP 均為 HAProxy 主機的 IP,而非真正訪問客戶端的地址,這就導致真實伺服器端無法記錄客戶端真正請求來源的 IP,而“X-Forwarded-For”則可用於解決此問題。通過使用“forwardfor”選項,HAProxy 就可以向每個發往後端真實伺服器的請求新增“X-Forwarded-For”記錄,這樣後端真實伺服器日誌可以通過“X-Forwarded-For”資訊來記錄客戶端來源 IP。
option httpclose:此選項表示在客戶端和伺服器端完成一次連線請求後,HAProxy 將主動關閉此 TCP 連線。這是對效能非常有幫助的一個引數。
log global:表示使用全域性的日誌配置,這裡的“ global”表示引用在HAProxy 配置檔案 global 部分中定義的 log 選項配置格式。
default_backend:#指定預設的後端伺服器池,也就是指定一組後端真實伺服器,而這些真實伺服器組將在 backend 段進行定義。這裡的htmpool 就是一個後端伺服器組。
backend 部分
option redispatch:此引數用於 cookie 保持的環境中。在預設情況下,HAProxy會將其請求的後端伺服器的 serverID 插入到 cookie 中,以保證會話的 SESSION 永續性。而如果後端的伺服器出現故障,客戶端的 cookie 是不會重新整理的,這就出現了問題。此時,如果設定此引數,就會將客戶的請求強制定向到另外一個健康的後端伺服器上,以保證服務的正常。
option abortonclose:如果設定了此引數,可以在伺服器負載很高的情況下, 自動結束掉當前佇列中處理時間比較長的連結。
balance:此關鍵字用來定義負載均衡演算法。目前 HAProxy 支援多種負載均衡演算法,常用的有如下幾種:
roundrobin | 是基於權重進行輪詢排程的演算法,在伺服器的效能分佈比較均勻的時候,這是一種最公平、最合理的演算法。此演算法經常使用。 |
static-rr | 也是基於權重進行輪詢的排程演算法,不過此演算法為靜態方法,在執行時調整其伺服器權重不會生效。 |
source | 是基於請求源 IP 的演算法。此演算法先對請求的源 IP 進行 hash 運算, 然後將結果與後端伺服器的權重總數相除後轉發至某個匹配的後端伺服器。這種方式可以使同一個客戶端 IP 的請求始終被轉發到某特定的後端伺服器。 |
leastconn | 此演算法會將新的連線請求轉發到具有最少連線數目的後端伺服器。在會話時間較長的場景中推薦使用此演算法,例如資料庫負載均衡等。此演算法不 適合會話較短的環境中,例如基於 HTTP 的應用。 |
uri | 此演算法會對部分或整個 URI 進行 hash 運算,再經過與伺服器的總權重相除,最後轉發到某臺匹配的後端伺服器上。 |
uri_param | 此演算法會根據 URL 路徑中的引數進行轉發,這樣可保證在後端真實伺服器數量不變時,同一個使用者的請求始終分發到同一臺機器上。 |
hdr(<name>): | 此演算法根據 http 頭進行轉發,如果指定的 http 頭名稱不存在,則使用 roundrobin 演算法進行策略轉發。 |
cookie:表示允許向 cookie 插入 SERVERID,每臺伺服器的 SERVERID 可在下面的 server 關鍵字中使用 cookie 關鍵字定義。
option httpchk:此選項表示啟用 HTTP 的服務狀態檢測功能。HAProxy 作為一款專業的負載均衡器,它支援對 backend 部分指定的後端服務節點的健康檢查,以保證在後端 backend 中某個節點不能服務時,把從 frotend 端進來的客戶端請求分配至 backend 中其他健康節點上,從而保證整體服務的可用性。“option httpchk”的用法如下:
option httpchk <method> <uri> <version> 其中,各個引數的含義如下:
method | 表示 HTTP 請求的方式,常用的有 OPTIONS、GET、HEAD 幾種方式。一般的健康檢查可以採用 HEAD 方式進行,而不是才採用 GET 方式,這是因為 HEAD 方式沒有資料返回,僅檢查 Response 的 HEAD 是不是 200 狀態。因此相對與 GET 來說,HEAD 方式更快,更簡單。 |
uri | 表示要檢測的 URL 地址,通過執行此 URL,可以獲取後端伺服器的執行狀態。在正常情況下將返回狀態碼 200,返回其他狀態碼均為異常狀態。 |
version | 指定心跳檢測時的 HTTP 的版本號。 |
server:這個關鍵字用來定義多個後端真實伺服器,不能用於 defaults 和frontend部分。使用格式為:server <name> <address>[:port] [param*] 其中,每個引數含義如下:
check:表示啟用對此後端伺服器執行健康狀態檢查。
inter:設定健康狀態檢查的時間間隔,單位為毫秒。
rise:設定從故障狀態轉換至正常狀態需要成功檢查的次數,例如。“rise 2”表示 2 次檢查正確就認為此伺服器可用。
fall:設定後端伺服器從正常狀態轉換為不可用狀態需要檢查的次數,例如,“fall 3”表示 3 次檢查失敗就認為此伺服器不可用。
cookie:為指定的後端伺服器設定 cookie 值,此處指定的值將在請求入站時被檢查,第一次為此值挑選的後端伺服器將在後
<name> | 為後端真實伺服器指定一個內部名稱,隨便定義一個即可。 | ||
<address> | 後端真實伺服器的 IP 地址或主機名。 | ||
<port> | 指定連線請求發往真實伺服器時的目標埠。在未設定時,將使用客戶端請求時的同一埠。 | ||
[param*] | 為後端伺服器設定的一系引數,可用引數非常多,這裡僅介紹常用的一些引數: | ||
check |
表示啟用對此後端伺服器執行健康狀態檢查。 |
||
inter |
設定健康狀態檢查的時間間隔,單位為毫秒。 |
||
rise |
設定從故障狀態轉換至正常狀態需要成功檢查的次數,例如。“rise 2”表示 2 次檢查正確就認為此伺服器可用。 |
||
fall |
設定後端伺服器從正常狀態轉換為不可用狀態需要檢查的次數,例如,“fall 3”表示 3 次檢查失敗就認為此伺服器不可用。 |
||
cookie |
為指定的後端伺服器設定 cookie 值,此處指定的值將在請求入站時被檢查,第一次為此值挑選的後端伺服器將在後續的請求中一直被選中,其目的在於實現持久連線的功能。上面 的“cookie server1”表示 web1 的 serverid 為 server1。同理, “cookie server2”表示 web2 的 serverid 為 server2。 |
||
weight |
設定後端真實伺服器的權重,預設為 1,最大值為 256。設定為 0 表示不參與負載均衡。 |
||
backup |
設定後端真實伺服器的備份伺服器,僅僅在後端所有真實伺服器均不可用的情況下才啟用。 |
listen 部分
這個部分通過listen 關鍵字定義了一個名為“admin_stats”的例項,其實就是定義了一個 HAProxy 的監控頁面,每個選項的含義如下:
stats refresh:設定 HAProxy 監控統計頁面自動重新整理的時間。
stats uri:設定 HAProxy 監控統計頁面的URL 路徑,可隨意指定。例如、指定“stats uri /haproxy-status”,就可以過 http://IP:9188/haproxy-status 檢視。
stats realm:設定登入 HAProxy 統計頁面時密碼框上的文字提示資訊。
stats auth:設定登入 HAProxy 統計頁面的使用者名稱和密碼。使用者名稱和密碼通過冒號分割。可為監控頁面設定多個使用者名稱和密碼,每行一個。
stats hide-version:用來隱藏統計頁面上 HAProxy 的版本資訊。
stats admin if TRUE:通過設定此選項,可以在監控頁面上手工啟用或禁用後端真實伺服器,僅在 haproxy1.4.9 以後版本有效。
完整的haproxy配置檔案
global
log 127.0.0.1 local0 info
maxconn 4096
user nobody
group nobody
daemon
nbproc 1
pidfile /usr/local/haproxy/logs/haproxy.pid
defaults
mode http
retries 3
timeout connect 10s
timeout client 20s
timeout server 30s
timeout check 5s
frontend www
bind *:80
mode http
option httplog
option forwardfor
option httpclose
log global
#acl host_www hdr_dom(host) -i www.zb.com
#acl host_img hdr_dom(host) -i img.zb.com
#use_backend htmpool if host_www
#use_backend imgpool if host_img
default_backend htmpool
backend htmpool
mode http
option redispatch
option abortonclose
balance static-rr
cookie SERVERID
option httpchk GET /index.jsp
server 237server 192.168.81.237:8080 cookie server1 weight 6 check inter 2000 rise 2 fall 3
server iivey234 192.168.81.234:8080 cookie server2 weight 3 check inter 2000 rise 2 fall 3
backend imgpool
mode http
option redispatch
option abortonclose
balance static-rr
cookie SERVERID
option httpchk GET /index.jsp
server host236 192.168.81.236:8080 cookie server1 weight 6 check inter 2000 rise 2 fall 3
listen admin_stats
bind 0.0.0.0:9188
mode http
log 127.0.0.1 local0 err
stats refresh 30s
stats uri /haproxy-status
stats realm welcome login\ Haproxy
stats auth admin:admin123
stats hide-version
stats admin if TRUE
五、haproxy 解決叢集 session 共享問題
Haproxy 二種方法保持客戶端 session 一致
1、使用者 IP 識別
haroxy 將使用者 IP 經過 hash 計算後 指定到固定的真實伺服器上(類似於 nginx 的 IP hash 指令)
配置指令:balancesource
backend htmpool
mode http
option redispatch
option abortonclose
balance source
cookie SERVERID
option httpchk GET /index.jsp
server 237server 192.168.81.237:8080 cookie server1 weight 6 check inter 2000 rise 2 fall 3
server iivey234 192.168.81.234:8080 cookie server2 weight 3 check inter 2000 rise 2 fall 3
2、 cookie 識別
haproxy 將WEB 服務端傳送給客戶端的 cookie 中插入(或新增加字首)haproxy 定義的後端的伺服器COOKIE ID。
配置指令例舉cookieSESSION_COOKIEinsert indirect nocache
backend htmpool
mode http
option redispatch
option abortonclose
balance static-rr
cookie SERVERID #cookie引數
option httpchk GET /index.jsp
server 237server 192.168.81.237:8080 cookie server1 weight 6 check inter 2000 rise 2 fall 3 #server裡面的cookie引數
server iivey234 192.168.81.234:8080 cookie server2 weight 3 check inter 2000 rise 2 fall 3 #server裡面的cookie引數