天天看點

HAProxy高性能軟負載均衡器

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

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

借用官網的圖,圖中的HA即為Haproxy軟體,下面的PROXY為要代理的伺服器,用戶端隻需要通路HA,相當于在通路PROXY。

HAProxy高性能軟負載均衡器

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頁面

HAProxy高性能軟負載均衡器
  1. 運作Haproxy容器,并且準備其配置檔案

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

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

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

我們的配置如下

HAProxy高性能軟負載均衡器
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高性能軟負載均衡器

最後

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

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

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

參考