跳至內容跳至頁面導覽:上一頁 [access key p]/下一頁 [access key n]
documentation.suse.com / SUSE Linux Enterprise High Availability Extension 文件 / 管理指南 / 組態與管理 / 負載平衡
適用範圍 SUSE Linux Enterprise High Availability Extension 15 SP2

14 負載平衡

負載平衡的情況下,一個伺服器叢集對於外部用戶端而言就是一台大型的高速伺服器。這種表面上的單個伺服器稱為虛擬伺服器。它包含一或多個用於發送內送要求的負載平衡器,以及數個執行實際服務的真實伺服器。對 High Availability Extension 完成負載平衡設定後,您可以建置擴充性強、可用性高的網路服務,例如 Web、快取、郵件、FTP、媒體和 VoIP 服務。

14.1 概念綜覽

High Availability Extension 支援兩種負載平衡技術:Linux 虛擬伺服器 (LVS) 和 HAProxy。兩者的主要差別在於,Linux 虛擬伺服器在 OSI 第 4 層 (傳輸層) 上運作,可設定核心的網路層,而 HAProxy 在第 7 層 (應用程式層) 上的使用者空間中執行。因此,Linux 虛擬伺服器所需的資源更少,但處理的負載更多,而 HAProxy 可以檢查流量,執行 SSL 終止,以及根據流量內容做出分派決策。

另一方面,Linux 虛擬伺服器包含兩個不同的軟體:IPVS (IP 虛擬伺服器) 和 KTCPVS (核心 TCP 虛擬伺服器)。IPVS 提供第 4 層負載平衡,而 KTCPVS 提供第 7 層負載平衡。

本章會提供負載平衡與高可用性結合使用的概念綜覽,然後簡要介紹 Linux 虛擬伺服器和 HAProxy。最後,提供其他閱讀材料的連結。

實際的伺服器與負載平衡器之間可透過高速 LAN 或地理位置分散的 WAN 來連接。負載平衡器會將要求發送到不同的伺服器。它們可以讓叢集的多個平行服務顯示為單一 IP 位址 (虛擬 IP 位址或 VIP) 上的一個虛擬服務。發送請求可以使用 IP 負載平衡技術或應用程式層級的負載平衡技術。以透明方式在叢集中新增或移除節點可以實現系統的延展性。

高可用性透過偵測節點或服務失敗,並相應地照常重新設定整個虛擬伺服器系統來實現。

負載平衡策略有多種。以下是一些適用於 Linux 虛擬伺服器的第 4 層策略:

  • 遞迴: 最簡單的策略就是將每個連接輪流導向至不同的位址。例如,一個 DNS 伺服器可能有多個項目對應於一個指定主機名稱。使用 DNS 遞迴時,該 DNS 伺服器會輪流傳回所有這些項目。因此,不同的用戶端將會看到不同的位址。

  • 選取最佳伺服器: 雖然此策略存在一些弊端,但您可以使用第一台做出回應的伺服器負載最低的伺服器方案來實現平衡。

  • 平衡每台伺服器的連接數: 使用者與伺服器之間的負載平衡器可以將一定數量的使用者分散到多台伺服器上。

  • Geo 位置: 可以將用戶端導向至附近的伺服器。

以下是一些適用於 HAProxy 的第 7 層策略:

  • URI: 檢查 HTTP 內容並將其發送到最適合此特定 URL 的伺服器。

  • URL 參數、RDP Cookie: 檢查 HTTP 內容中的工作階段參數 (可能在 post 參數中) 或 RDP (遠端桌面通訊協定) 工作階段 cookie,並將其發送到為此工作階段提供服務的伺服器。

