本文主要介紹了 LVS 集群的體系結構。先給出 LVS 集群的通用體系結構,並討論了其的設計原則和相應的特點;最後將 LVS 集群應用於建立可伸縮的 Web、Media、Cache 和 Mail 等網絡服務。
1. 引言
在過去的十幾年中,Internet 從幾個研究機構相連為信息共享的網絡發展成為擁有大量應用和服務的全球性網絡,它正成為人們生活中不可缺少的一部分。雖然 Internet 發展速度很快,但建設和維護大型網絡服務依然是一項挑戰性的任務,因為系統必須是高性能的、高可靠的,尤其當訪問負載不斷增長時,系統必須能被擴展來滿足不斷增長的性能需求。由於缺少建立可伸縮網絡服務的框架和設計方法,這意味著只有擁有非常出色工程和管理人才的機構才能建立和維護大型的網絡服務。
針對這種情形,本文先給出 LVS 集群的通用體系結構,並討論了其的設計原則和相應的特點;最後將 LVS 集群應用於建立可伸縮的 Web、Media、Cache 和 Mail 等網絡服務。
2. LVS 集群的通用體系結構
LVS 集群采用IP負載均衡技術和基於內容請求分發技術。調度器具有很好的吞吐率,將請求均衡地轉移到不同的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。整個服務器集群的結構對客戶是透明的,而且無需修改客戶端和服務器端的程序。
為此,在設計時需要考慮系統的透明性、可伸縮性、高可用性和易管理性。一般來說,LVS 集群采用三層結構,其體系結構如圖1所示,三層主要組成部分為:
* 負載調度器(load balancer),它是整個集群對外面的前端機,負責將客戶的請求發送到一組服務器上執行,而客戶認為服務是來自一個 IP 地址(我們可稱之為虛擬 IP 地址)上的。
* 服務器池(server pool),是一組真正執行客戶請求的服務器,執行的服務有 WEB、MAIL、FTP 和 DNS 等。
* 共享存儲(shared storage),它為服務器池提供一個共享的存儲區,這樣很容易使得服務器池擁有相同的內容,提供相同的服務。
調度器是服務器集群系統的唯一入口點(Single Entry Point),它可以采用IP負載均衡技術、基於內容請求分發技術或者兩者相結合。在IP負載均衡技術中,需要服務器池擁有相同的內容提供相同的服務。當客戶請求到達時,調度器只根據服務器負載情況和設定的調度算法從服務器池中選出一個服務器,將該請求轉發到選出的服務器,並記錄這個調度;當這個請求的其他報文到達,也會被轉發到前面選出的服務器。在基於內容請求分發技術中,服務器可以提供不同的服務,當客戶請求到達時,調度器可根據請求的內容選擇服務器執行請求。因為所有的操作都是在 Linux >操作系統核心空間中將完成的,它的調度開銷很小,所以它具有很高的吞吐率。
服務器池的結點數目是可變的。當整個系統收到的負載超過目前所有結點的處理能力時,可以在服務器池中增加服務器來滿足不斷增長的請求負載。對大多數網絡服務來說,請求間不存在很強的相關性,請求可以在不同的結點上並行執行,所以整個系統的性能基本上可以隨著服務器池的結點數目增加而線性增長。
共享存儲通常是數據庫、網絡文件系統或者分布式文件系統。服務器結點需要動態更新的數據一般存儲在數據庫系統中,同時數據庫會保證並發訪問時數據的一致性。靜態的數據可以存儲在網絡文件系統(如 NFS/CIFS)中,但網絡文件系統的伸縮能力有限,一般來說,NFS/CIFS 服務器只能支持3~6個繁忙的服務器結點。對於規模較大的集群系統,可以考慮用分布式文件系統,如 AFS[1]、GFS[2.3]、Coda[4] 和 Intermezzo[5] 等。分布式文件系統可為各服務器提供共享的存儲區,它們訪問分布式文件系統就像訪問本地文件系統一樣,同時分布式文件系統可提供良好的伸縮性和可用性。此外,當不同服務器上的應用程序同時讀寫訪問分布式文件系統上同一資源時,應用程序的訪問沖突需要消解才能使得資源處於一致狀態。這需要一個分布式鎖管理器(Distributed Lock Manager),它可能是分布式文件系統內部提供的,也可能是外部的。開發者在寫應用程序時,可以使用分布式鎖管理器來保證應用程序在不同結點上並發訪問的一致性。
負載調度器、服務器池和共享存儲系統通過高速網絡相連接,如 100Mbps 交換網絡、Myrinet 和 Gigabit 網絡等。使用高速的網絡,主要為避免當系統規模擴大時>互聯網絡成為整個系統的瓶頸。
Graphic Monitor 是為系統管理員提供整個集群系統的監視器,它可以監視系統的狀態。Graphic Monitor 是基於浏覽器的,所以無論管理員在本地還是異地都可以監測系統的狀況。為了安全的原因,浏覽器要通過 HTTPS(Secure HTTP)協議和身份認證後,才能進行系統監測,並進行系統的配置和管理。
2.1. 為什麼使用層次的體系結構
層次的體系結構可以使得層與層之間相互獨立,每一個層次提供不同的功能,在一個層次可以重用不同的已有軟件。例如,調度器層提供了負載平衡、可伸縮性和高可用性等,在服務器層可以運行不同的網絡服務,如 Web、Cache、Mail 和Media等,來提供不同的可伸縮網絡服務。明確的功能劃分和清晰的層次結構使得系統容易建設,以後整個系統容易維護,而且系統的性能容易被擴展。
2.2. 為什麼是共享存儲
共享存儲如分布式文件系統在這個 LVS 集群系統是可選項。當網絡服務需要有相同的內容,共享存儲是很好的選擇,否則每台服務器需要將相同的內容復制到本地硬盤上。當系統存儲的內容越多,這種無共享結構(Shared-nothing Structure)的代價越大,因為每台服務器需要一樣大的存儲空間,任何的更新需要涉及到每台服務器,系統的維護代價會非常高。
共享存儲為服務器組提供統一的存儲空間,這使得系統的內容維護工作比較輕松,如 Webmaster 只需要更新共享存儲中的頁面,對所有的服務器都有效。分布式文件系統提供良好的伸縮性和可用性,當分布式文件系統的存儲空間增加時,所有服務器的存儲空間也隨之增大。對於大多數 Internet 服務來說,它們都是讀密集型(Read-intensive)的應用,分布式文件系統在每台服務器使用本地硬盤作 Cache(如2Gbytes的空間),可以使得訪問分布式文件系統本地的速度接近於訪問本地硬盤。
此外,存儲硬件技術的發展也促使從無共享的集群向共享存儲的集群遷移。存儲區域網(Storage Area Networks)技術解決了集群的每個結點可以直接連接/共享一個龐大的硬盤陣列,硬件廠商也提供多種硬盤共享技術,如光纖通道(Fiber Channel)、共享 SCSI(Shared SCSI)。InfiniBand 是一個通用的高性能 I/O 規范,使得存儲區域網中以更低的延時傳輸 I/O 消息和集群通訊消息,並且提供很好的伸縮性。InfiniBand 得到絕大多數的大廠商的支持,如 Compaq、Dell、Hewlett-Packard、IBM、Intel、Microsoft 和 SUN Microsystems 等,它正在成為一個業界的標准。這些技術的發展使得共享存儲變得容易,規模生產也會使得成本逐步降低。
2.3. 高可用性
集群系統的特點是它在軟硬件上都有冗余。系統的高可用性可以通過檢測節點或服務進程故障和正確地重置系統來實現,使得系統收到的請求能被存活的結點處理。
通常,我們在調度器上有資源監測進程來時刻監視各個服務器結點的健康狀況。當服務器對 ICMP ping 不可達時或者探測她的網絡服務在指定的時間沒有響應時,資源監測進程通知>操作系統內核將該服務器從調度列表中刪除或者失效。這樣,新的服務請求就不會被調度到壞的結點。資源監測進程能通過電子郵件或傳呼機向管理員報告故障。一旦監測進程到服務器恢復工作,通知調度器將其加入調度列表進行調度。另外,通過系統提供的管理程序,管理員可發命令隨時可以將新機器加入服務來提高系統的處理性能,也可以將已有的服務器切出服務,以便對服務器進行系統維護。
現在前端的調度器有可能成為系統的單一失效點(Single Point of Failure)。一般來說,調度器的可靠性較高,因為調度器上運行的程序較少而且大部分程序早已經遍歷過,但我們不能排除硬件老化、網絡線路或者人為誤操作等主要故障。為了避免調度器失效而導致整個系統不能工作,我們需要設立一個從調度器作為主調度器的備份。兩個心跳(Heartbeat)進程[6]分別在主、從調度器上運行,它們通過串口線和 UDP 等心跳線來相互定時地匯報各自的健康狀況。當從調度器不能聽得主調度器的心跳時,從調度器通過ARP欺騙(Gratuitous ARP)來接管集群對外的 Virtual IP Address,同時接管主調度器的工作來提供負載調度服務。當主調度器恢復時,這裡有兩種方法,一是主調度器自動變成從調度器,二是從調度器釋放 Virtual IP Address,主調度器收回 Virtual IP Address 並提供負載調度服務。這裡,多條心跳線可以使得因心跳線故障導致誤判(即從調度器認為主調度器已經失效,其實主調度器還在正常工作)的概論降到最低。
通常,當主調度器失效時,主調度器上所有已建立連接的狀態信息將丟失,已有的連接會中斷。客戶需要向重新連接,從調度器才會將新連接調度到各個服務器上,這對客戶會造成一定的不便。為此,IPVS 調度器在 Linux 內核中實現一種高效狀態同步機制,將主調度器的狀態信息及時地同步到從調度器。當從調度器接管時,絕大部分已建立的連接會持續下去。
3. 可伸縮 Web 服務
基於 LVS 的 Web 集群的體系結構如圖2所示:第一層是負載調度器,一般采用 IP 負載均衡技術,可以使得整個系統有較高的吞吐率;第二層是 Web 服務器池,在每個結點上可以分別運行 HTTP 服務或 HTTPS 服務、或者兩者都運行;第三層是共享存儲,它可以是數據庫,可以是網絡文件系統或分布式文件系統,或者是三者的混合。集群中各結點是通過高速網絡相連接的。
對於動態頁面(如 PHP、JSP 和 ASP 等),需要訪問的動態數據一般存儲在數據庫服務器中。數據庫服務運行在獨立的服務器上,為所有 Web 服務器共享。無論同一 Web 服務器上多個動態頁面訪問同一數據,還是不同 Web 服務器上多個動態頁面訪問同一數據,數據庫服務器有鎖機制使得這些訪問有序地進行,從而保證數據的一致性。
對於靜態的頁面和文件(如 HTML 文檔和圖片等),可以存儲在網絡文件系統或者分布式文件系統中。至於選擇哪一種,看系統的規模和需求而定。通過共享的網絡文件系統或者分布式文件系統, Webmaster 可以看到統一的文檔存儲空間,維護和更新頁面比較方便,對共享存儲中頁面的修改對所有的服務器都有效。
在這種結構下,當所有服務器結點超載時,管理員可以很快地加入新的服務器結點來處理請求,而無需將 Web 文檔等復制到結點的本地硬盤上。
有些 Web 服務可能用到 HTTP Cookie,它是將數據存儲在客戶的浏覽器來追蹤和標識客戶的機制。使用 HTTP Cookie 後,來同一客戶的不同連接存在相關性,這些連接必須被發送到同一 Web 服務器。一些 Web 服務使用安全的 HTTPS 協議,它是 HTTP 協議加 SSL(Secure Socket Layer)協議。另有些Web服務可能使用安全的 HTTPS 協議,它是 HTTP 協議加 SSL 協議。當客戶訪問 HTTPS 服務(HTTPS 的缺省端口為 443)時,會先建立一個 SSL 連接,來交換對稱公鑰加密的證書並協商一個 SSL Key,來加密以後的會話。在 SSL Key 的生命周期內,後續的所有 HTTPS 連接都使用這個 SSL Key,所以同一客戶的不同 HTTPS 連接也存在相關性。針對這些需要,IPVS調度器提供了持久服務的功能,它可以使得在設定的時間內,來自同一 IP 地址的不同連接會被發送到集群中同一個服務器結點,可以很好地解決客戶連接的相關性問題。
4. 可伸縮媒體服務
基於 LVS 的媒體集群的體系結構如圖3所示:第一層是負載調度器,一般采用 IP 負載均衡技術,可以使得整個系統有較高的吞吐率;第二層是 Web 服務器池,在每個結點上可以運行相應的媒體服務;第三層是共享存儲,通過網絡文件系統/分布式文件系統存儲媒體節目。集群中各結點是通過高速網絡相連接。
IPVS 負載調度器一般使用直接路由方法(即 VS/DR 方法,將在以後文章中詳細敘述),來架構媒體集群系統。調度器將媒體服務請求較均衡地分發到各個服務器上,而媒體服務器將響應數據直接返回給客戶,這樣可以使得整個媒體集群系統具有很好的伸縮性。
媒體服務器可以運行各種媒體服務軟件。目前,LVS 集群對於 Real Media、Windows Media 和 Apple Quicktime 媒體服務都有很好的支持,都有真實的系統在運行。一般來說,流媒體服務都會使用一個TCP連接(如 RTSP 協議:Real-Time Streaming Protocol)進行帶寬的協商和流速的控制,通過 UDP 將流數據返回客戶。這裡,IPVS 調度器提供功能將 TCP 和 UDP 集中考慮,保證來自同一客戶的媒體 TCP 和 UDP 連接會被轉發到集群中同一台媒體服務器,使得媒體服務准確無誤地進行。
共享存儲是媒體集群系統中最關鍵的問題,因為媒體文件往往非常大(一部片子需要幾百兆到幾千兆的存儲空間),這對存儲的容量和讀的速度有較高的要求。對於規