用 HAProxy 實現網路流量的負 載 平 衡
導讀 | 在這篇文章中,我將通過設定一個非常基本的 HAProxy 環境,使用 HTTPS 來監聽安全埠 443,並利用幾個後端 Web 伺服器。它甚至會將所有進入預定義 URL(如 /api/)的流量傳送到不同的伺服器或伺服器池。 |
不是隻有在一個大型公司工作才需要使用負載平衡器。你可能是一個業餘愛好者,用幾臺樹莓派電腦自我託管一個網站。也許你是一個小企業的伺服器管理員;也許你確實在一家大公司工作。無論你的情況如何,你都可以使用 HAProxy 負載平衡器來管理你的流量。
HAProxy 被稱為“世界上最快和使用最廣泛的軟體負載平衡器”。它包含了許多可以使你的應用程式更加安全可靠的功能,包括內建的速率限制、異常檢測、連線排隊、健康檢查以及詳細的日誌和指標。學習本教程中所涉及的基本技能和概念,將有助於你使用 HAProxy 建立一個更強大的、遠為強大的基礎設施。
負載平衡器是一種在幾個網路或應用伺服器之間輕鬆分配連線的方法。事實上,HAProxy 可以平衡任何型別的傳輸控制協議(TCP)流量,包括 RDP、FTP、WebSockets 或資料庫連線。分散負載的能力意味著你不需要因為你的網站流量比谷歌大就購買一個擁有幾十萬 G 記憶體的大型網路伺服器。
負載平衡器還為你提供了靈活性。也許你現有的網路伺服器不夠強大,無法滿足一年中繁忙時期的峰值需求,你想增加一個,但只是暫時的。也許你想增加一些冗餘,以防一個伺服器出現故障。有了 HAProxy,你可以在需要時向後端池新增更多的伺服器,在不需要時刪除它們。
你還可以根據情況將請求路由到不同的伺服器。例如,你可能想用幾個快取伺服器(如 Varnish)來處理你的靜態內容,但把任何需要動態內容的東西,如 API 端點,路由到一個更強大的機器。
在這篇文章中,我將通過設定一個非常基本的 HAProxy 環境,使用 HTTPS 來監聽安全埠 443,並利用幾個後端 Web 伺服器。它甚至會將所有進入預定義 URL(如 /api/)的流量傳送到不同的伺服器或伺服器池。
要開始安裝,請啟動一個新的 8 伺服器或例項,並使系統達到最新狀態:
$ sudo yum update -y
這通常會持續一段時間。在等待的時候給自己拿杯咖啡。
這個安裝有兩部分:第一部分是安裝 yum 版本的 HAProxy,第二部分是編譯和安裝你的二進位制檔案,用最新的版本覆蓋以前的 HAProxy。用 yum 安裝,在生成 systemd 啟動 等方面做了很多繁重的工作,所以執行 yum install,然後從原始碼編譯,用最新的版本覆蓋 HAProxy 二進位制:
$ sudo yum install -y haproxy
啟用 HAProxy 服務:
$ sudo systemctl enable haproxy
要升級到最新版本(版本 2.2,截至本文寫作為止),請編譯原始碼。許多人認為從原始碼編譯和安裝一個程式需要很高的技術能力,但這是一個相當簡單的過程。首先,使用 yum 安裝一些提供編譯程式碼工具的軟體包:
$ sudo yum install dnf-plugins-core $ sudo yum config-manager --set-enabled PowerTools $ sudo yum install -y git ca-certificates gcc glibc-devel \ lua-devel pcre-devel openssl-devel systemd-devel \ make curl zlib-devel
使用 git 獲得最新的原始碼,並改變到 haproxy 目錄:
$ git clone $ cd haproxy
執行以下三個 來構建和安裝具有整合了 Prometheus 支援的 HAProxy:
$ make TARGET=linux-glibc USE_LUA=1 USE_OPENSSL=1 USE_PCRE=1 \ PCREDIR= USE_ZLIB=1 USE_SYSTEMD=1 \ EXTRA_OBJS="contrib/prometheus-exporter/service-prometheus.o" $ sudo make PREFIX=/usr install # 安裝到 /usr/sbin/haproxy
通過查詢版本來測試它:
$ haproxy -v
你應該看到以下輸出:
HA-Proxy version 2.2.4-b16390-23 2020/10/09 -
HAProxy 並不直接提供任何流量,這是後端伺服器的工作,它們通常是網路或應用伺服器。在這個練習中,我使用一個叫做 Ncat 的工具,它是網路領域的“瑞士軍 刀”,用來建立一些極其簡單的伺服器。安裝它:
$ sudo yum install nc -y
如果你的系統啟用了 SELinux,你需要啟用埠 8404,這是用於訪問 HAProxy 統計頁面的埠(下面有解釋),以及你的後端伺服器的埠:
$ sudo dnf install policycoreutils-python-utils $ sudo semanage port -a -t http_port_t -p tcp 8404 $ sudo semanage port -a -t http_port_t -p tcp 10080 $ sudo semanage port -a -t http_port_t -p tcp 10081 $ sudo semanage port -a -t http_port_t -p tcp 10082
建立兩個 Ncat 網路伺服器和一個 API 伺服器:
$ while true ; do nc -l -p 10080 -c 'echo -e "HTTP/1.1 200 OK\n\n This is Server ONE"' ; done & $ while true ; do nc -l -p 10081 -c 'echo -e "HTTP/1.1 200 OK\n\n This is Server TWO"' ; done & $ while true ; do nc -l -p 10082 -c 'echo -e "HTTP/1.1 200 OK\nContent-Type: application/json\n\n { \"Message\" :\"Hello, World!\" }"' ; done &
這些簡單的伺服器列印出一條資訊(如“This is Server ONE”),並執行到伺服器停止為止。在現實環境中,你會使用實際的網路和應用程式伺服器。
HAProxy 的配置檔案是 /etc/haproxy/haproxy.cfg。你在這裡進行修改以定義你的負載平衡器。這個 基本配置 將讓你從一個工作的伺服器開始:
global log 127.0.0.1 local2 user haproxy group haproxy defaults mode http log global option httplog frontend main bind *:80 default_backend web use_backend api if { path_beg -i /api/ } #------------------------- # SSL termination - HAProxy handles the encryption. # To use it, put your PEM file in /etc/haproxy/certs # then edit and uncomment the bind line (75) #------------------------- # bind *:443 ssl crt /etc/haproxy/certs/haproxy.pem ssl-min-ver TLSv1.2 # redirect scheme https if !{ ssl_fc } #----------------------------- # Enable stats at #----------------------------- frontend stats bind *:8404 stats enable stats uri /stats #----------------------------- # round robin balancing between the various backends #----------------------------- backend web server web1 127.0.0.1:10080 check server web2 127.0.0.1:10081 check #----------------------------- # API backend for serving up API content #----------------------------- backend api server api1 127.0.0.1:10082 check
HAProxy 可能還沒有執行,所以發出 sudo systemctl restart haproxy 來啟動(或重新啟動)它。“重啟” 的方法在非生產情況下是很好的,但是一旦你開始執行,你要養成使用 sudo systemctl reload haproxy 的習慣,以避免服務中斷,即使你的配置中出現了錯誤。
例如,當你對 /etc/haproxy/haproxy.cfg 進行修改後,你需要用 sudo systemctl reload haproxy 來重新載入守護程式,使修改生效。如果有錯誤,它會讓你知道,但繼續用以前的配置執行。用 sudo systemctl status haproxy 檢查 HAProxy 的狀態。
如果它沒有報告任何錯誤,你就有一個正在執行的伺服器。在伺服器上用 curl 測試,在命令列輸入 curl 。如果你看到 “This is Server ONE”,那就說明一切都成功了!執行 curl 幾次,看著它在你的後端池中迴圈,然後看看當你輸入 curl api/ 時會發生什麼。在 URL 的末尾新增 /api/ 將把所有的流量傳送到你池子裡的第三個伺服器。至此,你就有了一個正常運作的負載平衡器
你可能已經注意到,配置中定義了一個叫做 stats 的前端,它的監聽埠是 8404:
frontend stats bind *:8404 stats uri /stats stats enable
在你的瀏覽器中,載入 。閱讀 HAProxy 的部落格 學習 HAProxy 的統計頁面,瞭解你在這裡可以做什麼。
雖然我只介紹了 HAProxy 的幾個功能,但你現在有了一個伺服器,它可以監聽 80 和 443 埠,將 HTTP 流量重定向到 HTTPS,在幾個後端伺服器之間平衡流量,甚至將匹配特定 URL 模式的流量傳送到不同的後端伺服器。你還解鎖了非常強大的 HAProxy 統計頁面,讓你對你的系統有一個很好的概覽。
這個練習可能看起來很簡單,不要搞錯了,你剛剛建立和配置了一個非常強大的負載均衡器,能夠處理大量的流量。
為了你方便,我把本文中的所有命令放在了 GitHub Gist 中。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2856323/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- HaProxy 實現 MySQL 負載均衡MySql負載
- Haproxy搭建 Web 群集實現負載均衡Web負載
- RHEL 7配置HAProxy實現Web負載均衡Web負載
- keepalived+haproxy實現mysql負載均衡高可用MySql負載
- 流量引導:網路世界的負載均衡解密負載解密
- mysql負載均衡搭建(haproxy)MySql負載
- Keepalived+HAProxy基於ACL實現單IP多域名負載功能負載
- 負載均衡之--Nginx、LVS、HAProxy負載Nginx
- 壓測平臺 - 使用 LVS 負載均衡解決網路流量成為瓶頸的問題負載
- 基於滴滴雲部署 HAProxy 實現 7 層和 4 層負載均衡負載
- haproxy(單機)+mysql叢集負載均衡MySql負載
- 超實用:實現負載均衡技術的方式負載
- SAP 應用服務負載均衡的實現負載
- HAProxy高效能軟負載均衡器負載
- Haproxy+Keepalived高可用負載均衡叢集負載
- octavia的實現與分析(一)·openstack負載均衡的現狀與發展以及lvs,Nginx,Haproxy三種負載均衡機制的基本架構和對比負載Nginx架構
- 智慧雲解析如何實現網站的負載均衡?網站負載
- 網際網路流量下的分層實驗平臺是咋做的
- 阿里架構師講述:網際網路的大流量專案中的負載均衡設計阿里架構負載
- 多網路卡環境下利用策略路由實現網路流量同進同出[轉載]路由
- 負載均衡服務之HAProxy基礎入門負載
- 在docker中haproxy的安裝以及mysql的負載均衡配置DockerMySql負載
- 在 Linux 上用 DNS 實現簡單的負載均衡LinuxDNS負載
- 網路拓撲例項12:靜態路由實現路由負載分擔路由負載
- Ribbon實現負載均衡負載
- GRPC 負載均衡實現RPC負載
- nginx實現負載均衡Nginx負載
- Nginx/LVS/HAProxy負載均衡軟體的優缺點詳解Nginx負載
- Nginx實現簡單的負載均衡Nginx負載
- 【Nginx】Windows平臺下配置Nginx服務實現負載均衡NginxWindows負載
- Locust如何實現逐步負載?負載
- Istio流量治理原理之負載均衡負載
- 從網路到分散式-負載均衡分散式負載
- 農行網路流量回溯與分析實現新突破
- 乾貨 | 獨創分散式網路負載均衡最佳實踐分散式負載
- 高效能網站實用技巧之負載均衡篇網站負載
- linux實現DNS輪詢實現負載平衡LinuxDNS負載
- 放電消納負載如何實現的負載