iT邦幫忙

2

如何安裝 HAProxy 與 Keepalive 實現高可用性負載平衡

  • 分享至 

  • xImage
  •  

如果對於負載平衡的觀念不熟悉的,上一篇我們有介紹了一些簡單的觀念與 HAProxy 的簡介
今天就來教大家如何在 Ubuntu 上面安裝 HAProxy 並架設 Keepalive 建置屬於自己的負載平衡伺服器。

硬體規格的評估
安裝任何系統之前,首先考量的就是硬體規格的評估。HAProxy 對於硬體的要求只需考慮 CPU 與 Memory,至於硬碟空間的需求取決於您想要保留多久的 Log。

我們需要根據系統的工作繁忙程度再來決定硬體規格的評估,以下是官方推薦的評估方式。

接下來我們簡單的介紹一下 HAProxy 的調度方法

  • roundrobin:請求都會被平均的分散,通常使用在網頁伺服器。
  • leastconn:請求分散至連線數較少的伺服器,通常使用在資料庫。
  • rdp-cookie:請求需保有永續性的情況,通常使用在終端伺服器。
  • source:依照來源 IP 分散請求,通常使用在區分地理位置的情況下。
  • first:請求會先派到第一台伺服器直到滿載才會往下一台伺服器,目的是使用最少的伺服器數量,允許在非密集時段關閉或維護其他伺服器。
  • uri:根據請求的 uri 地址來派發伺服器,目的是增加快取的使用率。
  • url_pararm:藉由來源 url 請求中的特定參數字串來派發伺服器。
  • hdr:藉由標頭的內容來派發伺服器,例如來自不同瀏覽器的請求。

如果不知道挑選哪一種,可以先嘗試 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 高可用性架構,希望有幫助到大家。

參考文件

  1. https://docs.haproxy.org/1.7/configuration.html
  2. https://access.redhat.com/documentation/zh-tw/red_hat_enterprise_linux/7/html/load_balancer_administration/ch-initial-setup-vsa
  3. https://access.redhat.com/documentation/zh-tw/red_hat_enterprise_linux/7/html/load_balancer_administration/ch-haproxy-setup-vsa

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言