HAproxy簡介

1、HAproxy簡介

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

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

2、安裝配置

安裝

yum install haproxy -y


1

配置說明:

### 主配置文件是/etc/haproxy/haproxy.conf
### 配置文件主要有:
global settings: 全局配置段
  主要用於定義haproxy進程自身的工做特性;
proxies: 代理配置段
  backend: 後端服務器組
  frontend: 定義面向客戶的監聽的地址和端口,以及關聯到的後端服務器組;
  listen: 組合方式直接定義frontend及相關的backend的一種機制;
defaults: 定義默認配置
#################################################################################
gloab的默認選項:
log         127.0.0.1 local2  
# 記錄日誌,此時要藉助於本機的rsyslod的日誌服務,須要開啓udp端口監聽
chroot      /var/lib/haproxy
pidfile     /var/run/haproxy.pid
maxconn     4000
user        haproxy
group       haproxy
daemon
stats socket /var/lib/haproxy/stats
#################################################################################
defaults配置選項:
mode                    http    # 工做模式,有TCP和http,表明4層代理、7層代理
log                     global
option                  httplog
option                  dontlognull
option http-server-close
option forwardfor       except 127.0.0.0/8
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                 3000   # 最大併發鏈接數

1、簡單的實現負載均衡

實驗主機 安裝軟件
172.16.10.9 haproxy,反向代理的前端
172.16.10.77 httpd,後端主機
172.16.10.1 httpd,後端主機
## 配置過程:
在172.16.10.1和172.16.10.77上:
yum install httpd -y
建立測試頁面:
echo "172.16.10.1@node1.example.com" > /var/www/html/index.html
echo "172.16.10.77@basic.example.com" > /var/www/html/index.html
##############################################################

## 在172.16.10.9上配置,在配置文件中添加如下內容,就能夠實現:
frontend  http *:80
    default_backend             web 
backend web 
    balance     roundrobin
    server  web1 172.16.10.77:80
    server  web2 172.16.10.1:80 
###############################################################

此時會出現負載均衡的效果:css

2

此時查看後端web日誌:html

3

解決辦法:前端

編輯http的配置文件中,修改如下內容:(修改記錄的http的頭部信息)
LogFormat "%h  %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
修改成:
LogFormat "\"%{X-Forwarded-For}i\"  %l %u %t \"%r\" %>s %b \"%{Referer}i\" 
\"%{User-Agent}i\"" combined

2、負載均衡算法介紹

在上面的的使用中,使用到了balance關鍵字,這個關鍵字的做用是指定負載均衡算法的。java

### haproxy使用的調度算法:經常使用的
### 使用範圍:defaults forntend backend listen
一、roundrobin: 至關於lvs的 wrr, 是一種dynamic調度算法,支持weight指定權重。所謂的動態是
能夠再服務器運行中調整,慢啓動。對後端服務器數目由限制 4096
二、static-rr: wrr, static調度算法,對後端服務器數目沒有限制
三、leastconn: 相似於lvs的wlc, dynamic方法
四、source: 建議用於基於TCP模式調度,且不支持使用cookie插入模式時使用;
  由hash-type參數決定其爲dynamic或者static等價於ipvs: sh,nginx: ip_hash
五、uri: 基於請求報文中的uri的左半部分(查詢條件以前的部分)或所有的URI進行調度;
  經常使用於backend server爲cache server的場景中;由hash-type參數決定其爲dynamic或者static
六、url_params: 經常使用於後端服務器須要對用戶進行認證的場景中;
  由hash-type參數決定其爲dynamic或者static
七、hdr(<name>):根據用戶請求報文中,指定的http首部的值進行調度
  hdr(host):經常使用於實現將對同一個虛擬主機的請求始終發往同個backend server;
  use_domain_only: 在計算hash值時僅使用域名;由hash-type參數決定其爲dynamic或者static

hash_type的取值有:node

map-based:hash表是一個包含了全部在線服務器的靜態數組。

挑選服務器是根據其在數組中的位置進行的,所以,當一臺服務器宕機或添加了一臺新的服務器時,
    大多數鏈接將會被從新派發至一個與此前不一樣的服務器上。

    對於緩存服務器的工做場景來講,此方法不適用。

consistent:hash表是一個由各服務器填充而成的樹狀結構;

基於hash鍵在hash樹中查找相應的服務器時,最近的服務器將被選中。此方法是動態的,
    支持在運行時修改服務器權重。
    
添加一個新的服務器時,僅會對一小部分請求產生影響,所以,尤爲適用於後端服務器爲cache的
  場景。
  
不過,此算法不甚平滑,派發至各服務器的請求未必能達到理想的均衡效果,所以,
  可能須要不時的調整服務器的權重以得到更好的均衡性。