儘管與前一種策略存在一些相同之處,但如果 LVS/ipvsadm 無法滿足需要,您可以使用 HAProxy,反之亦然:

  • SSL 終止: 前端負載平衡器可以處理 SSL 層。因此,雲端節點不需要存取 SSL 金鑰,而可以利用負載平衡器中的 SSL 加速器。

  • 應用程式層級: HAProxy 在應用程式層級運作,因此,負載平衡決策受內容資料流的影響。這樣,便可以根據 cookie 和其他此類過濾器實現持久性。

另一方面,HAProxy 不能完全取代 LVS/ipvsadm

  • LVS 支援直接路由,在此模式下,負載平衡器只運作於內傳資料流中,而外傳流量將直接路由至用戶端。在非對稱環境中,這有可能會大幅提高輸送量。

  • LVS 支援複製可設定狀態的連接表 (透過 conntrackd)。如此便能實現對用戶端和伺服器透明的負載平衡器容錯移轉。

14.2 使用 Linux 虛擬伺服器設定負載平衡

以下幾節概要介紹了主要的 LVS 元件和概念。然後,將介紹如何在 High Availability Extension 上設定 Linux 虛擬伺服器。

14.2.1 導向器

LVS 的主要元件是 ip_vs (或 IPVS) 核心代碼。它是預設核心的一部分,在 Linux 核心中實作輸送層負載平衡 (第 4 層交換)。執行包含 IPVS 代碼的 Linux 核心的節點稱為導向器。在導向器上執行的 IPVS 代碼是 LVS 的必要特性。

當用戶端連接到導向器時,內送請求會在所有叢集節點上達到負載平衡:導向器會使用可使 LVS 工作的一組修改後路由規則,將封包轉遞到實際的伺服器。也即是,導向器不會發起或終止連接,也不會傳送確認通知等等。導向器的作用相當於專用路由器,它會將來自終端使用者的封包轉遞到實際的伺服器 (執行負責處理要求之應用程式的主機)。

14.2.2 使用者空間控制器和精靈

ldirectord 精靈是一個使用者空間精靈,可在 LVS 負載平衡虛擬伺服器叢集中管理 Linux 虛擬伺服器並監控實際的伺服器。組態檔案 (見下文) 指定虛擬服務及其關聯的實際伺服器,並告知 ldirecord 如何將伺服器設定為 LVS 重新導向器。啟始化精靈時,會為叢集建立虛擬服務。

ldirectord 精靈透過不時發出已知 URL 請求並檢查回應的方式,監控實際伺服器的狀態。如果實際伺服器出現故障,便會從負載平衡器的可用伺服器清單中移除。當服務監控器偵測到該停止的伺服器已恢復正常並可重新運作時,會重新將該伺服器新增到可用伺服器清單中。可以指定一台錯誤回復伺服器 (讓 Web 服務重新導向到該伺服器),以防所有實際伺服器都當機。錯誤回復伺服器通常是本地主機,它會顯示一個緊急頁面,告知 Web 服務暫時不可用。

ldirectord 使用 ipvsadm 工具 (套件 ipvsadm) 來操作 Linux 核心中的虛擬伺服器表。

14.2.3 封包轉遞

導向器將用戶端封包傳送至實際伺服器的方式有三種:

網址轉譯 (NAT)

內送的要求會送達虛擬的 IP 位址,然後透過將目的地 IP 位址和連接埠變更為所選實際伺服器的 IP 位址和連接埠,將這些要求轉遞至實際伺服器。實際伺服器會將回應傳送至負載平衡器,再由負載平衡器變更目的地 IP 位址,並將回應轉遞回用戶端。因此,終端使用者會從預期的來源收到回覆。由於所有流量都會通過負載平衡器,因此它往往成為叢集的瓶頸。

IP 通道封裝 (IP-IP 封裝)

IP 通道封裝能將定址到某 IP 位址的封包重新導向至另一個位址 (可能位於不同的網路)。LVS 透過 IP 通道將請求傳送至實際的伺服器 (重新導向至不同的 IP 位址),然後實際伺服器使用自己的路由表直接回覆用戶端。叢集成員可以位於不同的子網路。

