天天看點

HAProxy

1 關于HAProxy

1.1 介紹:

HAProxy是一個使用C語言編寫的自由及開放源代碼軟體,其提供高可用性、負載均衡,以及基于TCP和HTTP的應用程式代理。

HAProxy特别适用于那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運作在目前的硬體上,完全可以支援數以萬計的并發連接配接。并且它的運作模式使得它可以很簡單安全的整合進您目前的架構中, 同時可以保護你的web伺服器不被暴露到網絡上。

1.2 衡量負責均衡器性能的因素:

Session rate 會話率:每秒鐘産生的會話數

Session concurrency 并發會話數:伺服器處理會話的時間越長,并發會話數越多

Data rate 資料速率:高會話數,高資料速率要求更多的記憶體

1.3 HAProxy工作模式:

mode http:用戶端請求被深度分析後再發往伺服器

mode tcp: 用戶端與伺服器之間建立會話,不檢查第七層資訊

mode health: 僅做健康狀态檢查,已經不建議使用

1.4 配置檔案說明:

global部分:全局設定程序級别參數

default:為後續的其它部分設定預設參數    預設參數可以被後續部分重置

frontend:描述接收用戶端偵聽套位元組集

backend:描述轉發連結的伺服器集

listen:把frontend和backend結合到一起的完整聲明

vim /etc/haproxy/haproxy.cfg

###########全局配置#########

global

    log            127.0.0.1 local2         #日志輸出配置,所有日志都記錄在本機,通過local2輸出

    chroot      /var/lib/haproxy          #chroot運作路徑

    pidfile      /var/run/haproxy.pid    #pid存放的路徑

    maxconn     4000                      #最大的連接配接數

    user             haproxy

    group           haproxy

    daemon                                    #以守護程序運作

###########預設配置#########

defaults

    mode           http                  #預設的模式mode {  tcp|http|health },tcp是4層,http是7層,health隻傳回OK

    log               global

    option          httplog             #日志類别,采用httplog

    option         dontlognull       #不記錄健康檢查日志資訊

    option         http-server-close            #每次請求完畢後主動關閉http通道,haproxy不支援keep-alive,隻能模拟這種模式實作

    option   forwardfor   except 127.0.0.0/8

    option         redispatch     

    retries        3                              #3次連接配接失敗就認為伺服器不可用

    timeout http-request    10s        #預設http請求逾時時間

    timeout queue             1m         #預設隊列逾時時間

    timeout connect           10s       #連接配接逾時

    timeout client               1m        #用戶端逾時

    timeout server             1m        #伺服器逾時

    timeout http-keep-alive 10s      #預設持久連接配接逾時時間

    timeout check             10s        #心跳監測逾時

    maxconn                     3000     #最大連接配接數

###########統計頁面配置#########

listen stats

   bind 0.0.0.0:1080  #監聽端口

   stats refresh 30s   #統計頁面自動重新整理時間

   stats uri  /stats      #統計頁面url

   stats realm Haproxy Manager #統計頁面密碼框上提示文本

   stats auth admin:admin   #統計頁面使用者名和密碼設定,可以設定多個

   stats hide-version            #隐藏統計頁面上HAProxy的版本資訊

###########frontend前端配置#########

#原配置檔案說明

frontend  main *:5000

    acl url_static       path_beg       -i /static /images /javascript /stylesheets    #acl後面是規則名稱,-i為忽略大小寫,後面跟的是要通路的域名,如果通路這個域名就觸發images等規則

    acl url_static       path_end       -i .jpg .gif .png .css .js

    #path_beg 比對路徑的開頭,path_end 比對路徑的結尾

   use_backend static          if url_static  

   default_backend              app

#自定義配置檔案

frontend  web 192.168.4.100:80               #定義前端的名稱

   acl url_html      path_end      -i .html       #比對url的結尾

   acl url_php       path_end      -i .php       #比對.php的結尾

   use_backend  html-group     if url_html    #定義後端服務組(以html結尾)

   use_backend  php-group      if url_php     #定義後端服務組(以php結尾)

   default_backend         html-group             #預設後端服務組(僅IP)

backend html-group                    #後端服務組的具體的資訊

    balance     roundrobin             #輪詢排程算法

    server  app101 192.168.4.101:80 check  

    server  app102 192.168.4.102:80 check

