1.HAProxy簡介
HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在時下的硬件上,完全可以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。
HAProxy實現了一種事件驅動、單一進程模型,此模型支持非常大的併發連接數。多進程或多線程模型受內存限制 、系統調度器限制以及無處不在的鎖限制,很少能處理數千併發連接。事件驅動模型因爲在有更好的資源和時間管理的用戶端(User-Space) 實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程序通常擴展性較差。這就是爲什麼他們必須進行優化以 使每個CPU時間片(Cycle)做更多的工作。
HAProxy是免費、極速且可靠的用於爲TCP和基於HTTP應用程序提供高可用、負載均衡和代理服務的解決方案,尤其適用於高負載且需要持久連接或7層處理機制的web站點。
2.HAProxy性能詳解
1).基於單進程、事件驅動模型顯著降低了上下文切換的開銷及內存佔用。
2).事件檢查器(event checker)允許其在高併發連接中對任何連接的任何事件實現即時探測。
3).在任何可用的情況下,單緩衝(single buffering)機制能以不復制任何數據的方式完成讀寫操作,這會節約大量的CPU時鐘週期及內存帶寬;
4).藉助於Linux 2.6 (>= 2.6.27.19)上的splice()系統調用,HAProxy可以實現零複製轉發(Zero-copyforwarding),在現在的新版本的Linux OS中還可以實現零複製啓動(zero-starting)
5).MRU內存分配器在固定大小的內存池中可實現即時內存分配,這能夠減少創建一個會話的時長;
6).樹型存儲:彈性二叉樹,實現了接近以O(1)的低開銷來保持計時器命令、保持運行隊列命令及管理輪詢及最少連接隊列;
7).優化的HTTP首部分析:優化的首部分析功能避免了在HTTP首部分析過程中重讀任何內存區域;
8).支持客戶端側的長連接(client-side keep-alive)並且支持TCP加速(TCP speedups)
9).基於源的粘性(source-based stickiness)及更詳細的健康狀態檢測(more verbose health checks)
3.HAPROTXY的主要特性
1)、HAProxy是支持虛擬主機的。
2)、能夠補充Nginx的一些缺點比如Session的保持,Cookie的引導等工作
3)、支持url檢測後端的服務器出問題的檢測會有很好的幫助。
4)、它跟LVS一樣,本身僅僅就只是一款負載均衡軟件;單純從效率上來講HAProxy更會比Nginx有更出色的負載均衡速度,在併發處理上也是優於Nginx的。
5)、HAProxy可以對Mysql讀進行負載均衡,對後端的MySQL節點進行檢測和負載均衡,不過在後端的MySQL slaves數量超過10臺時性能不如LVS,所以我向大家推薦LVS+Keepalived。
6)、HAProxy的算法現在也越來越多了,具體有如下8種:
①roundrobin,表示簡單的輪詢,這個是負載均衡基本都具備的;
②static-rr,表示根據權重,建議關注;
③leastconn,表示最少連接者先處理,建議關注;
④source,表示根據請求源IP,這個跟Nginx的IP_hash機制類似,我們用其作爲解決session問題的一種方法,建議關注;
⑤ri,表示根據請求的URI;
⑥rl_param,表示根據請求的URl參數'balance url_param' requires an URL parameter name;
⑦hdr(name),表示根據HTTP請求頭來鎖定每一次HTTP請求;
⑧rdp-cookie(name),表示根據據cookie(name)來鎖定並哈希每一次TCP請求
4.簡單安裝和示例配置
安裝:在CentOS6的系統鏡像中默認已經集成了HAProxy,版本爲1.4.22。在這裏我們使用yum裝:
[root@HAProxy ~]# yum install haproxy #安裝
[root@HAProxy ~]# rpm -ql haproxy #查看生成的配置文件
/etc/haproxy
/etc/haproxy/haproxy.cfg
/etc/logrotate.d/haproxy
/etc/rc.d/init.d/haproxy
/usr/bin/halog
/usr/sbin/haproxy
/usr/share/doc/haproxy-1.4.22
......
簡單配置:
[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
global #全局設置
log 127.0.0.1 local2 #定義日誌的記錄的級別和服務器地址
chroot /var/lib/haproxy #限定相關用戶的訪問目錄
pidfile /var/run/haproxy.pid #pid文件的設置
maxconn 4000 #最大連接數的設置
user haproxy #定義運行服務的用戶
group haproxy #屬組
daemon #設置服務後臺運行
stats socket /var/lib/haproxy/stats #打開狀態檢測socket
listen stats #關聯前端和後端定義一個定義一個完整的代理
mode http #設置代理協議
bind *:1080 #綁定相應的端口
stats enable #開啓狀態檢測
stats hide-version #隱藏代理服務器版本
stats uri /stats #設置資源詳細記錄
stats realm haproxy_stats #設置登錄認證提示信息
stats auth admin:admin #設置登錄用戶和密碼
frontend main *:8080 #定義監聽套接字
acl url_static path_end -i .jpg .gif .png .css .js #acl匹配靜態資源
use_backend static if url_static #如果匹配靜態資源使用static
default_backend app #否則使用默認的後端服務器
backend static #定義後端服務器的設置(匹配靜態)
balance roundrobin #使用動態的輪詢調度算法
server static 192.168.21.4:80 check #設置代理的後端服務器地址
backend app #定義匹配默認的後端服務器
balance roundrobin
server app1 192.168.21.1:80 check
定義haproxy雙網卡一個RIP 192.168.1.110 一個VIP 10.0.0.1
後端定義靜態內容服務器一個vip 10.0.0.2
動態內容服務器vip 10.0.0.3
haproxy的配置文件如下
listen stats mode http bind *:1080 stats enable stats hide-version stats uri /stats stats realm haproxy_stats stats auth admin:admin frontend main *:8080 acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend app backend static balance roundrobin server static 10.0.0.2:80 check backend app balance roundrobin server 10.0.0.3:80 check