直接路由

直接將終端使用者的封包轉遞到實際的伺服器。IP 封包並未修改,因此必須將實際伺服器設定為接受送往虛擬伺服器 IP 位址的流量。實際伺服器的回應將直接傳送至用戶端。實際伺服器和負載平衡器需位於相同的實體網路節區。

14.2.4 排程演算法

使用哪一部實際伺服器來處理用戶端請求的新連接,是由不同的演算法決定的。這些演算法以模組的形式提供,可根據特定需求進行調整。如需可用模組的綜覽,請參閱 ipvsadm(8) man 頁面。從用戶端接收到連接請求後,導向器會依據排程為該用戶端指定實際的伺服器。排程器是 IPVS 核心代碼的一部分,用於決定哪一部實際伺服器將獲取下一個新連接。

如需 Linux 虛擬伺服器排程演算法的更詳細描述,請造訪 http://kb.linuxvirtualserver.org/wiki/IPVS。此外,還可以在 ipvsadm man 頁面中搜尋 --scheduler

可以在 http://www.haproxy.org/download/1.6/doc/configuration.txt 上找到 HAProxy 的相關負載平衡策略。

14.2.5 使用 YaST 設定 IP 負載平衡

您可以使用 YaST IP 負載平衡模組設定基於核心的 IP 負載平衡。這是 ldirectord 的前端。

若要存取 IP 負載平衡對話方塊,請以 root 身分啟動 YaST,然後選取高可用性 ›  IP 負載平衡。或者在指令行上使用 yast2 iplbroot 身分啟動 YaST 叢集模組。

預設安裝不包括組態檔案 /etc/ha.d/ldirectord.cf。此檔案由 YaST 模組建立。YaST 模組中可用的索引標籤與 /etc/ha.d/ldirectord.cf 組態檔案的結構對應,用於定義全域選項和虛擬服務的選項。

如需組態以及所產生之負載平衡器與實際伺服器間程序的範例,請參閱範例 14.1 「簡單的 ldirectord 組態」

注意
注意:全域參數和虛擬伺服器參數

如果同時在虛擬伺服器區段和全域區段指定了某個參數,則虛擬伺服器區段中定義的值將覆寫全域區段中定義的值。

程序 14.1︰ 設定全域參數

以下程序介紹如何設定最重要的全域參數。如需個別參數和此處未涉及之參數的詳細資料,請按一下說明或參閱 ldirectord man 頁面。

  1. 使用檢查間隔時間定義 ldirectord 連接各個實際伺服器以檢查它們是否連接的時間間隔。

  2. 使用檢查逾時設定實際伺服器應在上次檢查後的多少時間內給於回應。

  3. 使用失敗計數可以定義當 ldirectord 嘗試向實際伺服器發出多少次要求後即判定檢查失敗。

  4. 使用協議逾時可以定義協議檢查的逾時時間 (秒)。

  5. 錯誤回復中,輸入當所有實際伺服器都當機時,Web 服務重新導向到之 Web 伺服器的主機名稱或 IP 位址。

  6. 如果希望系統在與實際伺服器的連接狀態發生變更時傳送警示,請在電子郵件警示中輸入有效的電子郵件地址。

  7. 使用電子郵件警示頻率可以定義當實際伺服器長時間無法存取時,重新傳送電子郵件警示的間隔時間 (秒)。

  8. 電子郵件警示狀態中,指定出現哪種伺服器狀態時傳送電子郵件警示。如果要定義多種狀態,可以逗號分隔。

  9. 使用自動重新載入定義 ldirectord 是否應持續監控組態檔案的修改情況。如果設定為,便會在變更後自動重新載入組態。

  10. 使用 Quiescent 參數定義是否要從核心的 LVS 表格中移除發生故障的實際伺服器。如果設定為,則不會移除出現故障的伺服器。而是將其權值設為 0,表示不接受任何新的連接。已建立的連接將保持,直到逾時。

  11. 如果要使用不同的路徑來記錄,請在記錄檔案中指定記錄的路徑。依預設,ldirectord 會將其記錄檔案寫入 /var/log/ldirectord.log

