HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在時下的硬件上,完全可以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。
HAProxy實現了一種事件驅動、單一進程模型,此模型單進程響應多請求,持非常大的併發連接數。多進程或多線程模型受內存限制 、系統調度器限制以及無處不在的鎖限制,很少能處理數千併發連接。事件驅動模型因爲在有更好的資源和時間管理的用戶端(User-Space) 實現所有這些任務,所以沒有c10k這些問題。此模型的弊端是,在多核系統上,這些程序通常擴展性較差。這就是爲什麼他們必須進行優化以 使每個CPU時間片(Cycle)做更多的工作。
————百度百科
Big O: 評判數據結構複雜度
O(1):
O(logN): 紅黑樹
O(n)
O(n^2)
O(2^n)
haproxy: 彈性二叉樹
數據結構:
Remote Desktop Protocol
Windows: 3389
HAProxy是免費、極速且可靠的用於爲TCP和基於HTTP應用程序提供高可用、負載均衡和代理服務的解決方案,尤其適用於高負載且需要持久連接或7層處理機制的web站點。
HAProxy目前主要有兩個版本:
1.4——提供較好的彈性(負載):衍生於1.2版本,並提供了額外的新特性,其中大多數是期待已久的。
客戶端側的長連接(client-side keep-alive)----
TCP加速(TCP speedups)
響應池(response buffering)----響應緩衝
RDP協議----Remote Desktop Protocol Windows: 3389;以windows的遠程桌面做負載
基於源的粘性(source-based stickiness)----同一IP只會到同一上級服務器
更好的統計數據接口(a much better stats interfaces)----作訪問控制
更詳細的健康狀態檢測機制(more verbose health checks)
基於流量的健康評估機制(traffic-based health)
支持HTTP認證
服務器管理命令行接口(server management from the CLI)
基於ACL的持久性(ACL-based persistence)
日誌分析器
1.3——內容交換和超強負載:衍生於1.2版本,並提供了額外的新特性。
內容交換(content switching):基於任何請求標準挑選服務器池;
ACL:編寫內容交換規則;
負載均衡算法(load-balancing algorithms):更多的算法支持;
內容探測(content inspection):阻止非授權協議;
透明代理(transparent proxy):在Linux系統上允許使用客戶端IP直接連入服務器;
內核TCP拼接(kernel TCP splicing):無copy方式在客戶端和服務端之間轉發數據以實現數G級別的數據速率;
分層設計(layered design):分別實現套接字、TCP、HTTP處理以提供更好的健壯性、更快的處理機制及便捷的演進能力;
快速、公平調度器(fast and fair scheduler):爲某些任務指定優先級可實現理好的QoS;
會話速率限制(session rate limiting):適用於託管環境;
支持的平臺及OS:
x86、x86_64、Alpha、SPARC、MIPS及PARISC平臺上的Linux 2.4;
x86、x86_64、ARM (ixp425)及PPC64平臺上的Linux2.6;
UltraSPARC 2和3上的Sloaris 8/9;
Opteron和UltraSPARC平臺上的Solaris 10;
x86平臺上的FreeBSD 4.1-8;
i386, amd64, macppc, alpha, sparc64和VAX平臺上的OpenBSD 3.1-current;
若要獲得最高性能,需要在Linux 2.6或打了epoll補丁的Linux 2.4上運行haproxy 1.2.5以上的版本。haproxy 1.1l默認使用的polling系統爲select(),其處理的文件數達數千個時性能便會急劇下降。1.2和1.3版本默認的爲poll(),在有些操作系統上可會也會有性能方面的問題,但在Solaris上表現相當不錯。HAProxy 1.3在Linux 2.6及打了epoll補丁的Linux 2.4上默認使用epoll,在FreeBSD上使用kqueue,這兩種機制在任何負載上都能提供恆定的性能表現。
在較新版本的Linux 2.6(>=2.6.27.19)上,HAProxy還能夠使用splice()系統調用在接口間無複製地轉發任何數據,這甚至可以達到10Gbps的性能。
基於以上事實,在x86或x86_64平臺上,要獲取最好性能的負載均衡器,建議按順序考慮以下方案。
Linux 2.6.32及之後版本上運行HAProxy 1.4;
打了epoll補丁的Linux 2.4上運行HAProxy 1.4;
FreeBSD上運行HAProxy 1.4;
Solaris 10上運行HAProxy 1.4;
性能
HAProxy藉助於OS上幾種常見的技術來實現性能的最大化。
單進程、事件驅動模型顯著降低了上下文切換的開銷及內存佔用。
O(1)事件檢查器(event checker)允許其在高併發連接中對任何連接的任何事件實現即時探測。
在任何可用的情況下,單緩衝(從磁盤空間到內核空間額內存,直接調用,不要複製到用戶進程空間)機制能以不復制任何數據的方式完成讀寫操作,這會節約大量的CPU時鐘週期及內存帶寬;
藉助於Linux 2.6 (>= 2.6.27.19)上的splice()系統調用,HAProxy可以實現零複製轉發(Zero-copy forwarding),在Linux 3.5及以上的OS中還可以實現零複製啓動(zero-starting);
內存分配器(每建立會話,會做內存空間保存會話的數據,內核申請內存,當內核申請較大,內存需要到(內存分配器),否則會產生內存碎片,影響性能)在固定大小的內存池中可實現即時內存分配,這能夠顯著減少創建一個會話的時長;
樹型存儲:側重於使用作者多年前開發的彈性二叉樹,實現了以O(log(N))的低開銷來保持計時器命令、保持運行隊列命令及管理輪詢及最少連接隊列;
優化的HTTP首部分析:優化的首部分析功能避免了在HTTP首部分析過程中重讀任何內存區域;
精心地降低了昂貴的系統調用,大部分工作都在用戶空間完成,如時間讀取、緩衝聚合及文件描述符的啓用和禁用等;
所有的這些細微之處的優化實現了在中等規模負載之上依然有着相當低的CPU負載,甚至於在非常高的負載場景中,5%的用戶空間佔用率和95%的系統空間佔用率也是非常普遍的現象,這意味着HAProxy進程消耗比系統空間消耗低20倍以上。因此,對OS進行性能調優是非常重要的。即使用戶空間的佔用率提高一倍,其CPU佔用率也僅爲10%,這也解釋了爲何7層處理對性能影響有限這一現象。由此,在高端系統上HAProxy的7層性能可輕易超過硬件負載均衡設備。
在生產環境中,在7層處理上使用HAProxy作爲昂貴的高端硬件負載均衡設備故障故障時的緊急解決方案也時長可見。硬件負載均衡設備在“報文”級別處理請求,這在支持跨報文請求(request across multiple packets)有着較高的難度,並且它們不緩衝任何數據,因此有着較長的響應時間。對應地,軟件負載均衡設備使用TCP緩衝,可建立極長的請求,且有着較大的響應時間。
可以從三個因素來評估負載均衡器的性能:
會話率:會話創建能力,單位時間創建多少會話
會話併發能力:負載均衡器上承受多少會話同時就行
數據率:會話併發時數據交換能力
LB解決方案
硬件:
F5:BIG IP
Citrix: NetScaler
A10: A10
RedWare
軟件:
4 layer:lvs;haproxy
7 layer(http):httpd (tomcat);nginx;haproxy (http);ats(apache traffic server);apache
mysql: mysql-porxy
緩存:varnish, squid
ats
lvs: 400W
haproxy: 3W
http代理:
正向代理:爲客戶端代爲上網請求,內容緩存本地服務器,起到代理的作用。(代爲客戶端在互聯網取數據)
問題:(1)無法對上網加速
(2)對於內容無法訪問控制
反向代理:Haproxy;nginx。代表某個服務器響應客戶端請求,接受請求;一手託兩家愛麗接受請求,從服務器封裝給客戶端。
私有代理:爲部分人代理
公共代理:爲所有人代理
代理的作用:
訪問控制、web緩存(加速)、反向代理、內容路由(根據流量及內容類型等條件將請求轉發至特定的服務器)、轉碼器
在代理服務器上添加Via首部
緩存的作用:
減少冗餘內容的傳輸;
節省帶寬、緩解網絡瓶頸
降低了對原始服務器的請求吃力
降低了傳輸延遲
HAProxy:只是http協議的反向代理,但支持tcp層對基於tcp的應用層做LB;
HAPorxy:
安裝:
CentOS 6.4+:
yum install haproxy
配置文件:/etc/haproxy/haproxy.cfg
服務腳本:/etc/rc.d/init.d/haproxy
主程序:/usr/sbin/haproxy
nginx:
upstream s1 {
ip_hash
server
server
}
upstream s2 {
}
server {
listen
server_name
proxy_pass
}
server {
}
haproxy:
frontend
backend
listen(固定frontend;backend)
default(公共配置)
配置的組成部分:
全局配置:
global
代理配置:
defaults, frontend, backend, listen
優先級:
命令行參數、global、proxies
[root@node200 ~]# yum info haproxy
已加載插件:fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* epel: mirror01.idc.hinet.net
* extras: mirrors.163.com
* updates: mirrors.aliyun.com
可安裝的軟件包
Name : haproxy
Arch : x86_64
Version : 1.5.4
Release : 2.el6_7.1
Size : 792 k
Repo : updates
Summary : HAProxy is a TCP/HTTP reverse proxy for high availability
: environments
URL : http://www.haproxy.org/
License : GPLv2+
Description : HAProxy is a TCP/HTTP reverse proxy which is particularly suited
: for high availability environments. Indeed, it can:
: - route HTTP requests depending on statically assigned cookies
: - spread load among several servers while assuring server
: persistence through the use of HTTP cookies
: - switch to backup servers in the event a main one fails
: - accept connections to special ports dedicated to service
: monitoring
: - stop accepting connections without breaking existing ones
: - add, modify, and delete HTTP headers in both directions
: - block requests matching particular patterns
: - persists clients to the correct application server depending
: on application cookies
: - report detailed status as HTML pages to authenticated users
: from a URI intercepted from the application
[root@node200 ~]# yum install haproxy -y
[root@node200 haproxy]# cp haproxy.cfg{,.bak}
[root@node200 haproxy]# ls
haproxy.cfg haproxy.cfg.bak
[root@node200 ~]# vim /etc/rsyslog.conf
# Provides UDP syslog reception
12 # Provides UDP syslog reception
13 $ModLoad imudp
14 $UDPServerRun 514
61 local7.* /var/log/boot.log
63 local2.* /var/log/haproxy.log
[root@node200 ~]# service rsyslog restart
關閉系統日誌記錄器: [確定]
啓動系統日誌記錄器: [確定]
[root@node200 ~]# ss -uan
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 *:514 *:*
UNCONN 0 0 *:631 *:*
UNCONN 0 0 :::514 :::*
[root@node2 ~]# getenforce
Enforcing
[root@node2 ~]# setenforce 0
[root@node2 ~]# iptables -F
[root@node2 ~]# echo "<h1>node 2</h1>" > /var/www/html/index.html
[root@node2 ~]# service httpd reload
[root@node2 ~]# getenforce
Enforcing
[root@node2 ~]# setenforce 0
[root@node2 ~]# iptables -F
[root@node2 ~]# curl http://127.0.0.1
<h1>node 2</h1>
[root@node3 ~]# echo "<h1>node 3</h1>" > /var/www/html/index.html
[root@node3 ~]# setenforce 0
[root@node3 ~]# iptables -F
[root@node3 ~]# service httpd reload
重新載入 httpd:
[root@node3 ~]# curl http://127.0.0.1
<h1>node 3</h1>
[root@node200 ~]# curl http://192.168.112.130
<h1>node 2</h1>
[root@node200 ~]# curl http://192.168.112.140
<h1>node 3</h1>
[root@node200 haproxy]# vim haproxy.cfg
63 frontend main *:80
64 # acl url_static path_beg -i /static /p_w_picpaths /javascript /s tylesheets
65 # acl url_static path_end -i .jpg .gif .png .css .js
66
67 #use_backend static if url_static
68 default_backend appsrvs
69
70 #---------------------------------------------------------------------
71 # static backend for serving up p_w_picpaths, stylesheets and such
72 #---------------------------------------------------------------------
73 #backend static
74 # balance roundrobin
75 # server static 127.0.0.1:4331 check
76
77 #---------------------------------------------------------------------
78 # round robin balancing between the various backends
79 #---------------------------------------------------------------------
80 backend appsrvs
81 balance roundrobin
82 server node2 192.168.112.130:80 check
83 server node3 192.168.112.140:80 check
84 # server app3 127.0.0.1:5003 check
85 # server app4 127.0.0.1:5004 check
[root@node200 haproxy]# ss -tuanlp | grep 80
udp UNCONN 0 0 *:514 *:* users:(("rsyslogd",30080,3))
udp UNCONN 0 0 :::514 :::* users:(("rsyslogd",30080,4))
tcp LISTEN 0 128 *:80 *:* users:(("haproxy",30120,5))
[root@node200 haproxy]# firefox http://192.168.112.200