天天看點

負載均衡叢集解決方案(三)haproxy

一、haproxy簡介

HAProxy is a free, very fast and reliable solution offering high availability, load balancing, and proxying for TCP and HTTP-based applications. It is particularly suited for web sites crawling under very high loads while needing persistence or Layer7 processing. Supporting tens of thousands of connections is clearly realistic with todays hardware. Its mode of operation makes its integration into existing architectures very easy and riskless, while still offering the possibility not to expose fragile web servers to the Net。

                                                              摘自:http://haproxy.1wt.eu

二、haproxy叢集工作流程

<a href="http://blog.51cto.com/attachment/201301/172517892.png" target="_blank"></a>

三、haproxy安裝

# tar -xzvf haproxy-1.3.20.tar.gz

# make TARGET=linux26 PREFIX=/usr/local/haproxy install

注:TARGET後面根據本機作業系統核心版本來填寫

建立配置檔案目錄,日志目錄,并根據需求編寫配置檔案

# mkdir /usr/local/haproxy/{conf,logs}

# vim /usr/local/haproxy/conf/haproxy.cfg

配置haproxy的日志環境

# vim /etc/syslog.conf 

添加: 

local0.*        /usr/local/logs/haproxy.log 

local3.*        /usr/local/logs/haproxy_err.log 

#vim /etc/sysconfig/syslog 

修改: 

SYSLOGD_OPTIONS="-r -m 0" 

service syslog restart

注: -r enables logging from remote machines

四、haproxy配置詳解 

HAProxy配置中分五大部分:

global:全局配置參數,程序級的,用來控制Haproxy啟動前的一些程序及系統設定

defaults:配置一些預設的參數,可以被frontend,backend,listen段繼承使用

frontend:用來比對接收客戶所請求的域名,uri等,并針對不同的比對,做不同的請求處理

backend:定義後端伺服器叢集,以及對後端伺服器的一些權重、隊列、連接配接數等選項的設定,我将其了解為Nginx中的upstream塊

listen:我将其了解為frontend和backend的組合體

配置一例:

global   # 全局參數的設定 

     log 127.0.0.1 local0 info 

     # log文法:log [max_level_1] 

     # 全局的日志配置,使用log關鍵字,指定使用127.0.0.1上的syslog服務中的local0日志裝置,記錄日志等級為info的日志 

     user haproxy 

     group haproxy 

     # 設定運作haproxy的使用者群組,也可使用uid,gid關鍵字替代之 

     daemon 

     # 以守護程序的方式運作 

     nbproc 16

     # 設定haproxy啟動時的程序數,根據官方文檔的解釋,我将其了解為:該值的設定應該和伺服器的CPU核心數一緻,即常見的2顆8核心CPU的伺服器,即共有16核心,則可以将其值設定為:&lt;=16 ,建立多個程序數,可以減少每個程序的任務隊列,但是過多的程序數也可能會導緻程序的崩潰。這裡我設定為16 

     maxconn 4096 

     # 定義每個haproxy程序的最大連接配接數 ,由于每個連接配接包括一個用戶端和一個伺服器端,是以單個程序的TCP會話最大數目将是該值的兩倍。 

     #ulimit -n 65536 

     # 設定最大打開的檔案描述符數,在1.4的官方文檔中提示,該值會自動計算,是以不建議進行設定 

     pidfile /var/run/haproxy.pid 

     # 定義haproxy的pid

defaults # 預設部分的定義

     mode http

     # mode文法:mode {http|tcp|health} 。http是七層模式,tcp是四層模式,health是健康檢測,傳回OK

     log 127.0.0.1 local3 err

     # 使用127.0.0.1上的syslog服務的local3裝置記錄錯誤資訊

     retries 3

     # 定義連接配接後端伺服器的失敗重連次數,連接配接失敗次數超過此值後将會将對應後端伺服器标記為不可用

     option httplog

     # 啟用日志記錄HTTP請求,預設haproxy日志記錄是不記錄HTTP請求的,隻記錄“時間[Jan 5 13:23:46] 日志伺服器[127.0.0.1] 執行個體名已經pid[haproxy[25218]] 資訊[Proxy http_80_in stopped.]”,日志格式很簡單。

     option redispatch

     # 當使用了cookie時,haproxy将會将其請求的後端伺服器的serverID插入到cookie中,以保證會話的SESSION持久性;而此時,如果後端的伺服器宕掉了,但是用戶端的cookie是不會重新整理的,如果設定此參數,将會将客戶的請求強制定向到另外一個後端server上,以保證服務的正常。

     option abortonclose

     # 當伺服器負載很高的時候,自動結束掉目前隊列處理比較久的連結

     option dontlognull

     # 啟用該項,日志中将不會記錄空連接配接。所謂空連接配接就是在上遊的負載均衡器或者監控系統為了探測該服務是否存活可用時,需要定期的連接配接或者擷取某一固定的元件或頁面,或者探測掃描端口是否在監聽或開放等動作被稱為空連接配接;官方文檔中标注,如果該服務上遊沒有其他的負載均衡器的話,建議不要使用該參數,因為網際網路上的惡意掃描或其他動作就不會被記錄下來

     option httpclose

     # 這個參數我是這樣了解的:使用該參數,每處理完一個request時,haproxy都會去檢查http頭中的Connection的值,如果該值不是close,haproxy将會将其删除,如果該值為空将會添加為:Connection: close。使每個用戶端和伺服器端在完成一次傳輸後都會主動關閉TCP連接配接。與該參數類似的另外一個參數是“option forceclose”,該參數的作用是強制關閉對外的服務通道,因為有的伺服器端收到Connection: close時,也不會自動關閉TCP連接配接,如果用戶端也不關閉,連接配接就會一直處于打開,直到逾時。

     contimeout 5000

     # 設定成功連接配接到一台伺服器的最長等待時間,預設機關是毫秒,新版本的haproxy使用timeout connect替代,該參數向後相容

     clitimeout 3000

     # 設定連接配接用戶端發送資料時的成功連接配接最長等待時間,預設機關是毫秒,新版本haproxy使用timeout client替代。該參數向後相容

     srvtimeout 3000

     # 設定伺服器端回應客戶度資料發送的最長等待時間,預設機關是毫秒,新版本haproxy使用timeout server替代。該參數向後相容

