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,然後選取 › 。或者在指令行上使用 yast2 iplb
以 root
身分啟動 YaST 叢集模組。
預設安裝不包括組態檔案 /etc/ha.d/ldirectord.cf
。此檔案由 YaST 模組建立。YaST 模組中可用的索引標籤與 /etc/ha.d/ldirectord.cf
組態檔案的結構對應,用於定義全域選項和虛擬服務的選項。
如需組態以及所產生之負載平衡器與實際伺服器間程序的範例,請參閱範例 14.1 「簡單的 ldirectord 組態」。
如果同時在虛擬伺服器區段和全域區段指定了某個參數,則虛擬伺服器區段中定義的值將覆寫全域區段中定義的值。
以下程序介紹如何設定最重要的全域參數。如需個別參數和此處未涉及之參數的詳細資料,請按一下ldirectord
man 頁面。
使用
定義ldirectord
連接各個實際伺服器以檢查它們是否連接的時間間隔。使用
設定實際伺服器應在上次檢查後的多少時間內給於回應。使用
可以定義當ldirectord
嘗試向實際伺服器發出多少次要求後即判定檢查失敗。使用
可以定義協議檢查的逾時時間 (秒)。在
中,輸入當所有實際伺服器都當機時,Web 服務重新導向到之 Web 伺服器的主機名稱或 IP 位址。如果希望系統在與實際伺服器的連接狀態發生變更時傳送警示,請在
中輸入有效的電子郵件地址。使用
可以定義當實際伺服器長時間無法存取時,重新傳送電子郵件警示的間隔時間 (秒)。在
中,指定出現哪種伺服器狀態時傳送電子郵件警示。如果要定義多種狀態,可以逗號分隔。使用
定義ldirectord
是否應持續監控組態檔案的修改情況。如果設定為是
,便會在變更後自動重新載入組態。使用
參數定義是否要從核心的 LVS 表格中移除發生故障的實際伺服器。如果設定為 ,則不會移除出現故障的伺服器。而是將其權值設為0
,表示不接受任何新的連接。已建立的連接將保持,直到逾時。如果要使用不同的路徑來記錄,請在
中指定記錄的路徑。依預設,ldirectord
會將其記錄檔案寫入/var/log/ldirectord.log
。
您可以透過為各項虛擬服務定義一對參數的方式設定一或多個虛擬服務。以下程序介紹如何為虛擬服務設定最重要的全域參數。如需個別參數和此處未涉及之參數的詳細資料,請按一下ldirectord
man 頁面。
在 YaST IP 負載平衡模組中,切換至
索引標籤。在
中輸入以 LVS 形式存取負載平衡器和實際伺服器時所使用的共享虛擬 IP 位址 (IPv4 或 IPv6) 及連接埠。也可以指定主機名稱和服務來代替 IP 位址和連接埠號。或者,也可以使用防火牆標記。防火牆標記是將任意一組VIP:連接埠
服務集結到一個虛擬服務的一種方式。若要指定
,需要輸入伺服器的 IP 位址 (IPv4、IPv6 或主機名稱)、連接埠 (或服務名稱) 及轉遞方式。轉遞方式必須是gate
、ipip
或masq
,詳情請參閱第 14.2.3 節 「封包轉遞」。按一下
按鈕並輸入各個實際伺服器所需的引數。在
中,選取測試實際伺服器是否仍在工作時執行的檢查類型。例如,若要傳送請求並檢查回應中是否包含預期字串,請選取「協議
」。如果
已設定為「協議
」,則還需要定義要監控之服務的類型。從 下拉式方塊中選取所需的服務類型。在
中輸入檢查間隔期間向每部實際伺服器所請求之物件的 URI。如果要檢查實際伺服器的回應中是否包含某個字串 (「I'm alive」訊息),請定義要比對的正規表示式。在 中輸入正規表示式。如果實際伺服器的回應中包含此表示式,說明此實際伺服器正在運行。
根據您在步驟 6 中選取的 類型,您還需要指定其他參數以進行驗證。切換至 索引標籤,然後輸入 、 、 或 等詳細資料。如需詳細資訊,請參閱 YaST 說明文字或
ldirectord
man 頁面。切換至
索引標籤。選取用於負載平衡的
。如需可用之規劃程式的相關資訊,請參閱ipvsadm(8)
man 頁面。選取要使用的
。如果虛擬服務指定為 IP 位址和連接埠,則必須是tcp
或udp
協定。如果虛擬服務指定為防火牆標記,則必須是fwm
協定。根據需要定義其他參數。按一下
確認您的組態。YaST 會將此組態寫入/etc/ha.d/ldirectord.cf
。
圖形 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
定義 | |
| |
自上次檢查後,實際伺服器應做出回應的時間。 | |
指定不要將發生故障的實際伺服器從核心的 LVS 表格中移除,但將其權值設為 | |
LVS 的虛擬 IP 位址 (VIP)。LVS 可使用連接埠 | |
為測試實際伺服器是否仍在工作而執行的檢查類型。 | |
所有實際伺服器都當機時,將 Web 服務重新導向到的伺服器。 | |
要使用的協定。 | |
兩個已定義的實際伺服器,可使用連接埠 | |
要在實際伺服器之回應字串中比對的正規表示式。 | |
檢查間隔期間向每部實際伺服器所請求之物件的 URI。 | |
所選的用於負載平衡的規劃程式。 | |
要監控的服務類型。 |
此組態會產生以下程序流:ldirectord
將每隔 5 秒 (2) 連接一次各個實際伺服器,並請求9 和11 中指定的 192.168.0.110:80/test.html
或 192.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,請執行以下程序:
安裝 haproxy 套件中可用。
建立包含以下內容的
/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
包含程序範圍選項和作業系統特定選項的區段。
maxconn
每個程序的最大同時連接數。
daemon
建議的模式,HAProxy 將在背景中執行。
用於為位於其宣告之後的所有其他區段設定預設參數的區段。一些重要的行:
redispatch
啟用或停用在連接失敗時重新配送工作階段的功能。
log
啟用事件和流量記錄。
mode http
以 HTTP 模式運作 (針對 HAProxy 建議的模式)。在此模式下,在連接到任一伺服器之前會先分析要求。不符合 RFC 的要求將會遭到拒絕。
option forwardfor
將 HTTP
X-Forwarded-For
標頭新增至要求中。如果您想要保留用戶端的 IP 位址,則需要使用此選項。
成功嘗試與伺服器建立連接之前可以等待的最長時間。
用戶端可保持非活動狀態的最長時間。
伺服器端可保持非活動狀態的最長時間。
在該區段中,前端區段和後端區段合併成一個區段。
balance leastconn
定義負載平衡演算法,請參閱 http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#4-balance。
stats enable
,stats auth
啟用統計報告 (透過
stats enable
)。auth
選項記錄有關特定帳戶的驗證的統計資料。
HAProxy 統計資料報告頁面的身分證明。
負載平衡將採用輪替式程序運作。
測試組態檔案:
root #
haproxy
-f /etc/haproxy/haproxy.cfg -c將以下行新增至 Csync2 的組態檔案
/etc/csync2/csync2.cfg
中,以確定包括 HAProxy 組態檔案:include /etc/haproxy/haproxy.cfg
同步該檔案:
root #
csync2
-f /etc/haproxy/haproxy.cfgroot #
csync2
-xv注意Csync2 組態部分假設 HA 節點是使用
ha-cluster-bootstrap
設定的。如需詳細資料,請參閱《安裝與設定快速入門》。務必在兩個負載平衡器 (
alice
和bob
) 上都停用 HAProxy,因為它會由 Pacemaker 啟動:root #
systemctl
disable haproxy設定新的 CIB:
root #
crm
configurecrm(live)#
cib
new haproxy-configcrm(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=Startedcrm(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=restartcrm(haproxy-config)#
group
g-haproxy vip haproxy驗證新 CIB 並修正任何錯誤:
crm(haproxy-config)#
verify
提交新的 CIB:
crm(haproxy-config)#
cib
use livecrm(live)#
cib
commit haproxy-config
14.4 更多資訊 #
如需有關
ldirectord
的資訊,請參閱完整的 man 頁面。