backend php-group

    balance     roundrobin

    server  app103 192.168.4.103:80 check

    server  app104 192.168.4.104:80 check

###########backend後端配置#########

backend static                     #backend起的名稱,static作用域

    balance     roundrobin     #排程算法

    server      static 127.0.0.1:4331 check

backend app

    balance     roundrobin

    server  app1 127.0.0.1:5001 check

    server  app2 127.0.0.1:5002 check

    server  app3 127.0.0.1:5003 check

    server  app4 127.0.0.1:5004 check

listen webserver 0.0.0.0:80             #webserver:名稱,允許所有通過80端口通路

    cookie SERVERID rewrite           #記錄用戶端通路網站伺服器的cookie資訊

    balance roundrobin                      #排程算法

    server  server44 192.168.4.44:80 cookie app44 check inter 2000 rise 2 fall 5

    server  server45 192.168.4.45:80 cookie app45 check inter 2000 rise 2 fall 5

    #後端伺服器命名server44     cookie 為cookie命名app44

2 案例1普通LB叢集

HAProxy伺服器:RHEL7.2   IP:192.168.4.41

web:192.168.4.44 192.168.40.45

2.1 配置

[root@ser100 ~]# yum -y install haproxy

[root@ser100 ~]# vim /etc/haproxy/haproxy.cfg

#删除default以下的其它配置,添加如下配置

listen webserver 0.0.0.0:80     #webserver:名稱  允許所有通過80端口通路

  cookie SERVERID rewrite    #記錄用戶端通路網站伺服器的cookie資訊

  balance roundrobin              #排程算法

  server web101 192.168.4.44:80 cookie app101 check inter 2000 rise 2 fall 5

  server web102 192.168.4.45:80 cookie app102 check inter 2000 rise 2 fall 5

  #後端伺服器  cookie app101 為cookie命名

在defaults 最後一行添加  stats  uri  /admin

http://192.168.4.41/admin  是URL

去掉http://192.168.4.41 剩下的就是uri

也可以單獨添加:

   stats uri  /admin      #統計頁面url

   stats auth admin:admin          #統計頁面使用者名和密碼設定

   stats hide-version                   #隐藏統計頁面上HAProxy的版本資訊

2.2 啟動服務

[root@ser41 ~]# systemctl start haproxy

[root@ser41 ~]# systemctl enable haproxy

2.3 通路

http://192.168.4.41/admin  (根據配置檔案)

3 案例2區分業務的LB叢集

做普通LB叢集對配置檔案做了備份,現在對配置檔案重新配置

區分不同的業務:在應用層區分

準備4台web伺服器,4台web伺服器的/var/www/html路徑下都存放 .html和.php結尾的檔案

3.1 配置

在web伺服器上:

yum -y install php           #解釋php代碼

systemctl restart httpd    #重新加載php子產品

vim /var/www/html/a.php

<?php

echo “web42”;

?>

vim /var/www/html/a.html

i am web42

[root@ser41 ~]# vim /etc/haproxy/haproxy.cfg

frontend  webgroup 192.168.4.41:80     #定義前端的名稱webgroup,允許隻能通過某個ip的某個端口通路

  # acl url_static     path_beg      -i /static  

    acl url_html      path_end      -i .html     #比對url以html的結尾

    acl url_php       path_end      -i .php     #比對url以php的結尾

    use_backend  html-group     if url_html   #定義後端服務組(以html結尾)

    use_backend  php-group      if url_php    #定義後端服務組(以php結尾)

    default_backend         html-group           #預設後端服務組(僅IP)

    backend html-group           #後端服務組的具體的資訊

        balance     roundrobin    #輪詢排程算法

        server  web44 192.168.4.44:80 check   #後端真正的伺服器,check:做健康性檢查

        server  web45 192.168.4.45:80 check

    backend php-group

        balance     roundrobin

        server  web42 192.168.4.42:80 check

        server  web43 192.168.4.43:80 check

3.2 用戶端測試

elinks -dump  http://192.168.4.41/a.html   #結果:輪詢隻出現在web44,web45

elinks -dump  http://192.168.4.41/a.php   #結果:輪詢隻出現在web42,web43

繼續閱讀