1. 程式人生 > >haproxy相關概念及原理

haproxy相關概念及原理

刷新 -keep source 相關配置 提高 根據 pow code 接收

1、 Haproxy介紹

HaProxy是一個特別適用於高可用性環境的TCP/HTTP開源的反向代理和負載均衡軟件。在七層負載均衡方面的功能很強大(支持cookie track,header rewrite等等),支持雙機熱備,支持虛擬主機,支持健康檢查,同時還提供直觀的監控頁面,可以清晰的監控服務集群的運行狀況。同時支持Linux2.6內核中System Epoll,通過簡化系統調用,大幅的提高了網絡I/O性能。

Haproxy包括以下一些特征:

  • 根據靜態分配的cookie分配HTTP請求
  • 分配負載到各個服務器,同時保證服務器通過使用HTTP Cookie實現連接保持;
  • 當主服務器宕機時切換到備服務器,允許特殊端口的服務監控;
  • 做維護時通過配置可以保證業務的連續性,更加人性化;
  • 添加修改刪除HTTP Request和Respone頭;
  • 通過特定表達式Block HTTP請求;
  • 根據應用的cookie做連接保持;
  • 常有用戶驗證的詳細的HTML監控報告。

1.1 Haproxy支持的平臺

HaProxy可以運行在如下這些平臺上:

  • Linux2.4 on x86,x86_64,Alpha,Sparc,MIPS,PARISC
  • Linux2.6/3.x on x86,x86_64,ARM,Sparc,PPC64
  • Solaris 8/9 on UltraSparc 2 and 3
  • Solaris 10 Opteron and UltraSPARC
  • FreeBSD 4.10 - 10 on x86
  • OpenBSD 3.1-current on i386,amd64,alpha,spare64 and VAX (check the ports)
  • AIX 5.1-5.3 on Power architechare

1.2 Haproxy負載均衡算法

HaProxy的負載均衡算法現在具體有如下8種:
1、 roundrobin:簡單的輪詢
2、 static-rr:權重輪詢
3、 leastconn:最少連接者優先
4、 source:根據請求源IP,這個跟Nginx的ip_hash機制類似
5、 ri:根據請求的URI
6、 rl_param:表示根據請求的URI參數‘balance url_param’requires an URL parameter name;

7、 hdr(name):根據HTTP請求頭來鎖定每一次HTTP請求
8、 rdp-cookie(name):根據cookie來鎖定並哈希每一次TCP請求

2.HAPROXY的配置

HAProxy的配置過程分為3個主要部分:

  • 命令行參數,這是最優先的;
  • global(全局)段,設置進程級參數;
  • 代理配置段,通常位於default,listen,backend這樣的形式內。
    配置文件的語法是由關鍵字後跟可選的一個或者多個參數(參數之間有空格)組成。如果字符串中包含空格,必須用’\’進行轉義。

HAPROXY配置中分五大部分:

  1. global:全局參數配置,進程級的,用來控制Haproxy啟動前的一些進程及系統設置。
  2. defaults:配置一些默認的參數,可以被frontend,backend,listen段集成使用
  3. frontend:用來匹配接收客戶所請求的域名,uri等,並針對不同的匹配,做不同的請求處理;
  4. backend:定義後端服務器集群,以及對後端服務器集群的一些權重、隊列、連接數等選項的設置,類似於nginx中的upstream模塊;
  5. listen:可以理解為frontend和backend的組合體。
    Haproxy配置文件的配置方法主要有兩種,一種是由前端(frontend)和後端(backend)配置塊組成,前端和後端都可以有多個。第二種方法是只有一個listen配置塊來同時實現前端和後端。最常用也是推薦的方法為第一種,即frontend和backend的模式。

2.1 配置參數

配置參數及詳解:

global                                                 # 全局參數global模塊的設置
    log         127.0.0.1 local2                      # log語法:log <address_1>[max_level_1] # 全局的日誌配置,使用log關鍵字,指定使用127.0.0.1上的syslog服務中的local0日誌設備,記錄日誌等級為info的日誌
    chroot      /var/lib/haproxy              #工作目錄
    pidfile     /var/run/haproxy.pid          #進程pid文件
    maxconn     4000                          #最大連接數
    user        haproxy                       #所屬用戶
    group       haproxy                       #所屬用戶組
    daemon                                    #以守護進程方式運行haproxy
stats socket /var/lib/haproxy/stats       #定義socket套接字,針對在線維護很有幫助

