如果對於負載平衡的觀念不熟悉的,上一篇我們有介紹了一些簡單的觀念與 HAProxy 的簡介。
今天就來教大家如何在 Ubuntu 上面安裝 HAProxy 並架設 Keepalive 建置屬於自己的負載平衡伺服器。
硬體規格的評估
安裝任何系統之前,首先考量的就是硬體規格的評估。HAProxy 對於硬體的要求只需考慮 CPU 與 Memory,至於硬碟空間的需求取決於您想要保留多久的 Log。
我們需要根據系統的工作繁忙程度再來決定硬體規格的評估,以下是官方推薦的評估方式。
接下來我們簡單的介紹一下 HAProxy 的調度方法
如果不知道挑選哪一種,可以先嘗試 roundrobin 再依系統狀況調整。
Ubuntu Server Installation
請大家安裝最新版本的 Ubuntu 即可,投影片範例是我很久以前裝的。
我通常使用的規格是 2 CPU, 4 GB RAM, 30 GB Disk
HAProxy Installation
透過下列指令進行 HAPrxoy 安裝
sudo apt-get install software-properties-common python-software-properties
sudo apt-add-repository ppa:vbernat/haproxy-1.7
sudo apt-get update
sudo apt-get install haproxy
透過下列指令驗證是否安裝成功
haproxy -v
HA-Proxy version 2.0.14-1ppa1~xenial 2020/04/16 - https://haproxy.org/
HAProxy Configuration
主要的設定檔放在 /etc/haproxy/haproxy.cfg
cat /etc/haproxy/haproxy.cfg
剛裝完預設的設定檔內容如下
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
時間的參數預設都是 ms,若沒有特別指定。
編輯主要的設定檔
sudo vi /etc/haproxy/haproxy.cfg
先配置前端傾聽 Port 的部分,添加下列幾行至設定檔的底部
frontend firstbalance
bind *:80
option forwardfor
default_backend webservers
接下來配置後段伺服器的部分,添加下列幾行在前端的設定之後。
我們將傾聽到的 80 Port 請求交給後端兩台網頁伺服器處理
backend webservers
balance roundrobin
server apache01 192.168.67.138:80 check
server apache02 192.168.67.139:80 check
option httpchk
同時也可以啟用 Haproxy Statistics 的功能,添加下列幾行至設定檔的底部。
listen stats
bind *:{your_port}
mode http
stats enable
stats hide version
stats realm Haproxy\ Statistics
stats uri /
stats auth {your_username}:{your_password}
stats refresh 10s
Start HAProxy
在啟動服務之前,我們可以先透過下列指令檢查設定檔是否配置錯誤。
特別在正式環境,任何的修改都必須通過檢查,才能進行重啟服務。
haproxy -f /etc/haproxy/haproxy.cfg -c
通過檢查後就可以透過下列指令重啟
sudo service haproxy restart
也可以透過 Reload 的方式來重啟服務,已連線的請求就不會被中斷。
sudo service haproxy reload
到這邊們已經完成 HAProxy 的基本架設了
Socat Utility
若要對已經運行的 HAProxy 進行即時調整,可以透過 Socat 的方式達成。
透過下列指令安裝 socat
sudo apt-get install socat
下列指令可以讓我們使用 Socat 關閉網頁伺服器進行維護,不用透過 Restart 或者 Reload 指令。
echo "disable server webservers/apache01" | sudo socat stdio /run/haproxy/admin.sock
列出 HAProxy 的幫助訊息
echo "help" | sudo socat stdio /run/haproxy/admin.sock
Socat 可以透過下列指令與 HAProxy 互動
Unknown command. Please enter one of the following commands only :
…
show stat : report counters for each proxy and server [json|..
disable agent : disable agent checks (use 'set server'..
disable health: disable health checks (use 'set server'..
disable server: disable a server for maintenance (use 'set server'..
enable agent : enable agent checks (use 'set server'..
enable health : enable health checks (use 'set server'..
enable server : enable a disabled server (use 'set server'..
…
HAProxy Logging
記錄檔的格式分為 TCP 與 HTTP 兩種, TCP 的部分我們比較關心的是 Term Code 也就是終止的狀態,這邊可以幫助我們判斷異常是在前端用戶或者後端伺服器發生的。
至於 HTTP 的部分,我們就會看 HTTP Status 與 Term Code,特別是出現 HTTP 400 或 500 的錯誤,都很方便我們去追蹤異常發生的情況。
此外 HTTP 的紀錄還可以看到前端用戶與後端伺服器建立連線的時間
Advance Settings
Haproxy 本身就有提供 Statistics 的功能,可以透過網頁查看各種連線數據的統計,但想要依照時間軸的方式呈現統計資料就不是這麼方便了。
因此還可以透過 Prometheus 的 HAProxy Exporter 將日誌推送至 Prometheus 進行分析。
再透過 Grafana 讀取 Prometheus 的資料進行歷史趨勢與統計資料的呈現
Keepalived
通常需要建置負載平衡伺服器的系統,代表它在企業中屬於核心的重要系統。除了核心系統本身有規劃高可用性(High availability)外,我們也會針對負載平衡伺服器規畫高可用性,避免它成為單點故障(Single Point of Failure)的破口。
我們將會需一個 Virtual IP 當作服務的入口,同時建置兩組 HAPrxoy(Master 與 Backup)並指向同一群 Real Servers 來實現高可用性架構。
Keepalived Installation
透過下列指令分別在 Master 與 Backup 伺服器安裝 Keepalived
sudo apt-get install keepalived
分別在 Master 與 Backup 編輯主要的設定檔
sudo vi /etc/keepalived/keepalived.conf
添加下列配置於設定檔中
global_defs {
notification_email {your_email_address}
}
router_id LVS_DEVEL {
notification_email_from {sender_email_address}
smtp_server {your_smtp_server}
smtp_connect_timeout 30
}
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}
Master Configuration
添加下列配置於 Master 設定檔中
vrrp_instance VI_MASTER {
state MASTER
interface ens33 #網路介面卡代號
virtual_router_id 51 #需與 Backup 一致
priority 100 #Master Priority 需大於 Backup
smtp_alert
advert_int 1 #與 Backup 每秒互相偵測
authentication {
auth_type PASS
auth_pass 6666 #需與 Backup 一致
}
virtual_ipaddress {
192.168.67.137
}
track_script {
chk_haproxy
}
}
Backup Configuration
添加下列配置於 Backup 設定檔中
vrrp_instance VI_BACKUP {
state BACKUP
interface ens33 #網路介面卡代號
virtual_router_id 51 #需與 Master 一致
priority 99 #Master Priority 需大於 Backup
smtp_alert
advert_int 1 #與 Master 每秒互相偵測
authentication {
auth_type PASS
auth_pass 6666 #需與 Master 一致
}
virtual_ipaddress {
192.168.67.137
}
track_script {
chk_haproxy
}
}
接下來透過下列指令重啟服務
sudo service keepalived restart
也可以透過 Reload 的方式來重啟服務,已連線的請求就不會被中斷。
sudo service keepalived reload
透過下列指令來查看 Virtual IP
ip addr
我們可以看到 192.168.67.137 的確在 Master 身上
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:81:a6:e2
brd ff:ff:ff:ff:ff:ff
inet 192.168.67.135/24 brd 192.168.67.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.67.137/32 scope global ens33
valid_lftforever preferred_lft forever
到這邊我們已經透過 Keepalive 來實現簡單的 HAProxy 高可用性架構,希望有幫助到大家。
參考文件