現在公司實作高可用已經成為必不可少的一環,在衆多的負載均衡叢集方案中,Haproxy是比較有名的一個。它可以實作TCP或Http的負載均衡。優點如下:
- 免費開源,與硬體負載均衡相比劃算很多
- 最高可以維護40000~50000個并發,作為軟體級别的負載均衡來說,實在強大
- 支援多種負載均衡算法,同時支援session保持
- 支援虛拟主機
- 擁有伺服器監控頁面,可以了解系統的實時運作狀态
借用官網的圖,圖中的HA即為Haproxy軟體,下面的PROXY為要代理的伺服器,用戶端隻需要通路HA,相當于在通路PROXY。
image.png
示範
像這種軟體的東西,直接動手比說理論有用的多。我還是基于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檢查一下配置檔案是否正确