defaults                                      # defaults模塊的設置
    mode                    http              #默認的模式{ tcp|http|health},health只會返回OK
    log                     global            #應用全局的日誌配置
    option                  httplog           #啟用日誌記錄HTTP請求,默認不記錄HTTP請求日誌                                                                
    option                 dontlognull        # 啟用該項,日誌中將不會記錄空連接。所謂空連接就是在上遊的負載均衡器者監控系統為了探測該 服務是否存活可用時,需要定期的連接或者獲取某一固定的組件或頁面,或者探測掃描端口是否在監聽或開放等動作被稱為空連接;官方文檔中標註,如果該服務上遊沒有其他的負載均衡器的話,建議不要使用該參數,因為互聯網上的惡意掃描或其他動作就不會被記錄下來
    option http-server-close                  #每次請求完畢後主動關閉http通道
    option forwardfor       except 127.0.0.0/8   #如果服務器上的應用程序想記錄發起請求的客戶端的IP地址,需要在HAProxy上配置此選項, 這樣 HAProxy會把客戶端的IP信息發送給服務器,在HTTP                                                                            請求中添加"X-Forwarded-For"字段。 啟用  X-Forwarded-For,在requests                                                                            頭部插入客戶端IP發送給後端的server,使後端server獲取到客戶端的真實IP。 
    option                  redispatch       # 當使用了cookie時,haproxy將會將其請求的後端服務器的serverID插入到cookie中,以保證會話的SESSION持久性;而此時,如果後端的服務器宕掉                                                                            了, 但是客戶端的cookie是不會刷新的,如果設置此參數,將會將客戶的請                                                                            求強制定向到另外一個後端server上,以保證服務的正常。
    retries                 3              # 定義連接後端服務器的失敗重連次數,連接失敗次數超過此值後將會將對應後端服務器標記為不可用
    timeout http-request    10s             #http請求超時時間
    timeout queue           1m              #一個請求在隊列裏的超時時間
    timeout connect         10s             #連接超時
    timeout client          1m              #客戶端超時
    timeout server          1m              #服務器端超時
    timeout http-keep-alive 10s             #設置http-keep-alive的超時時間
    timeout check           10s             #檢測超時
maxconn                 3000            #每個進程可用的最大連接數

listen stats                                #定義一個listen模塊,用於狀態檢測
mode http                               #模式采用http
bind 0.0.0.0:8888                       #綁定本機的地址及端口
stats enable                            #啟用狀態檢測功能
stats uri     /haproxy-status           #狀態檢測的URI
stats auth    haproxy:123456            #訪問檢測界面的用戶名和密碼

frontend  main *:80                         #frontend模塊的設置,定義了一個前端
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js      #這裏定義了一個acl規則
    use_backend static   if  url_static     #如果匹配到了acl,則訪問後端的static模塊
default_backend             my_webserver #如果沒有匹配到acl,則將請求丟給默認的模塊

backend static                          #定義第一個後端模塊,static
    balance     roundrobin              #負載均衡算法為輪詢
server      static 127.0.0.1:80 check         #後端服務器地址

backend my_webserver                    #定第二個後端,my_wenserver
balance     roundrobin              #負載均衡算法
    server  web01 172.31.2.33:80  check inter 2000 fall 3 weight 30              #定義的多個後端
    server  web02 172.31.2.34:80  check inter 2000 fall 3 weight 30              #定義的多個後端
    server  web03 172.31.2.35:80  check inter 2000 fall 3 weight 30              #定義的多個後端

2.2 健康檢查

Haproxy作為Loadblance,支持對backend的健康檢查,以保證在後端backend不能服務時,把從frontend進來的request分配至其他可以服務的backend,從而保證整體服務的可用性。

2.2.1 相關配置

相關配置:

httpchk <method><uri><version>
option httpchk HEAD / HTTP/1.0
check:啟動健康檢測
inter:健康檢測時間間隔
rise:檢測服務可用的連接次數
fall:檢測服務不可用的連接次數
error-limit:往server寫數據連續失敗次數的上限,執行on-error的設定
observe<mode>:把正常服務過程作為健康檢測請求,即實時檢測
on-error<mode>:滿足error-limit後執行的操作(fastinter、fail-check、sudden-death、mark-down)。其中fastinter表示立即按照fastinter的檢測延時進行。fail-check表示改次error作為一次檢測;sudden-death表示模仿一次fatal,如果緊接著一次fail則server為down;mark-down表示直接把server設置為down狀態。
server web-node2 192.168.56.22:8080 check inter 2000 rise 30 fall 15

2.2.2檢測方式

3.3.2 檢測方式
1、通過監聽端口進行健康檢測
這種檢測方式,haproxy只會去檢查server的端口,並不能保證服務真正可用。

listen http_proxy 0.0.0.0:80
mode http
cookie SERVERID
balance roundrobin
option httpchk
server web1 192.168.1.1:80 cookie server01 check
server web2 192.168.1.2:80 cookie serve02 check inter 500 rise 1 fall 2

2、通過URI進行健康檢測
這種檢測方式,是用去GET後端server的web頁面,基本可以代表後端服務的可用性。

listen http_proxy 0.0.0.0:80
mode http
cookie SERVERID
balance roundrobin
option httpchk GET /index.html
server web1 192.168.1.1:80 cookie server01 check
server web2 192.168.1.2:80 cookie serve02 check inter 500 rise 1 fall 2

3、通過request獲取的頭部信息進行匹配進行健康檢測
這種檢測方式,是基於一些高級、精細的監測需求,通過對後端頭部訪問的頭部信息進行匹配檢測。

listen http_proxy 0.0.0.0:80
mode http
cookie SERVERID
balance roundrobin
option httpchk HEAD /index.jsp HTTP/1.1\r\n\Host:\www.xxx.com
server web1 192.168.1.1:80 cookie server01 check
server web2 192.168.1.2:80 cookie serve02 check inter 500 rise 1 fall 2

haproxy相關概念及原理