YaST IP 負載平衡 — 全域參數
圖 14.1︰ YaST IP 負載平衡 — 全域參數
程序 14.2︰ 設定虛擬服務

您可以透過為各項虛擬服務定義一對參數的方式設定一或多個虛擬服務。以下程序介紹如何為虛擬服務設定最重要的全域參數。如需個別參數和此處未涉及之參數的詳細資料,請按一下說明或參閱 ldirectord man 頁面。

  1. 在 YaST IP 負載平衡模組中,切換至虛擬伺服器組態索引標籤。

  2. 新增新的虛擬伺服器,或編輯現有的虛擬伺服器。此時會出現一個新的對話方塊並顯示可用的選項。

  3. 虛擬伺服器中輸入以 LVS 形式存取負載平衡器和實際伺服器時所使用的共享虛擬 IP 位址 (IPv4 或 IPv6) 及連接埠。也可以指定主機名稱和服務來代替 IP 位址和連接埠號。或者,也可以使用防火牆標記。防火牆標記是將任意一組 VIP:連接埠服務集結到一個虛擬服務的一種方式。

  4. 若要指定實際伺服器,需要輸入伺服器的 IP 位址 (IPv4、IPv6 或主機名稱)、連接埠 (或服務名稱) 及轉遞方式。轉遞方式必須是 gateipipmasq,詳情請參閱第 14.2.3 節 「封包轉遞」

    按一下新增按鈕並輸入各個實際伺服器所需的引數。

  5. 檢查類型中,選取測試實際伺服器是否仍在工作時執行的檢查類型。例如,若要傳送請求並檢查回應中是否包含預期字串,請選取「協議」。

  6. 如果檢查類型已設定為「協議」,則還需要定義要監控之服務的類型。從服務下拉式方塊中選取所需的服務類型。

  7. 請求中輸入檢查間隔期間向每部實際伺服器所請求之物件的 URI。

  8. 如果要檢查實際伺服器的回應中是否包含某個字串 (I'm alive訊息),請定義要比對的正規表示式。在接收中輸入正規表示式。如果實際伺服器的回應中包含此表示式,說明此實際伺服器正在運行。

  9. 根據您在步驟 6 中選取的服務類型,您還需要指定其他參數以進行驗證。切換至驗證類型索引標籤,然後輸入登入名稱密碼資料庫秘密等詳細資料。如需詳細資訊,請參閱 YaST 說明文字或 ldirectord man 頁面。

  10. 切換至其他索引標籤。

  11. 選取用於負載平衡的規劃程式。如需可用之規劃程式的相關資訊,請參閱 ipvsadm(8) man 頁面。

  12. 選取要使用的協定。如果虛擬服務指定為 IP 位址和連接埠,則必須是 tcpudp 協定。如果虛擬服務指定為防火牆標記,則必須是 fwm 協定。

  13. 根據需要定義其他參數。按一下確定確認您的組態。YaST 會將此組態寫入 /etc/ha.d/ldirectord.cf

YaST IP 負載平衡 — 虛擬服務
圖 14.2︰ YaST IP 負載平衡 — 虛擬服務
範例 14.1︰ 簡單的 ldirectord 組態

圖形 14.1 「YaST IP 負載平衡 — 全域參數」圖形 14.2 「YaST IP 負載平衡 — 虛擬服務」 中的顯示的值會產生以下組態 (定義於 /etc/ha.d/ldirectord.cf):

autoreload = yes 1
    checkinterval = 5 2
    checktimeout = 3 3
    quiescent = yes 4
    virtual = 192.168.0.200:80 5
    checktype = negotiate 6
    fallback = 127.0.0.1:80 7
    protocol = tcp 8
    real = 192.168.0.110:80 gate 9
    real = 192.168.0.120:80 gate 9
    receive = "still alive" 10
    request = "test.html" 11
    scheduler = wlc 12
    service = http 13

1

定義 ldirectord 應持續檢查組態檔案的修改情況。

2

ldirectord 連接各個實際伺服器以檢查它們是否連接的時間間隔。

3

自上次檢查後,實際伺服器應做出回應的時間。

4

指定不要將發生故障的實際伺服器從核心的 LVS 表格中移除,但將其權值設為 0

5

LVS 的虛擬 IP 位址 (VIP)。LVS 可使用連接埠 80 進行連接。

6

為測試實際伺服器是否仍在工作而執行的檢查類型。

7

所有實際伺服器都當機時,將 Web 服務重新導向到的伺服器。

8

要使用的協定。

9

兩個已定義的實際伺服器,可使用連接埠 80 連接。封包轉遞方式是 gate,表示使用直接路由。

10

要在實際伺服器之回應字串中比對的正規表示式。

11

檢查間隔期間向每部實際伺服器所請求之物件的 URI。

12

所選的用於負載平衡的規劃程式。

13

要監控的服務類型。

此組態會產生以下程序流:ldirectord 將每隔 5 秒 (2) 連接一次各個實際伺服器,並請求911 中指定的 192.168.0.110:80/test.html192.168.0.120:80/test.html。如果最後一次檢查時,3 秒內 (3) 未從某部實際伺服器收到預期的 still alive 字串 (10),則會將該實際伺服器從可用池中移除。但是,由於設定了 quiescent=yes (4),因此該實際伺服器不會從 LVS 表中移除。其權數會設定為 0,這樣便不會接受與此實際伺服器的新連接。已建立的連接將保持,直到逾時。

14.2.6 更多設定

除了需要使用 YaST 設定 ldirectord 組態之外,您還需要確定以下條件均已符合才能完成 LVS 的設定:

  • 已正確設定實際伺服器以提供所需的服務。

  • 一或多個負載平衡伺服器必須能夠採用 IP 轉遞方式將流量路由到實際伺服器。實際伺服器的網路組態取決於您選擇的封包轉遞方法。

  • 為了防止一或多個負載平衡伺服器成為整個系統的單一故障點,需要設定一或多個負載平衡器的備份。在叢集組態中,設定 ldirectord 的基本資源,這樣在出現硬體故障時,ldirectord 便可容錯移轉到其他伺服器。

  • 由於負載平衡器的備份也需要 ldirectord 組態檔案來完成此任務,因此請確定要用做負載平衡器之備份的所有伺服器上,/etc/ha.d/ldirectord.cf 均可用。您可以依照第 4.5 節 「將組態傳輸至所有節點」 所述使用 Csync2 同步組態檔案。

14.3 使用 HAProxy 設定負載平衡

下面的部分提供了 HAProxy 的綜覽,並介紹了如何在 High Availability 上進行設定。負載平衡器會將所有要求配送至其後端伺服器。它設定為主動/被動模式,也就是說,當主要節點失敗時,從屬節點就會變成主要節點。在這種情況下,使用者感受不到任何服務中斷的跡象。

在本節中,我們將使用以下設定:

  • IP 位址為 192.168.1.99 的負載平衡器。

  • 一個虛擬浮動 IP 位址 192.168.1.99.

  • 我們的伺服器 (通常用於代管 Web 內容) www1.example.com (IP:192.168.1.200) 和 www2.example.com (IP:192.168.1.201)

若要設定 HAProxy,請執行以下程序:

  1. 安裝 haproxy 套件中可用。

  2. 建立包含以下內容的 /etc/haproxy/haproxy.cfg 檔案:

    global 1
      maxconn 256
      daemon
    
    defaults 2
      log     global
      mode    http
      option  httplog
      option  dontlognull
      retries 3
      option redispatch
      maxconn 2000
      timeout connect   5000  3
      timeout client    50s   4
      timeout server    50000 5
    
    frontend LB
      bind 192.168.1.99:80 6
      reqadd X-Forwarded-Proto:\ http
      default_backend LB
    
    backend LB
      mode http
      stats enable
      stats hide-version
      stats uri /stats
      stats realm Haproxy\ Statistics
      stats auth haproxy:password	7
      balance roundrobin	8
      option  httpclose
      option forwardfor
      cookie LB insert
      option httpchk GET /robots.txt HTTP/1.0
      server web1-srv 192.168.1.200:80 cookie web1-srv check
      server web2-srv 192.168.1.201:80 cookie web2-srv check

    1

    包含程序範圍選項和作業系統特定選項的區段。

    maxconn

    每個程序的最大同時連接數。

    daemon

    建議的模式,HAProxy 將在背景中執行。

    2

    用於為位於其宣告之後的所有其他區段設定預設參數的區段。一些重要的行:

    redispatch

    啟用或停用在連接失敗時重新配送工作階段的功能。

    log

    啟用事件和流量記錄。

    mode http

    以 HTTP 模式運作 (針對 HAProxy 建議的模式)。在此模式下,在連接到任一伺服器之前會先分析要求。不符合 RFC 的要求將會遭到拒絕。

    option forwardfor

    將 HTTP X-Forwarded-For 標頭新增至要求中。如果您想要保留用戶端的 IP 位址,則需要使用此選項。

    3

    成功嘗試與伺服器建立連接之前可以等待的最長時間。

    4

    用戶端可保持非活動狀態的最長時間。

    5

    伺服器端可保持非活動狀態的最長時間。

    6

    在該區段中,前端區段和後端區段合併成一個區段。

    balance leastconn

    定義負載平衡演算法,請參閱 http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#4-balance

    stats enable , stats auth

    啟用統計報告 (透過 stats enable)。auth 選項記錄有關特定帳戶的驗證的統計資料。

    7

    HAProxy 統計資料報告頁面的身分證明。

    8

    負載平衡將採用輪替式程序運作。

  3. 測試組態檔案:

    root # haproxy -f /etc/haproxy/haproxy.cfg -c
  4. 將以下行新增至 Csync2 的組態檔案 /etc/csync2/csync2.cfg 中,以確定包括 HAProxy 組態檔案:

    include /etc/haproxy/haproxy.cfg
  5. 同步該檔案:

    root # csync2 -f /etc/haproxy/haproxy.cfg
    root # csync2 -xv
    注意
    注意

    Csync2 組態部分假設 HA 節點是使用 ha-cluster-bootstrap 設定的。如需詳細資料,請參閱《安裝與設定快速入門》。

  6. 務必在兩個負載平衡器 (alicebob) 上都停用 HAProxy,因為它會由 Pacemaker 啟動:

    root # systemctl disable haproxy
  7. 設定新的 CIB:

    root # crm configure
    crm(live)# cib new haproxy-config
    crm(haproxy-config)# primitive haproxy systemd:haproxy \
        op start timeout=120 interval=0 \
        op stop timeout=120 interval=0 \
        op monitor timeout=100 interval=5s \
        meta target-role=Started
    crm(haproxy-config)# primitive vip IPaddr2 \
        params ip=192.168.1.99 nic=eth0 cidr_netmask=23 broadcast=192.168.1.255 \
        op monitor interval=5s timeout=120 on-fail=restart
    crm(haproxy-config)# group g-haproxy vip haproxy
  8. 驗證新 CIB 並修正任何錯誤:

    crm(haproxy-config)# verify
  9. 提交新的 CIB:

    crm(haproxy-config)# cib use live
    crm(live)# cib commit haproxy-config

14.4 更多資訊