listen status # 定義一個名為status的部分

     bind 0.0.0.0:1080

     # 定義監聽的套接字

     # 定義為HTTP模式

     log global

     # 繼承global中log的定義

     stats refresh 30s

     # stats是haproxy的一個統計頁面的套接字,該參數設定統計頁面的重新整理間隔為30s

     stats uri /admin?stats

     # 設定統計頁面的uri為/admin?stats

     stats realm Private lands

     # 設定統計頁面認證時的提示内容

     stats auth admin:password

     # 設定統計頁面認證的使用者和密碼,如果要設定多個,另起一行寫入即可

     stats hide-version

     # 隐藏統計頁面上的haproxy版本資訊

frontend http_80_in # 定義一個名為http_80_in的前端部分

     bind 0.0.0.0:80

     # http_80_in定義前端部分監聽的套接字

     option forwardfor

     # 啟用X-Forwarded-For,在requests頭部插入用戶端IP發送給後端的server,使後端server擷取到用戶端的真實IP

     acl static_down nbsrv(static_server) lt 1

     # 定義一個名叫static_down的acl,當backend static_sever中存活機器數小于1時會被比對到

     acl php_web url_reg /*.php$

     #acl php_web path_end .php

     # 定義一個名叫php_web的acl,當請求的url末尾是以.php結尾的,将會被比對到,上面兩種寫法任選其一

     acl static_web url_reg /*.(css|jpg|png|jpeg|js|gif)$

     #acl static_web path_end .gif .png .jpg .css .js .jpeg

     # 定義一個名叫static_web的acl,當請求的url末尾是以.css、.jpg、.png、.jpeg、.js、.gif結尾的,将會被比對到,上面兩種寫法任選其一

     use_backend php_server if static_down

     # 如果滿足政策static_down時,就将請求交予backend php_server

     use_backend php_server if php_web

     # 如果滿足政策php_web時,就将請求交予backend php_server

     use_backend static_server if static_web

     # 如果滿足政策static_web時,就将請求交予backend static_server

backend php_server #定義一個名為php_server的後端部分

     # 設定為http模式

     balance source

     # 設定haproxy的排程算法為源位址hash

     cookie SERVERID

     # 允許向cookie插入SERVERID,每台伺服器的SERVERID可在下面使用cookie關鍵字定義

     option httpchk GET /test/index.php

     # 開啟對後端伺服器的健康檢測,通過GET /test/index.php來判斷後端伺服器的健康情況

     server php_server_1 10.12.25.68:80 cookie 1 check inter 2000 rise 3 fall 3 weight 2

     server php_server_2 10.12.25.72:80 cookie 2 check inter 2000 rise 3 fall 3 weight 1

     server php_server_bak 10.12.25.79:80 cookie 3 check inter 1500 rise 3 fall 3 backup

     # server文法:server [:port] [param*]

     # 使用server關鍵字來設定後端伺服器;為後端伺服器所設定的内部名稱[php_server_1],該名稱将會呈現在日志或警報中、後端伺服器的IP位址,支援端口映射[10.12.25.68:80]、指定該伺服器的SERVERID為1[cookie 1]、接受健康監測[check]、監測的間隔時長,機關毫秒[inter 2000]、監測正常多少次後被認為後端伺服器是可用的[rise 3]、監測失敗多少次後被認為後端伺服器是不可用的[fall 3]、分發的權重[weight 2]、最為備份用的後端伺服器,當正常的伺服器全部都當機後,才會啟用備份伺服器[backup]

backend static_server

     option httpchk GET /test/index.html

     server static_server_1 10.12.25.83:80 cookie 3 check inter 2000 rise 3 fall 3

五、健康監測

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 server02 check inter 500 rise 1 fall 2 

2、通過URI擷取進行健康檢測

這種檢測方式,是用過去GET後端server的的web頁面,基本上可以代表後端服務的可用性。

        option httpchk GET /index.html 

3、通過request擷取的頭部資訊進行比對進行健康檢測

這種檢測方式,則是基于進階,精細的一些監測需求。通過對後端服務通路的頭部資訊進行比對檢測。 

        option httpchk HEAD /index.jsp HTTP/1.1\r\nHost:\ www.xxx.com 

六、haproxy實作持久連接配接

1 排程算法source

haroxy 将使用者IP經過hash計算後 指定到固定的真實伺服器上(類似于nginx 的IP hash 指令)

配置指令        balance source

2 cookie 識别  

haproxy 将WEB服務端發送給用戶端的cookie中插入(或添加加字首)haproxy定義的後端的伺服器COOKIE ID。

配置指令例舉  cookie  SESSION_COOKIE  insert indirect nocache

3 session 識别  

haproxy 将後端伺服器産生的session和後端伺服器辨別存在haproxy中的一張表裡。用戶端請求時先查詢這張表。然後根據session配置設定後端server。

配置指令:appsession &lt;cookie&gt; len &lt;length&gt; timeout &lt;holdtime&gt;

七、統計頁面效果圖

<a href="http://blog.51cto.com/attachment/201301/173707446.jpg" target="_blank"></a>

本文轉自 向陽草米奇 51CTO部落格,原文連結:http://blog.51cto.com/grass51/1109825,如需轉載請自行聯系原作者