一、 Haproxy簡介
haproxy提供高可用性、負載均衡以及基於TCP(第四層)和HTTP(第七層)應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。
haproxy特別適用於那些負載特別大的web站點,這些站點通常又需要會話保持或七層處理。haproxy運行在時下的硬件上,完全可以支持數以萬計的並發連接,並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中,同時可以保護你的web服務器不被暴露到網絡上。
haproxy實現了一種事件驅動、單一進程模型,此模型支持非常大的並發連接數。多進程或多線程模型受內存限制、系統調度器限制以及無處不在的鎖限制,很少能處理數千並發連接。
事件驅動模型因為在有更好的資源和時間管理的用戶端(User-Space)實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程序通常擴展性較差。這就是為什么他們必須進行優化以使每個CPU時間片(Cycle)做更多的工作。
二、 Haproxy優點
-
免費開源,穩定性也是非常好。單haproxy也跑得不錯,穩定性可以與硬件級的F5相媲美。
-
根據官方文檔,haproxy可以跑滿10Gbps,這個數值作為軟件級負載均衡器是相當驚人的。
-
haproxy支持連接拒絕:因為維護一個連接的打開的開銷是很低的,有時我們很需要限制攻擊蠕蟲(attack bots),也就是說限制它們的連接打開從而限制它們的危害。這個已經為一個陷於小型DDoS攻擊的網站開發了而且已經拯救了很多站點,這個優點也是其它負載均衡器沒有的。
-
haproxy支持全透明代理(已具備硬件防火牆的典型特點):可以用客戶端IP地址或者任何其他地址來連接后端服務器。這個特性僅在Linux 2.4/2.6內核打了tcp proxy補丁后才可以使用。這個特性也使得為某特殊服務器處理部分流量同時又不修改服務器的地址成為可能。
-
haproxy現多用於線上的Mysql集群環境,我們常用於它作為MySQL(讀)負載均衡。
-
自帶強大的監控服務器狀態的頁面,實際環境中我們結合Nagios進行郵件或短信報警。
-
HAProxy支持虛擬主機。
三、Haproxy的安裝
- 采用命令的安裝
yum install haproxy
四、Haproxy的配置文件說明
- global: (全局配置主要用於設定義全局參數,屬於進程級的配置,通常和操作系統配置有關)
- default : (配置默認參數,這些參數可以被用到frontend,backend,Listen組件) 在此部分中設置的參數值,默認會自動引用到下面的frontend、backend、listen部分中,因引,某些參數屬於公用的配置,只需要在defaults部分添加一次即可。而如果frontend、backend、listen部分也配置了與defaults部分一樣的參數,Defaults部分參數對應的值自動被覆蓋。
- frontend:( 接收請求的前端虛擬節點,Frontend可以更加規則直接指定具體使用后端的backend) frontend是在haproxy 1.3版本以后才引入的一個組件,同時引入的還有backend組件。通過引入這些組件,在很大程度上簡化了haproxy配置文件的復雜性。forntend可以根據ACL規則直接指定要使用的后端backend
- backend : (后端服務集群的配置,真實服務器,一個Backend對應一個或者多個實體服務器) 在HAProxy1.3版本之前,HAProxy的所有配置選項都在這個部分中設置。為了保持兼容性,haproxy新的版本依然保留了listen組件配置項。兩種配置方式任選一中
- Listen : (Fronted和backend的組合體) 比如haproxy實例狀態監控部分配置
五、修改配置文件
Haproxy 安裝完成之后,就可以根據自身項目需求修改配置文件
vim /etc/haproxy/haproxy.cfg
示例1:
只使用listen 關聯“前端”和“后端”定義了一個完整的代理,進行端口轉發和負載均衡。通常只對TCP流量有用
############################################################### defaults log global mode tcp maxconn 20480 option httplog option httpclose option dontlognull #option forwardfor option redispatch option abortonclose #stats refresh 30 retries 3 balance roundrobin #balance source #balance leastconn timeout check 2000 listen admin_status #haproxy web頁面 bind 0.0.0.0:65532 mode http log 127.0.0.1 local3 err stats refresh 5s stats uri /admin?stats #url地址 stats auth test:test1 #用戶名和密碼 stats hide-version stats admin if TRUE # errorfile 403 /etc/haproxy/errorfiles/403.http # errorfile 500 /etc/haproxy/errorfiles/500.http # errorfile 502 /etc/haproxy/errorfiles/502.http # errorfile 503 /etc/haproxy/errorfiles/503.http # errorfile 504 /etc/haproxy/errorfiles/504.http capture request header Host len 40 capture request header Content-Length len 10 capture request header Referer len 200 capture response header Server len 40 capture response header Content-Length len 10 capture response header Cache-Control len 8 listen mq #Frontend和Backend的組合體,監控組的名稱,按需自定義名稱 bind 0.0.0.0:45672 #監聽端口 mode tcp #tcp模式 server s1 192.168.1.56:5672 check inter 5s rise 2 fall 3 #代理的服務1 server s2 192.168.1.57:5672 check inter 5s rise 2 fall 3 #代理的服務2 server s3 192.168.1.58:5672 check inter 5s rise 2 fall 3 #代理的服務3 listen mqweb bind 0.0.0.0:15672 mode tcp server s1 192.168.1.56:15672 check inter 5s rise 2 fall 3 server s2 192.168.1.57:15672 check inter 5s rise 2 fall 3 server s3 192.168.1.58:15672 check inter 5s rise 2 fall 3
示例2(采用frontend+backend模式 大多適用於http請求)
假設客戶端訪問 http://doc.test.com 時,要把請求分發到192.168.5.171:8080、192.168.5.174:8080、192.168.5.178:8080,這三台服務器上,我們可以這樣配置。
############################################################################## defaults log global mode http maxconn 20480 option httplog option httpclose option dontlognull #option forwardfor option redispatch option abortonclose #stats refresh 30 retries 3 balance roundrobin #balance source #balance leastconn timeout check 2000 frontend web1 #frontend 名稱自定義 bind 0.0.0.0:80 #綁定端口 acl url_doc path_beg doc.test.com #定義規則 use_backend docserver if url_do1 #使用規則:如果規則是 url_doc 則跳轉到do1server backend backend docserver #后端服務集群的配置名稱自定義 balance roundrobin #負載均衡算法 輪詢 server web1 192.168.5.171:8080 check inter 5s rise 2 fall 3 server web2 192.168.5.174:8080 check inter 5s rise 2 fall 3 server web3 192.168.5.178:8080 check inter 5s rise 2 fall 3
backend:用來定義負載均衡算法
- roundrobin : 基於權重進行的輪叫算法,在服務器的性能分布經較均勻時這是一種最公平的,最合量的算法。
- static-rr:也是基於權重時行輪叫的算法,不過此算法為靜態方法,在運行時調整其服務權重不會生效。
- source:是基於請求源IP的算法,此算法對請求的源IP時行hash運算,然后將結果與后端服務器的權理總數相除后轉發至某台匹配的后端服務器,這種方法可以使用一個客戶端IP的請求始終轉發到特定的后端服務器。
- leastconn:此算法會將新的連接請求轉發到具有最少連接數目的后端服務器。在會話時間較長的場景中推薦使用此算法。例如數據庫負載均衡等。此算法不適合會話較短的環境,如基於http的應用。
- uri:此算法會對部分或整個URI進行hash運算,再經過與服務器的總權重要除,最后轉發到某台匹配的后端服務器上。
- uri_param:此算法會椐據URL路徑中的參數時行轉發,這樣可以保證在后端真實服務器數量不變時,同一個用戶的請求始終分發到同一台機器上。
- hdr:此算法根據httpd頭時行轉發,如果指定的httpd頭名稱不存在,則使用roundrobin算法進行策略轉發。
- rdp-cookie(name):示根據據cookie(name)來鎖定並哈希每一次TCP請求.
六、啟動Haproxy
#啟動 systemctl start haproxy ##檢測狀態 systemctl status haproxy #檢測進程 ps -ef|grep haproxy
七、集群
Haproxy本身是沒有集群配置的,但是我們可以通過將Haproxy配置到多台服務器配置可以是一樣的。然后再使用Keepalived通過虛擬IP來切換Haproxy達到我們想要的效果。