現在公司實現高可用已經成為必不可少的一環,在眾多的負載均衡叢集方案中,Haproxy是比較有名的一個。它可以實現TCP或Http的負載均衡。優點如下:
- 免費開源,與硬體負載均衡相比劃算很多
- 最高可以維護40000~50000個併發,作為軟體級別的負載均衡來說,實在強大
- 支援多種負載均衡演算法,同時支援session保持
- 支援虛擬主機
- 擁有伺服器監控頁面,可以瞭解系統的實時執行狀態
借用官網的圖,圖中的HA即為Haproxy軟體,下面的PROXY為要代理的伺服器,客戶端只需要訪問HA,相當於在訪問PROXY。
演示
像這種軟體的東西,直接動手比說理論有用的多。我還是基於Docker演示,明白其原理主要是配置檔案,用虛擬機器或容器都是類似的。
- 拉取Haproxy:1.8映象
docker pull haproxy:1.8
複製程式碼
- 拉取httpd映象,並且準備web容器
docker pull httpd:2.4
docker run -it -d --name web1 httpd:2.4
docker run -it -d --name web2 httpd:2.4
docker run -it -d --name web-static httpd:2.4
docker exec -it web1 /bin/bash
複製程式碼
進入容器之後分別修改其html頁面
- 執行Haproxy容器,並且準備其配置檔案
Haproxy的配置檔案主要分為幾部分
- global 一些全域性配置資訊,主要和程式相關,注意如果涉及到目錄相關的,要提前建立目錄
- defaults 預設的配置資訊
- frontend 前端的配置,暴露給使用者的部分
- backend 後端的配置,真實的提高服務的部分
在官方的網站中,所有的配置指令都有詳細的解釋,網址在文末的參考中。
我們的配置如下
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 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
frontend main
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
default_backend app
bind :80
backend static
balance roundrobin
server static 172.17.0.5:80 check
backend app
balance roundrobin
server app1 172.17.0.3:80 check
server app2 172.17.0.4:80 check
複製程式碼
結果
在訪問同一臺伺服器,可以看到響應的內容確實轉發到後端不同的伺服器上面
最後
紙上得來終覺淺,絕知此事要躬行。Haproxy一直在大腦中停留著,親自配置一遍才知道其是怎麼回事。中間遇到兩個問題
- Haproxy1.5版本與1.8版本的frontend配置稍有不同,學會參考文件
- 配置檔案中的stats指定的目錄在系統中如果不存在,會報錯,指定的目錄都要存在才行
讓配置生效之前先用haproxy -c檢查一下配置檔案是否正確