HAProxy高效能軟負載均衡器

Real_man發表於2019-02-27

現在公司實現高可用已經成為必不可少的一環,在眾多的負載均衡叢集方案中,Haproxy是比較有名的一個。它可以實現TCP或Http的負載均衡。優點如下:

  • 免費開源,與硬體負載均衡相比劃算很多
  • 最高可以維護40000~50000個併發,作為軟體級別的負載均衡來說,實在強大
  • 支援多種負載均衡演算法,同時支援session保持
  • 支援虛擬主機
  • 擁有伺服器監控頁面,可以瞭解系統的實時執行狀態

借用官網的圖,圖中的HA即為Haproxy軟體,下面的PROXY為要代理的伺服器,客戶端只需要訪問HA,相當於在訪問PROXY。

image.png

演示

像這種軟體的東西,直接動手比說理論有用的多。我還是基於Docker演示,明白其原理主要是配置檔案,用虛擬機器或容器都是類似的。

  1. 拉取Haproxy:1.8映象
docker pull haproxy:1.8
複製程式碼
  1. 拉取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頁面

image.png

  1. 執行Haproxy容器,並且準備其配置檔案

Haproxy的配置檔案主要分為幾部分

  • global 一些全域性配置資訊,主要和程式相關,注意如果涉及到目錄相關的,要提前建立目錄
  • defaults 預設的配置資訊
  • frontend 前端的配置,暴露給使用者的部分
  • backend 後端的配置,真實的提高服務的部分

在官方的網站中,所有的配置指令都有詳細的解釋,網址在文末的參考中。

我們的配置如下

image.png

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
複製程式碼

結果

在訪問同一臺伺服器,可以看到響應的內容確實轉發到後端不同的伺服器上面

image.png

最後

紙上得來終覺淺,絕知此事要躬行。Haproxy一直在大腦中停留著,親自配置一遍才知道其是怎麼回事。中間遇到兩個問題

  1. Haproxy1.5版本與1.8版本的frontend配置稍有不同,學會參考文件
  2. 配置檔案中的stats指定的目錄在系統中如果不存在,會報錯,指定的目錄都要存在才行

讓配置生效之前先用haproxy -c檢查一下配置檔案是否正確

參考

相關文章