HAproxy負載均衡動靜分離實現及配置詳解

                                  HAproxy負載均衡動靜分離實現及配置詳解

HAproxy的介紹                                                                                   


    HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在時下的硬件上,完全可以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。

    HAProxy實現了一種事件驅動、單一進程模型,此模型支持非常大的併發連接數。多進程或多線程模型受內存限制 、系統調度器限制以及無處不在的鎖限制,很少能處理數千併發連接。事件驅動模型因爲在有更好的資源和時間管理的用戶端(User-Space) 實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程序通常擴展性較差。這就是爲什麼他們必須進行優化以 使每個CPU時間片(Cycle)做更多的工作。

HAproxy的安裝及生成重要文件                                                                      


HAproxy在centos6.6有較新的包,因此我們可以直接yum安裝使用

#yum install haproxy -y 
[root@localhost ~ ]# rpm -ql haproxy
/etc/rc.d/init.d/haproxy       //服務腳本
/etc/haproxy/haproxy.cfg       //配置文件

HAproxy的應用層次和實現模型                                                                      


HAproxy的應用層次

    1.可以是應用層:http

    2.可以是TCP層:mysql,緩存處理

其常規應用的模型是fullnat型:

在網卡地址轉換時,源IP地址和目標IP敵陣地都會發生變化。


wKioL1SuiNGASxpeAACgcGSGF8A599.jpg

HAproxy的配置詳解                                                                                 


一.配置段組成:

    1.全局配置:global

    2.代理配置段:其中代理配置端大致還有四類:

        defaults:段用於爲所有其它配置段提供默認參數.

        frontend:定義前端監聽套接字,類似於nginx的server.

        backend :定義後端的服務器,類似與nginx的upstream.

        listen  :可以將前後端一起定義在listen中,通常在TCP層時使用。

整體配置如下:

global   
    log         127.0.0.1 local2      //定義日誌
    chroot      /var/lib/haproxy      
    pidfile     /var/run/haproxy.pid
    maxconn     40000
    user        haproxy
    group       haproxy
    daemon
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8 header X-Forword-For
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 30000
listen stats                   //單獨定義狀態頁面
    mode http
    bind 0.0.0.0:1080
    stats enable
    stats hide-version   
    stats uri     /haproxyuri?stats
    stats realm   Haproxy\ Statistics
    stats auth    admin:admin
    stats admin if TRUE
frontend http-in       //前端配置
    bind *:80
    mode http
    log global
    acl url_static       path_beg       -i /static /p_w_picpaths /javascript /stylesheets
    acl url_static       path_end       -i .jpg .jpeg .gif .png .css .js

    use_backend static_servers          if url_static
    default_backend dynamic_servers

backend static_servers
    balance roundrobin
    server imgsrv1 172.16.200.7:80 check maxconn 6000
    server imgsrv2 172.16.200.8:80 check maxconn 6000
backend dynamic_servers
    cookie srv insert nocache
    balance roundrobin
    server websrv1 172.16.200.7:80 check maxconn 1000 cookie websrv1
    server websrv2 172.16.200.8:80 check maxconn 1000 cookie websrv2
    server websrv3 172.16.200.9:80 check maxconn 1000 cookie websrv3

二.HAproxy的關鍵指令

balance :用於指明調度算法

使用位置:defaults,listen,backend

使用格式:balance url_param <param> 

常用的參數有:

    roundrobin 動態加權輪詢;最多接受4095併發請求。

    static-rr:靜態的加權輪詢,其在後端服務器連接數上沒有限制;

    leastconn:最少連接數;動態的,適用於緩存服務器和mysql等較長會話;

    source:源IP綁定,是否是靜態的取決於使用的hash_type

    uri:基於uri的方式,進行客戶端服務器綁定,是否靜態使用hash-type決定;

    url_param:通過用戶的參數標識來負載在均衡至不同的後端.   

bind :用於定義一個或幾個監聽地址。

使用位置:frontend和listen。

使用格式:bind [<address>]:<port_range> [, ...]

如果定義多個監聽端口:

    bind :80,:8080  中間不要有空格

