haproxy小结(一)基础概念篇
HAProxy是法國人Willy Tarreau個人開發的一個開源軟件,目標是應對客戶端10000以上的同時連接,為后端應用服務器、數據庫服務器提供高性能的負載均衡服務。HAproxy可以實現基于TCP(四層 例如:SSH,SMTP,MYSQL)和HTTP(七層 例如:web服務器)應用的代理軟件,同時也可以作為負載均衡器使用,并且是開源完全免費的。HAproxy完全可以支持數以萬計的并發鏈接,它的工作模式可以將其簡單而安全地整合到當前的服務架構中,同時可以保護你的WEB服務器不暴露到網絡上(設置成代理來實現的 通過VIP將后端的web服務器隱藏到內網中)。
?
一、HAProxy優點
1、免費開源,穩定性也非常好,其穩定性可以與硬件級別的F5 BIG-IP相媲美。
2、負載帶寬非常大。根據官方文檔可知,HAproxy可以跑滿10Gbps的帶寬,對于軟件級負載均衡器來說,是相當驚人的。
3、支持鏈接拒絕。因為保護一個鏈接保持打開狀態的開銷是很低的,有時我們需要防止蠕蟲攻擊,也就是通過限制它們的連接打開來防止它們的危害,可以用于防止DDoS攻擊,這也是其他負載均衡器所不具備的。
4、支持全透明代理(已具備硬件防火墻的典型特點)。可以用客戶端IP地址或任何其他地址來鏈接后端服務器,這個特性僅在Linux 2.4/2.6 內核打了cttproxy補丁后才可以使用。
5、支持TCP層(四層)的負載均衡。HAproxy現在多用于線上的MySQL集群環境,常用它作為MySQL(讀)負載均衡,不過在后端的MySQL Slaves數量超過10臺時性能不如LVS,所以更推薦推薦LVS+Keepalived。一般情況下都是前端通過LVS做四層負載,HAProxy做后端web服務器的負載 這樣性能會比單獨用HAProxy性能高很多。
6、強大的監控服務。自帶強大的監控服務器狀態的頁面,在生產環境中可結合Nagios來實現郵件或短信報警。
7、能支持多種的負載均衡算法,現在為止可以支持8種
8、支持虛擬主機。
---page from www.361way.com(運維之路,頁面被扒,打個tag)
二、HAProxy是什么不是什么
1、HAProxy是什么
?
HAProxy 是:
-
TCP 代理:可從監聽 socket 接受 TCP 連接,然后自己連接到 server,HAProxy 將這些 sockets attach 到一起,使通信流量可雙向流動。
-
HTTP 反向代理(在 HTTP 專用術語中,稱為 gateway):HAProxy 自身表現得就像一個 server,通過監聽 socket 接受 HTTP 請求,然后與后端服務器建立連接,通過連接將請求轉發給后端服務器。
-
SSL terminator / initiator / offloader: 客戶端 -> HAProxy 的連接,以及 HAProxy -> server 端的連接都可以使用 SSL/TLS
-
TCP normalizer: 因為連接在本地操作系統處終結,client 和 server 端沒有關聯,所以不正常的 traffic 如 invalid packets, flag combinations, window advertisements, sequence numbers, incomplete connections(SYN floods) 不會傳遞給 server 端。這種機制可以保護脆弱的TCP stacks 免遭協議上的攻擊,也使得我們不必修改 server 端的 TCP 協議棧設置就可以優化與 client 的連接參數。
-
HTTP normalizer: HAProxy 配置為 HTTP 模式時,只允許有效的完整的請求轉發給后端。這樣可以使得后端免遭 protocol-based 攻擊。一些不規范的定義也被修改,以免在 server 端造成問題(eg: multiple-line headers,會被合并為一行)
-
HTTP 修正工具:HAProxy 可以 modify / fix / add / remove / rewrite URL 及任何 request or response header。
-
a content-based switch: 可基于內容進行轉發。可基于請求中的任何元素轉發請求或連接。因此可基于一個端口處理多種協議(http,https, ssh)
-
a server load balancer: 可對 TCP 連接 和 HTTP 請求進行負載均衡調度。工作于 TCP 模式時,可對整個連接進行負載均衡調度;工作于 HTTP 模式時,可對 HTTP 請求進行調度。
-
a traffic regulator: 可在不同的方面對流量進行限制,保護 server ,使其不超負荷,基于內容調整 traffic 優先級,甚至可以通過 marking packets 將這些信息傳遞給下層以及網絡組件。
-
防御 DDos 攻擊及 service abuse: HAProxy 可為每個 IP地址,URL,cookie 等維護大量的統計信息,并對其進行檢測,當發生服務濫用的情況,采取一定的措施如:slow down the offenders, block them, send them to outdated contents, etc
-
是 network 的診斷的一個觀察節點:根據精確記錄細節豐富的日志,對網絡診斷很有幫助
-
an HTTP compression offloader:可自行對響應進行壓縮,而不是讓 server 進行壓縮,因此對于連接性能較差的 client,或使用高延遲移動網絡的 client,可減少頁面加載時間。
2、HAProxy不是什么
HAProxy 不是:
-
顯式地 HTTP 代理,即不是瀏覽器用于訪問 internet 的代理。Squid 可用于做這種事情。HAProxy 可安裝在 Squid 的前端,提供負載均衡和高可用。
-
緩存代理:對于從服務器收到的內容,HAProxy 只能將其原樣返回給 client,對 caching policy 不做任何干涉。對于這個任務, Varnish 是一個很好的選擇。HAProxy 可安裝在 Varnish 的前端提供 SSL offloading,以及可伸縮性(通過 smart load balancing)
-
a data scrubber: HAProxy 不能修改請求或響應的 body 部分
-
a web server: HAProxy 在啟動時,它將自己隔離在一個 chroot 環境中,并拋棄了自己的特權,所以一旦啟動之后,它不會進行任何對文件系統的訪問。所以 HAProxy 不能以 web server 的方式工作。可作 web server 的是 Apache 或 Nginx,HAProxy 可安裝在其前端提供提供負載均衡和高可用。
-
a packet-based load balancer:基于 packet 的負載均衡調度器。HAProxy 不會看見 IP packet 或 UDP datagram,不能進行 NAT 轉換,或者 less DSR。這些是下層的工作,比如 LVS 就做得很好,LVS 對 HAProxy 是完美的補充。
?
三、HAProxy是如何工作的
?
?
HAProxy 由單線程的、事件驅動的、非阻塞的引擎, 以及一個非常快速的 I/O 層組合而成。擁有 “基于優先級” 的調度機制。
HAProxy 的設計理念是讓數據盡可能快的移動。它在每一層設計了 bypass 機制,在不必要的時候,數據不會傳遞到上層,直接在下層進行傳遞。大部分的處理都在 kernel 中完成,HAProxy 盡最大努力幫助 kernel 盡快完成工作,包括給一些 hints,或是當某些操作可稍后合并完成時,避免某些操作。
當 HAProxy 工作在 TCP 或者 HTTP close mode 時,HAProxy 消耗的 CPU 負載是 15%,內核消耗的負載是 85%。
當 HAProxy 工作在 HTTP keep-alive mode 時,HAProxy 消耗的 CPU 負載是 30%,內核消耗的負載是 70%。
一個 HAProxy 進程可以運行許多 proxy 實例;一個進程可容納 300000 萬個實例而運行良好。因此一般不需要啟動多個進程。
HAProxy 被用來做 SSL offloader 時,可使用多進程。
運行 HAProxy 只需要一個 haproxy 可執行程序和一份配置文件即可運行。要記錄日志,強烈建議配置好 syslog daemon 及 rotation 機制。配置文件在啟動前被解析,HAProxy 嘗試綁定所有的 監聽 sockets,如果有地方失敗就不會啟動。一旦成功啟動,HAProxy 不會再失效,也就是說不會有 runtime failures,一旦啟動,它會工作到被關閉為止。
HAProxy 一旦啟動,會做三件事情:
- 處理客戶端接入的連接
- 周期性檢查 server 的狀態(健康檢查)
- 與其他 haproxy 交換信息
處理客戶端接入的連接,是目前為止最為復雜的工作,因為配置有太多的可能性,但總的說來有 9 個步驟:
-
配置實體 frontend 擁有監聽 socket,HAProxy 從它的監聽 socket 處接受客戶端連接
-
根據 frontend 配置的規則,對連接進行處理。可能會拒絕一些連接,修改一些 headers,或是攔截連接,執行內部的小程序,比如統計頁面,或者 CLI
-
backend 是定義后端 servers,以及負載均衡規則的配置實體,frontend 完成上面的處理后將連接轉發給 backend。
-
根據 backend 定義的規則,對連接進行處理
-
根據負載均衡規則對連接進行調度
-
根據 backend 定義的規則對 response data 進行處理
-
根據 frontend 定義的規則對 response data 進行處理
-
發起一個 log report,記錄日志
-
在 HTTP 模式,回到第二步,等待新的請求,或者關閉連接。
frontend 和 backend 有時被認為是 half-proxy,因為他們對一個 end-to-end(端對端)的連接只關心一半:frontend 只關心 client,backend 只關心 server。
HAProxy 也支持 full proxy,通過對 frontend 和 backend 的準確聯合來工作。
HAProxy 工作于 HTTP 模式時,配置被分裂為 frontend 和 backend 兩個部分,因為任何 frontend 可能轉發連接給 任何 backend。
HAProxy 工作于 TCP 模式時,實際上就是 full proxy 模式,配置中使用 frontend 和 backend 不能提供更多的好處,在 full proxy 模式,配置文件更有可讀性。
?
from:http://www.361way.com/haproxy-basic/5267.html
總結
以上是生活随笔為你收集整理的haproxy小结(一)基础概念篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CMD指令收集(持续)
- 下一篇: shell脚本的执行方式