cookie實現根據客戶端cooike信息來實現持久鏈接。實現的原理:mysql

2

cookie關鍵字用法說明:
nocacahe:將附加cookie信息的資源不緩存於緩存服務器中
insert:插入cooike信息
rewrite:重寫cookie
prefix:做爲前綴

測試:修改haproxy的配置文件nginx

backend web 
    balance     roundrobin
    cookie webser insert nocache
    server  web1 172.16.10.77:80 cookie web1 
    server  web2 172.16.10.1:80 cookie web2

測試:web

5

3、HAproxy的狀態頁

### 在配置文件中添加:
listen stats
    mode http
    bind 0.0.0.0:1080
    stats enable
    stats hide-version
    stats uri     /haproxyadmin?stats
    stats realm   Haproxy\ Statistics
    stats auth    admin:admin
    stats admin if TRUE

6

7

4、後端監控狀態檢測

### 修改配置文件,以下:
backend web 
    balance     roundrobin
    server  web1 172.16.10.77:80  check port 80 inter 2 fall 2 rise 1 
    server  web2 172.16.10.1:80 check port 80 inter 2 fall 2 rise 1
    server  back 172.16.10.9:8080 backup

當後端主機全都不在線時,測試:

8

一旦手段主機從新上線,訪問恢復:

9

5、利用haproxy實現動態分離

此時要利用到haproxy的ACL機制:

haproxy的ACL用於實現基於請求報文的首部、響應報文的內容或其它的環境狀態信息來作出轉發決
  策,這大大加強了其配置彈性。其配置法則一般分爲兩步,首先去定義ACL,即定義一個測試條件,
  然後在條件獲得知足時執行某特定的動做,如阻止請求或轉發至某特定的後端。
  
定義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地址及網絡地址
同一個acl中能夠指定多個測試條件,這些測試條件須要由邏輯操做符指定其關係。
條件間的組合測試關係有三種:「與」(默認即爲與操做)、「或」(使用「||」操做符)以及
「非」(使用「!」操做符)。

示例:

acl url_static       path_beg       -i /static /p_w_picpaths /javascript /stylesheets
acl url_static       path_end       -i .jpg .gif .png .css .js
acl host_static hdr_beg(host) -i img. video. download. ftp.
acl being_scanned be_sess_rate gt 50

實驗環境:

12

在172.16.10.9:

一、提供haproxy的配置文件,內容以下:
global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    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
    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                 3000
listen stats
    mode http
    bind 0.0.0.0:1080
    stats enable
    stats hide-version
    stats uri     /haproxyadmin?stats
    stats realm   Haproxy\ Statistics
    stats auth    admin:admin
    stats admin if TRUE

frontend  http
    bind *:80
    acl url_static       path_beg       -i /static /p_w_picpaths /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js 

    use_backend static          if url_static
    default_backend             web

backend static
    balance     roundrobin
    server      static 172.16.10.122 check

backend web
    balance     roundrobin
    server  web1 172.16.10.77:80  check port 80 inter 2 fall 2 rise 1 
    server  web2 172.16.10.1:80 check port 80 inter 2 fall 2 rise 1
    server  back 172.16.10.9:8080 backup
###################################################################################
二、提供nfs服務
mkdir /data
setfacl -m d:u:48:rwx /data/
###################################################################################
三、提供Discuzz的數據庫受權用戶
mysql> GRANT ALL ON discuzz.* TO disuser@'172.16.10.%' IDENTIFIED BY 'dispass';
mysql> FLUSH PRIVILEGES;
##################################################################################
啓動服務:
service nfs start
service haproxy restart

在172.16.10.一、172.16.10.77上:

yum install php php-mysql -y 
mkdir /var/www/html/discuzz 
service httpd restart


在172.16.10.122上:

這個節點上只需響應靜態頁面,能夠不安裝php php-mysql。直接掛載

在任意一臺上,掛載nfs,開始安裝discuzz.這裏以172.16.10.77爲例:

大體步驟:
一、mount -t nfs 172.16.10.9:/data/ /var/www/html/discuzz/
二、解壓discuzz安裝包,將解壓後的upload中的全部文件複製到/var/www/html/discuzz/
三、開始安裝:http;//172.16.10.77/discuzz/install/index.php

按照提示解決問題並安裝,最關鍵的是數據庫信息的填寫:

11

安裝完成後,在172.16.10.122和172.16.10.1上:mount -t nfs 172.16.10.9:/data/ /var/www/html/discuzz/ 開始測試:

13

14

前端調度:

15

此時,將靜態頁面服務器172.16.10.122中止,結果:

16

實現了必定程度上的動靜分離。

關於haproxy更多,更詳細的內容,參考官方文檔。

相關文章
相關標籤/搜索