一、HAProxy (反向代理)
1、名詞解釋:
提供高可用性、負載均衡以及基于TCP/HTTP(反向代理mysql等所有支援tcp的應用)應用的代理,支援虛拟主機,免費可靠的解決方案。可操作性優于nginx,但是消耗了更多的資源。是工作在七層上的基于事件驅動的單一程序來響應衆多請求的負載均衡伺服器,并且有web管理界面便于監督。功能上更專注于反向代理,比nginx有更豐富和簡單的反向代理功能,但是相對記憶體消耗也更大一些。
反向代理的基本工作模式,首先接受使用者請求,然後自身通過負載均衡算法計算發往後端主機的ip位址,然後進行類似NAT的位址轉換發送到後端伺服器,後端伺服器接收并處理完畢後發送給反向代理伺服器,并由反向代理伺服器重新封裝發送給用戶端。
lvs和nginx、haproxy等七層負載均衡伺服器之間的差別就是lvs工作在四層,有有着更高的性能優勢,但是管理功能上不如nginx、haproxy。是以lvs的優勢就是轉發的高性能,以及對socket的無限制使用,也就是說對于并發連接配接請求沒有限制,而nginx、haproxy對于并發連接配接是由最高要求的,就是65535個,這個是死的,不可改變的。
nginx的反向代理基本配置,首先建立upstream子產品,并在裡面指定負載均衡算法,後端伺服器等,然後在server或者local中通過proxy_pass來和upstream建立關系。
2、特點:
各個版本有不同的特性,傾向于1.4及其後的版本
centos6.4以後整合在系統中,不需要安裝
使用彈性二叉樹的資料結構
可以通過URL進行負載均衡,提高緩存命中率。(重要特性)
若要獲得最佳性能,需要使用linux2.6核心或者打了epoll更新檔的linux2.4的版本,此時使用的是epoll。haproxy1.1預設使用的polling系統為select(),其處理檔案數達到數千個時性能會急劇下降。
haproxy借助以下幾個常見的技術實作性能的最大化
1、單程序事件驅動顯著降低了上下文切換的開銷和記憶體占用
2、bigo(1)事件檢查器準許其在高并發連接配接中對任何的任何事件實時即時探測
3、單緩沖機制可以在不複制任何資料的情況下完成讀寫操作,節省cpu時鐘周期
4、借助linux2.6的splice()系統調用,實作零複制轉發,及零複制啟動
5、MRU記憶體配置設定器在在固定大小的記憶體池中實作即時記憶體配置設定
6、優化的HTTP首部分析,避免了HTTP首部分析過程中重讀問題
3、haproxy工作位置:
web伺服器前面
應用伺服器前
資料庫伺服器前
二、配置詳解
1、haproxy的配置處理順序:
1、指令行參數
2、global(全局)配置段:定義程序工作特性、日志檔案及其他全局配置特性
3、proxy(代理)相關配置段:包括
default
listen(可以直接将前後端定義在此位置)
frontend(定義面向前端)
use-backend(粘合前後端)
default-backend(粘合前後端)
backend(定義面向後端)
2、全局段
2.1、haproxy程序管理及安全相關的參數:
1、chroot,修改haproxy的工作目錄到指定目錄,提高安全性
2、daemon,以守護程序的方式工作于背景
3、nbproc,啟動程序格式,預設1個,建議也是1個
4、ulimit-n,每個程序最大打開的檔案描述符個數,通常會自動計算,這個也不用動
5、node,用于定義目前工作節點的名稱
6、pidfile
2.2、性能調整的相關參數:(基本保持參數預設值即可)
1、maxconn,程序接受的最大并發連接配接數
2、maxpipes,haproxy使用pipe完成基于核心的tcp封包重組,用于設定每個程序允許的最大pipe個數,通常不用調整
3、nosplice,禁止linux套接字上使用核心tcp重組,不禁用
4、spread-checks,設定檢查後端伺服器的時間間隔
5、tune.chksize,設定緩沖區大小,機關是位元組
default:用于定義所有其他配置段提供預設參數
frontend:用于定義一系列監聽的套接字,可接受用戶端請求并與之建立聯系
backend:用于定義一系列“後端”伺服器,代理會将前端用戶端的請求發送到後端伺服器上。
listen:通過關聯“前端”和“後端”定義了一個完整的代理,通常隻對tcp流量有用,通常定義了listen不用再定義frontend和backend。
3.1常見參數:
balance 負載均衡
負載均衡算法
roundrobin:基于權重進行輪叫,在伺服器處理時間均衡的情況下,這種是最平衡,公平的算法。權重會系統動态調整,每個後端伺服器最大接受4128個連接配接。
static-rr:基于權重的輪叫和roundrobin類似,對後端伺服器沒有連接配接限制。
leastconn:新的連接配接發送到具有最少連接配接數目的後端伺服器,适用于長連接配接。不适用于http。
source:将請求的源位址進行hash計算,并由後端伺服器的權重總數相除後發送到比對的伺服器,優點是同一個ip位址的用戶端請求發送到同一個後端伺服器上。
uri:對uri的左半部分(問号之前)或者整個uri進行hash運算,并由伺服器的權重總數相除後派發到後端比對的伺服器,可以對同一個uri的請求總是派發到某一個特定的伺服器,此算法常用于代理緩存,反病毒代理。僅适用于http後端伺服器場景。
uri-param:通過<argusent>為uri指定的參數在每個http get請求中将會被檢索,如果找到了指定的參數并通過等于号被賦予了一個值,那麼此值将被執行hash運算并被伺服器的總權重相除後派發到指定的伺服器,此算法可以通過跟蹤請求中的使用者辨別進而确定同一個使用者ID的請求被送往同一個特定的伺服器。
hdr:對于每個http請求,通過<name>指定的http首部将會被檢索,如果相應的首部沒有出現或者沒有有效值,則使用輪叫算法處理請求。
bind <address>:<port_range>:指定監聽的端口和ip位址
address可以是主機名,IP位址,使用*或者0.0.0.0表示監聽目前系統的所有IP位址
mode {tcp|http|health}
設定執行個體運作的協定或模式,當實作内容交換時,前端和後端必須工作在同一種模式,否則無法啟動執行個體。
tcp:運作于純tcp模式,在用戶端和伺服器之間建立一個全雙工的連結,且不會對7層封包做任何類型的檢查,預設模式,常用于SSL、SSH、SMTP中。
http:運作于http模式,用戶端請求在轉發到後端伺服器之前被深度分析,所有不與RFC格式相容的請求都被拒絕
health:運作于health模式,其對入站請求僅僅響應“ok”資訊,并關閉連接配接,且不會記錄任何日志資訊,此模式将用于響應外部元件的健康狀态檢查請求,就目前講,此模式已經廢棄
hash-type
用于将hash碼映射到後端伺服器的方法,其不能用于frontend區段,可用方法有mapbased和consistent,大多數推薦使用map-based方法。consistent适用于後端是緩存伺服器的情況。
log global
log <address> <facility>[ <level> <minlevel> ]
為每個執行個體啟動事件和流量日志,适用于全部區段,每個執行個體最多指定兩個log參數
global:目前執行個體的日志系統參數同“global”段中的定義時,每個執行個體僅能定義一次“log global”語句,且其沒有任何額外參數。
address:定義日志發往的位置,格式可以使ip:port的形式,其中port為UDP協定端口,預設是514
facility:可以為syslog系統标準的facility之一
level:定義日志等級,預設是所有資訊,指定級别時,所有等于和高于此級别的日志被記錄并發送
maxconn
設定一個前端的最大并發連接配接數,是以,其不能用于backend區段,此值不能超過“global”端的定義值,需要注意的是,haproxy為每個連接配接維持兩個緩沖,每個緩沖大約8kB,再加上其他資料,每個連接配接大約占17KB的RAM空間,這就意味着經過适當優化後,有這1GB的可用RAM空間時将能夠維持40000-50000的并發數。預設是2000
default_backend <backend>
在沒有比對的“use_backend”規則時為執行個體指定預設後端,是以不适用于backend區段,在“frontend”和“backend”之間進行内容交換時,通常使用“use_backend”定義其比對規則,而沒有被規則比對的請求将由此參數指定的後端接收。
server <name> <address>[<:port> param]
為後端聲明一個server,是以,不能用于defaults和frontend區段。
name:為伺服器指定一個内部的名稱,其将出現雜日志和警告資訊中
address:此伺服器的IP位址
port:指定将連接配接請求發往的此伺服器時的目标端口
param:可以使用的參數
backup:設定為備用伺服器,僅僅在負載均衡場景中的其他server均不可用時啟動此server
check:啟動對此server執行健康狀态檢查,其可以借助于額外的其他參數完成更細緻的設定,如:
inter <delay>:設定健康狀态檢查時的時間間隔,機關為毫秒,預設2000,可以使用fastinter和downinter來根據伺服器端狀态優化此時間延遲。
rise<count>:設定健康狀态檢查時,其離線的server從離線狀态到正常狀态需要成功檢查的次數
fall<count>:确認server從正常狀态到不可用狀态需要檢查的次數
cookie <value>:為指定server設定cookie值,此值将在請求入站時被檢查,第一次為此值挑選的server将在後續的請求中被選中,其目的是實作持久連結的功能。
maxconn<maxconn>:指定此伺服器接受的最大并發連接配接數,如果發往此伺服器的連接配接數高于此設定的值,将放置到請求隊列,等待其他連接配接被釋放。
maxqueue<maxqueue>:設定請求隊列的最大長度
observe<mode>:通過觀察伺服器的通信狀态來判斷健康狀态,預設禁用,使用的參數包括“layer4”和“layer7”,http使用“layer7”
redir <prefix>:啟用重定向功能,将發往此伺服器的GET和HEAD請求均以302狀态碼響應
weight<weight>:權重,預設是1,最大256,0表示不參與負載均衡
http狀态檢查方法:
option httpchk
option httpchk <uri>
option httpchk <method><uri>
option httpchk <method><uri><version>
capture request header <name> len <length>
捕獲并記錄指定的請求手表最近一次出現時的第一個值,僅僅用于“frontend”和“listen”區段,捕獲的首部值使用花括号{}括起來後添加進日志中,如果需要捕獲多個首部值,他們将以指定的次序出現在日志中,并以“|”作為分隔符,不存在的首部記錄為空字元串,最常需要捕獲的首部資訊包括在虛拟主機環境中使用的“host”,上傳請求首部中的“content-length”,快速區分真實使用者和網絡機器人的“user-agent”,以及代理環境中記錄真實請求來源的“x-forword-for”。
name:要捕獲的首部的名稱,此名稱不區分大小寫
length:指定首部值時鎖記錄的精确長度,超出部分被忽略丢棄。
可以捕獲的請求首部沒有個數限制,但每個捕獲的記錄最大64個字元,為保證同一個frontend中日志格式的統一,首部捕獲隻能在frontend中定義。
capture response header
捕獲并記錄響應首部,格式和要點同請求首部
stats enable
用于基于程式編譯時預設設定的統計報告,不能用于“frontend”區段,以下是預設配置:
stats uri:/haproxy?stats
stats realm:”HAProxy statistics"
stats auth: no authentication
stats scope: no restriction
建議設定參數而不是使用預設值
stats hide-version
啟用統計報告并隐藏haproxy版本資訊,不能用于“frontend”區段。
stats realm <realm>
啟動統計報告并高精度認證領域,實作http基本認證時顯示在浏覽器中的領域名稱,用于提示使用者輸入一個使用者名和密碼
stats scope <name>
啟動統計報告并限制報告的區段,僅顯示其列出的區段的報告資訊
stats auth <user>:<passwd>
啟動帶認證的統計報告功能并授權一個使用者賬戶。
stats admin {if|unless} <cond>
指定的條件滿足時啟動統計報告頁面的管理級别功能,它允許通過web接口啟動和禁用伺服器。
樣例:
backend stats——localhost
stats admin if localhost
option httplog [clf]
啟動記錄http請求,會話狀态和計時器的功能
clf:使用clf格式來替代http格式,通常不用。
optin logasap
啟用或者禁用提前将http請求計入日志,不能用于“backend”區段
option forwardfor
允許在發往後端伺服器的請求首部插入“x-forwarded-for”首部(真實客戶機位址資訊)
三、安裝和部署
centos6.5及以上版本系統可以通過yum方式直接安裝haproxy,可也從官網下載下傳最新版本進行安裝。
我這裡就是yum安裝并進行示範。
環境說明:
haproxy伺服器:
前端ip:192.168.4.206
後端ip:10.40.0.226
後端httpd伺服器:
ip位址:10.40.0.228
IP位址:10.40.0.229
1、haproxy基本安裝檔案資訊
[[email protected] ~]# rpm -ql haproxy
/etc/haproxy
/etc/haproxy/haproxy.cfg 配置檔案
/etc/logrotate.d/haproxy 日志輪轉
/etc/rc.d/init.d/haproxy 啟動腳本
/etc/sysconfig/haproxy
/usr/bin/halog 日志分析工具
/usr/bin/iprange
/usr/sbin/haproxy
本文轉自 blackstome 51CTO部落格,原文連結:http://blog.51cto.com/137783/1968803,如需轉載請自行聯系原作者