mode :用於實例的運行模式或協議

    mode { tcp|http|health }

    1.tcp: 通常用於SSL、SSH、SMTP等應用;

    2.http:應用於HTTP模式,工作於應用層;

    3.health:自定義外部健康狀態檢測

    例如:mode http 指定使用http協議

hash-type

使用格式:hash-type <method>

定義用於將hash碼映射至後端服務器的方法;其不能用於frontend區段;可用方法有map-based和consistent,在大多數場景下推薦使用默認的map-based方法。

map-based:就是在調度時把根據用戶請求的URL,進行hash計算,然後將這個結果對後端主機的個數進行取模。假設每個主機給予1,2, 3編號這個值必然是在後端主機的之中的一個,因此這樣不同的url最終hash計算結果必然不同,那麼最終調度到後端主機的也必然不同,這樣只有同一個UR,請求才會被調度至後端主機。這就是取模法。

但是:取模法一旦有一臺主機發生故障,那麼所有的主機的取模計算都將發生錯誤。

consistent:這種方式是將所有主機建設分佈在一個0-2的32次方的數字大環上,將用戶請求的URL,也進行hash計算,然後把這個結果對2的32次方取模,這個數字結果也必然是落在這個32次方數字的大環上。然後按照順時針方向,這個數字離那個主機進,就被調度至那一臺主機。

log

log global

log <address> <facility> [<level> [<minlevel>]]

啓用日誌,因此可用於所有區段。。

啓用方法:編輯日誌配置文件

 # vim /etc/rsyslog.conf
 14 $UDPServerRun 514
 60 # Save boot        messages also to boot.log
 61 local7.*                                               var/log/boot.log
 62 local2.*                                               /var/log/haproxy.log
 #service rsyslog restart

wKiom1SusnrTjrIOAAEnf6G_2tU643.jpg

maxconn

使用格式:maxconn <conns>

指明前端鏈接的最大併發連接數,指定儘量大一些,但是不可以大於globle段落的值。

default_backend 指定默認後端,通常用於匹配的後端沒有找到時使用。

使用格式:default_backend <backend>

例如:

use_backend     dynamic  if  url_dyn

use_backend     static   if  url_css url_img extension_img

default_backend dynamic

server 後端用於聲明server

使用格式:server <name> <address>[:port] [param*]

工作位置:不可以用於defaults和frontend段。

<name>:主機標示,最好設置和主機名一致。

<address>:此服務器的的IPv4地址,也支持使用可解析的主機名;

[:port]:指定目標端口,未設定時,將使用客戶端請求時的同一相端口;

例如:server    node3  192.168.1.122:80 check

服務器或默認服務器參數:

backup:設定爲備用服務器,這樣只有當其他所有的服務器均故障時才啓用。

check :啓動對此server執行健康狀態檢查,他可以帶的參數有:

      inter <delay>:設定健康狀態檢查的時間間隔

      rise <count>:server從離線狀態轉換至正常狀態需要成功檢查的次數;

      fall <count>:server從正常狀態轉換爲不可用狀態需要檢查的次數;

      cookie <value>:基於cookie的綁定

maxconn <maxconn>:指定此服務器接受的最大併發連接數;

maxqueue <maxqueue>:設定請求隊列的最大長度;

observe <mode>:通過觀察服務器的通信狀況來判定其健康狀態,默認爲禁用,其支持的類型有“layer4”和“layer7”,“layer7”僅能用於http代理場景;

redir <prefix>:啓用重定向功能

server srv1 172.16.100.6:80 redir http://p_w_picpathserver.magedu.com check

weight <weight>:權重,默認爲1,最大值爲256,0表示不參與負載均衡;

基於cookie的綁定實例:

 cookie srv insertindirect nocache
 76    server    node2  172.16.249.220:80 cookie first check rise 2 fall 1
 77    server    node4  172.16.249.248:80 cookie second check rise2   fall 1

這裏面cookie綁定在了first上了。

wKiom1Sv6jKw7SkEAACctIPBZWg174.jpg

Redir 重定向

直接在想要重定向的地方,後面添加

server    node4  172.16.249.248:80  redir http://172.16.249.122 check

wKioL1Sv7PDyVN1UAADSKiqiq0U874.jpg

Stats_enable

