第一章:HAproxy簡介及安裝配置
對Linux有興趣的朋友加入QQ羣:476794643 在線交流
本文防盜鏈:http://zhang789.blog.51cto.com
目錄
HAproxy簡介
爲什麼要使用HAproxy
haproxy 性能特點
負載均衡器的性能評估因素
安裝HAproxy
haproxy案例4:實現web負載
由於字體過多分開寫的,全系列文章鏈接
第一章:HAproxy簡介及安裝配置 http://zhang789.blog.51cto.com/11045979/1873432
第二章:HAproxy配置文件詳解以及HAproxy的ACL詳解 http://zhang789.blog.51cto.com/11045979/1873435
第三章:HAproxy實例
http://zhang789.blog.51cto.com/11045979/1873436
HAproxy簡介
1、
HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。2、
HAProxy實現了一種事件驅動, 單一進程模型,此模型支持非常大的併發連接數。多進程或多線程模型受內存限制 、系統調度器限制以及無處不在的鎖限制,很少能處理數千併發連接。事件驅動模型因爲在有更好的資源和時間管理的用戶空間(User-Space) 實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程序通常擴展性較差。這就是爲什麼他們必須進行優化以 使每個CPU時間片(Cycle)做更多的工作。(爲了解決上下文切換,可以像nginx一樣綁定cpu上面)
爲什麼要使用HAproxy
1.
免費開源,穩定性也是非常好,這個可通過一些項目可以看出來,單Haproxy也跑得不錯,穩定性可以與硬件級的F5相媲美;2.
根據官方文檔,HAProxy可以跑滿10Gbps-New benchmark of HAProxy at 10 Gbps usingMyricom’s 10GbE NICs (Myri-10G PCI-Express),這個數值作爲軟件級負載均衡器是相當驚人的。3.
HAProxy 支持連接拒絕 : 因爲維護一個連接的打開的開銷是很低的,有時我們很需要限制***蠕蟲(attack bots),也就是說限制它們的連接打開從而限制它們的危害。 這個已經爲一個陷於小型DDoS***的網站開發了而且已經拯救了很多站點,這個優點也是其它負載均衡器沒有的。4.
HAProxy 支持全透明代理(已具備硬件防火牆的典型特點): 可以用客戶端IP地址或者任何其他地址來連接後端服務器. 這個特性僅在Linux 2.4/2.6內核打了cttproxy補丁後纔可以使用,這個特性也使得爲某特殊服務器處理部分流量同時又不修改服務器的地址成爲可能。5.
HAProxy現多於線上的Mysql集羣環境,我們常用於它作爲MySQL(讀)負載均衡。6.
自帶強大的監控服務器狀態的頁面,實際環境中我們結合Nagios進行郵件或短信報警。7.
HAProxy支持虛擬主機。8.
HAProxy特別適用於那些負載特大的web站點, 這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。
注,在功能上,能以proxy反向代理方式實現Web均衡負載,這樣的產品有很多。包括lvs,Nginx,ApacheProxy,lighttpd等。國內生產環境上使用Haproxy的公司很多,例如淘寶的CDN系統,
haproxy 性能特點
HAProxy藉助於OS上幾種常見的技術來實現性能的最大化。
1、
單進程、事件驅動模型顯著降低了上下文切換的開銷及內存佔用。2、
O(1)事件檢查器(event checker)允許其在高併發連接中對任何連接的任何事件實現即時探測。3、
在任何可用的情況下,單緩衝(single buffering)機制能以不復制任何數據的方式完成讀寫操作,這會節約大量的CPU時鐘週期及內存帶寬;4、
藉助於Linux 2.6 (>= 2.6.27.19)上的splice()系統調用,HAProxy可以實現零複製轉發(Zero-copy forwarding),在Linux 3.5及以上的OS中還可以實現零複製啓動(zero-starting);5、
MRU內存分配器在固定大小的內存池中可實現即時內存分配,這能夠顯著減少創建一個會話的時長;6、
樹型存儲:側重於使用作者多年前開發的彈性二叉樹,實現了以O(log(N))的低開銷來保持計時器命令、保持運行隊列命令及管理輪詢及最少連接隊列;7、
優化的HTTP首部分析:優化的首部分析功能避免了在HTTP首部分析過程中重讀任何內存區域;8、
精心地降低了昂貴的系統調用,大部分工作都在用戶空間完成,如時間讀取、緩衝聚合及文件描述符的啓用和禁用等;
所有的這些細微之處的優化實現了在中等規模負載之上依然有着相當低的CPU負載,甚至於在非常高的負載場景中,5%的用戶空間佔用率和95%的系統空間佔用率也是非常普遍的現象,這意味着HAProxy進程消耗比系統空間消耗低20倍以上。因此,對OS進行性能調優是非常重要的。即使用戶空間的佔用率提高一倍,其CPU佔用率也僅爲10%,這也解釋了爲何7層處理對性能影響有限這一現象。由此,在高端系統上HAProxy的7層性能可輕易超過硬件負載均衡設備。
在生產環境中,在7層處理上使用HAProxy作爲昂貴的高端硬件負載均衡設備故障故障時的緊急解決方案也時長可見。硬件負載均衡設備在“報文”級別處理請求,這在支持跨報文請求(request across multiple packets)有着較高的難度,並且它們不緩衝任何數據,因此有着較長的響應時間。對應地,軟件負載均衡設備使用TCP緩衝,可建立極長的請求,且有着較大的響應時間。
負載均衡器的性能評估因素
三個重要因素:
1、會話率 :單位時間內的處理的請求數
2、會話併發能力:併發處理能力
3、數據率:處理數據能力
經過官方測試統計,haproxy 單位時間處理的最大請求數爲20000個,可以同時維護40000-50000個併發連接,最大數據處理能力爲10Gbps。綜合上述,haproxy是性能優越的負載均衡、反向代理服務器。
安裝HAproxy
1、安裝haproxy
[root@localhost ~]# yum -y groupinstall "Development Tools"
[root@localhost ~]# yum -y install haproxy
2、配置文件
[root@localhost ~]# rpm -ql haproxy
/etc/haproxy #配置文件目錄
/etc/haproxy/haproxy.cfg #配置文件
/usr/lib/systemd/system/haproxy.service #啓動腳本
/usr/sbin/haproxy #haproxy 命令
/usr/share/man/man1/haproxy.1.gz #man 文檔
3、默認配置文件
[root@haproxy haproxy]# cat haproxy.cfg
#---------------------------------------------------------------------
# Example configuration for a possible web application. See the
# full configuration options online.
#
# http://haproxy.1wt.eu/download/1.4/doc/configuration.txt #官方配置文檔,很詳細,英文沒問題的博友,可以看看
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings #全局配置文件
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to: #配置日誌
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog #修改syslog配置文件
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog #定義日誌設備
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2 #
#全局的日誌配置 其中日誌級別是[err warning info debug]
#local0 是日誌設備,必須爲如下24種標準syslog設備的一種:
#kern user mail daemon auth syslog lpr news
#uucp cron auth2 ftp ntp audit alert cron2
#local0 local1 local2 local3 local4 local5 local6 local7
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid #將所有進程的pid寫入文件啓動進程的用戶必須有權限訪問此文件。
maxconn 4000 #最大連接數,默認4000
user haproxy #用戶
group haproxy #組
daemon ##創建1個進程進入deamon模式運行。此參數要求將運行模式設置爲"daemon"
# turn on stats unix socket #unix socket 文件
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block #默認的全局設置,這些參數可以被利用配置到frontend,backend,listen組件
#---------------------------------------------------------------------
defaults
mode http #默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK
log global #採用全局定義的日誌
option httplog #日誌類別http日誌格式
option dontlognull #不記錄健康檢查的日誌信息
option http-server-close #每次請求完畢後主動關閉http通道
option forwardfor except 127.0.0.0/8 #不記錄本機轉發的日誌
option redispatch #serverId對應的服務器掛掉後,強制定向到其他健康的服務器
retries 3 #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 #最大連接數
#---------------------------------------------------------------------
# main frontend which proxys to the backends #frontend 與backends 代理配置
#---------------------------------------------------------------------
frontend main *:5000
#acl策略配置
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
use_backend static if url_static #滿足策略要求,則響應策略定義的backend頁面
default_backend app #不滿足則響應backend的默認頁面
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such #定義使用靜態後端圖像,樣式表等
#---------------------------------------------------------------------
backend static
balance roundrobin #負載均衡模式輪詢
server static 127.0.0.1:4331 check #服務器定義
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
balance roundrobin #負載均衡模式輪詢
server app1 127.0.0.1:5001 check #服務器定義,check進行健康檢查
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check
案例:實現web負載
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# cd /var/www/html/
[root@web1 html]# echo "<h1>Server WWW node1</h1>" > index.html
2、node2安裝http和測試頁面
[root@web2 ~]# yum -y install httpd
[root@web2 ~]# cd /var/www/html/
[root@web2 html]# echo "<h1>Server WWW node2</h1>" > index.html
3、haproxy安裝配置
[root@HAproxy ~]# yum -y groupinstall "Development Tools"
[root@HAproxy ~]# yum -y install haproxy
4、配置文件
[root@HAproxy ~]# cat /etc/haproxy/haproxy.cfg
......主要配置函數
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 main #定義服務器組
bind *:80
default_backend server
backend server #定義服務器
mode http
balance roundrobin
option httpchk HEAD /index.html HTTP/1.0
server node1 192.168.211.140:80 cookie 1 weight 5 check inter 2000 rise 1 fall 1
server node2 192.168.211.128:80 cookie 1 weight 5 check inter 2000 rise 1 fall 1
5、查看監控頁面
下篇文章:HAproxy配置文件詳解以及HAproxy的ACL詳解