啓用狀態頁面,這個頁面不僅可以顯示信息,還可以是控制的功能。

直接啓用後端使用stats_enable ,對那個組啓啓用狀態頁面。這時的默認訪問路徑爲

/Haproxy?stats  因此我們給予施加權限。

爲了安全我們還可以修改它的Uri的

backend static
 74    balance     roundrobin
 75    server    node2  192.168.1.220:80  check rise 2    fall 1
 76    server    node4  192.168.1.179:80   check rise 2    fall 1
 77     stats enable                                 啓用狀態頁面
 78     stats uri /ha?stats                     //狀態頁面請求路徑
 79     stats realm HAPorxyStats  //狀態頁面的領域,中間如果有空格要\轉義
 80     stats auth admin:pass              //認證的用戶名和密碼,中間用:冒號隔開。
 81     stats admin if TRUE         //如果是密碼驗證成功允許進入管理區域

wKioL1Sv7n3y6UOwAATC69cM2pk528.jpg

但是我們通常會把stats單獨定義在listen中如:

listen stats
    mode http
    bind 0.0.0.0:1080
    stats enable
    stats uri     /haproxyadmin?stats
    stats realm   Haproxy\ Statistics
    stats auth    admin:admin
    stats admin if TRUE

option forwardfor

option forwardfor [ except <network> ] [ header <name> ] [ if-none ]

含義:就是指明記錄客戶端ip,除了127.0.0.1 之外的IP會被記錄下來。

實現過程:

frontend http-in
    mode http
    option forwardfor except 127.0.0.1 header X-Forword-For

然後,後端主機訪問日誌格式也需要做響應的修改才能實現這種結果。

編輯後端主機的配置文件,修改配置文件日誌格式:

 497 LogFormat "%{X-Forword-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
 498 LogFormat "%h %l %u %t \"%r\" %>s %b" common
 499 LogFormat "%{Referer}i -> %U" referer
 500 LogFormat "%{User-agent}i" agent

ACL

acl <aclname> <criterion> [flags] [operator] <value> ...

<aclname>:ACL名稱,區分字符大小寫,且其只能包含大小寫字母、數字、-(連接線)、_(下劃線)、.(點號)和:(冒號);haproxy中,acl可以重名,這可以把多個測試條件定義爲一個共同的acl;

<criterion>:測試標準,即對什麼信息發起測試;測試方式可以由[flags]指定的標誌進行調整;而有些測試標準也可以需要爲其在<value>之前指定一個操作符[operator];

[flags]:目前haproxy的acl支持的標誌位有3個:

        -i:不區分<value>中模式字符的大小寫;

        -f:從指定的文件中加載模式;

        --:標誌符的強制結束標記,在模式中的字符串像標記符時使用;

<value>:acl測試條件支持的值有以下四類:

        整數或整數範圍:如1024:65535表示從1024至65535;僅支持使用正整數(如果出現類似小數的標識,其爲           通常爲版本測試),且支持使用的操作符有5個,分別爲eq、ge、gt、le和lt;

        字符串:支持使用“-i”以忽略字符大小寫,支持使用“\”進行轉義;如果在模式首部出現了-i,可以在         其之前使用“--”標誌位;

        正則表達式:其機制類同字符串匹配;

        IP地址及網絡地址  

path_beg <string>:用於測試請求的URL是否以<string>指定的模式開頭;

path_end <string>:用於測試請求的URL是否以<string>指定的模式結尾;

動靜的實現:                                                                                         


事例演示

frontend http-in
    bind *:80
    mode http
    acl url_static       path_beg       -i /static /p_w_picpaths /javascript /stylesheets
    acl url_static       path_end       -i .jpg .jpeg .gif .png .css .js
    use_backend static_servers          if url_static
    default_backend dynamic_servers
backend static_servers
    balance roundrobin
    server node1 172.16.11.1:80 check 
    server node2 172.16.11.2:80 check 
backend dynamic_servers
    cookie srv insert nocache   //動態內容我們是一般做cookie綁定的
    balance roundrobin
    server node3 172.16.11.3:80 check  cookie first
    server node4 172.16.11.4:80 check  cookie second
    server node5 172.16.11.5:80 check  cookie three




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章