作者:章文嵩博士 LVS項目介紹 本文介紹了Linux服務器集群系統――LVS(Linux Virtual Server)項目的產生背景和目標,並描述了LVS服務器集群框架及目前提供的軟件,列舉LVS集群系統的特點和一些實際應用,最後,本文談論了LVS項目的開發進展和開發感觸。 1. 背景 當今計算機技術已進入以網絡為中心的計算時期。由於客戶/服務器模型的簡單性、易管理性和易維護性,客戶/服務器計算模式在網上被大量采用。在九十年代中期,萬維網(World Wide Web)的出現以其簡單操作方式將圖文並茂的網上信息帶給普通大眾,Web也正在從一種內容發送機制成為一種服務平台,大量的服務和應用(如新聞服務、網上銀行、電子商務等)都是圍繞著Web進行。這促進Internet用戶劇烈增長和Internet流量爆炸式地增長,圖1顯示了1995至2000年與Internet連接主機數的變化情況[1],可見增長趨勢較以往更迅猛。 圖1:1995至2000年Internet主機數的變化 Internet的飛速發展給網絡帶寬和服務器帶來巨大的挑戰。從網絡技術的發展來看,網絡帶寬的增長遠高於處理器速度和內存訪問速度的增長,如100M Ethernet、ATM、Gigabit Ethernet等不斷地湧現,10Gigabit Ethernet即將就緒,在主干網上密集波分復用(DWDM)將成為寬帶IP的主流技術[2,3],LUCent已經推出在一根光纖跑800Gigabit的WaveStar? OLS 800G產品[4]。所以,我們深信越來越多的瓶頸會出現在服務器端。很多研究顯示Gigabit Ethernet在服務器上很難使得其吞吐率達到1Gb/s的原因是協議棧(TCP/IP)和操作系統的低效,以及處理器的低效,這需要對協議的處理方法、操作系統的調度和IO的處理作更深入的研究。在高速網絡上,重新設計單台服務器上的網絡服務程序也是個重要課題。 比較熱門的站點會吸引前所未有的訪問流量,例如根據Yahoo的新聞發布,Yahoo已經每天發送6.25億頁面[5]。一些網絡服務也收到巨額的流量,如American Online的Web Cache系統每天處理50.2億個用戶訪問Web的請求,每個請求的平均響應長度為5.5Kbytes。與此同時,很多網絡服務因為訪問次數爆炸式地增長而不堪重負,不能及時處理用戶的請求,導致用戶進行長時間的等待,大大降低了服務質量。如何建立可伸縮的網絡服務來滿足不斷增長的負載需求已成為迫在眉睫的問題。 大部分網站都需要提供每天24小時、每星期7天的服務,對電子商務等網站尤為突出,任何服務中斷和關鍵性的數據丟失都會造成直接的商業損失。例如,根據Dell的新聞發布[6],Dell現在每天在網站上的交易收入為一千四百萬美元,一個小時的服務中斷都會造成平均五十八萬美元的損失。所以,這對網絡服務的可靠性提出了越來越高的要求。 現在Web服務中越來越多地使用CGI、動態主頁等CPU密集型應用,這對服務器的性能有較高要求。未來的網絡服務會提供更豐富的內容、更好的交互性、更高的安全性等,需要服務器具有更強的CPU和I/O處理能力。例如,通過HTTPS(Secure HTTP)取一個靜態頁面需要的處理性能比通過HTTP的高一個數量級,HTTPS正在被電子商務站點廣為使用。所以,網絡流量並不能說明全部問題,要考慮到應用本身的發展也需要越來越強的處理性能。 因此,對用硬件和軟件方法實現高可伸縮、高可用網絡服務的需求不斷增長,這種需求可以歸結以下幾點: 可伸縮性(Scalability),當服務的負載增長時,系統能被擴展來滿足需求,且不降低服務質量。 高可用性(Availability),盡管部分硬件和軟件會發生故障,整個系統的服務必須是每天24小時每星期7天可用的。 可管理性(Manageability),整個系統可能在物理上很大,但應該容易管理。 價格有效性(Cost-effectiveness),整個系統實現是經濟的、易支付的。 2. 服務器集群系統 對稱多處理(Symmetric Multi-Processor,簡稱SMP)是由多個對稱的處理器、和通過總線共享的內存和I/O部件所組成的計算機系統。SMP是一種低並行度的結構,是我們通常所說的"緊耦合多處理系統",它的可擴展能力有限,但SMP的優點是單一系統映像(Single System Image),有共享的內存和I/O,易編程。 由於SMP的可擴展能力有限,SMP服務器顯然不能滿足高可伸縮、高可用網絡服務中的負載處理能力不斷增長需求。隨著負載不斷增長,會導致服務器不斷地升級。這種服務器升級有下列不足:一是升級過程繁瑣,機器切換會使服務暫時中斷,並造成原有計算資源的浪費;二是越往高端的服務器,所花費的代價越大;三是SMP服務器是單一故障點(Single Point of Failure),一旦該服務器或應用軟件失效,會導致整個服務的中斷。 通過高性能網絡或局域網互聯的服務器集群正成為實現高可伸縮的、高可用網絡服務的有效結構。這種松耦合結構的服務器集群系統有下列優點: 性能 網絡服務的工作負載通常是大量相互獨立的任務,通過一組服務器分而治之,可以獲得很高的整體性能。 性能/價格比 組成集群系統的PC服務器或RISC服務器和標准網絡設備因為大規模生產降低成本,價格低,具有最高的性能/價格比。若整體性能隨著結點數的增長而接近線性增加,該系統的性能/價格比接近於PC服務器。所以,這種松耦合結構比緊耦合的多處理器系統具有更好的性能/價格比。 可伸縮性 集群系統中的結點數目可以增長到幾千個,乃至上萬個,其伸縮性遠超過單台超級計算機。 高可用性 在硬件和軟件上都有冗余,通過檢測軟硬件的故障,將故障屏蔽,由存活結點提供服務,可實現高可用性。 當然,用服務器集群系統實現可伸縮網絡服務也存在很多挑戰性的工作: 透明性(Transparency) 如何高效地使得由多個獨立計算機組成的松藕合的集群系統構成一個虛擬服務器;客戶端應用程序與集群系統交互時,就像與一台高性能、高可用的服務器交互一樣,客戶端無須作任何修改。部分服務器的切入和切出不會中斷服務,這對用戶也是透明的。 性能(Performance) 性能要接近線性加速,這需要設計很好的軟硬件的體系結構,消除系統可能存在的瓶頸。將負載較均衡地調度到各台服務器上。 高可用性(Availability) 需要設計和實現很好的系統資源和故障的監測和處理系統。當發現一個模塊失敗時,要這模塊上提供的服務遷移到其他模塊上。在理想狀況下,這種遷移是即時的、自動的。 可管理性(Manageability) 要使集群系統變得易管理,就像管理一個單一映像系統一樣。在理想狀況下,軟硬件模塊的插入能做到即插即用(Plug & Play)。 可編程性(Programmability) 在集群系統上,容易開發應用程序。 3. Linux Virtual Server項目 針對高可伸縮、高可用網絡服務的需求,我們給出了基於IP層和基於內容請求分發的負載平衡調度解決方法,並在Linux內核中實現了這些方法,將一組服務器構成一個實現可伸縮的、高可用網絡服務的虛擬服務器。 虛擬服務器的體系結構如圖2所示,一組服務器通過高速的局域網或者地理分布的廣域網相互連接,在它們的前端有一個負載調度器(Load Balancer)。負載調度器能無縫地將網絡請求調度到真實服務器上,從而使得服務器集群的結構對客戶是透明的,客戶訪問集群系統提供的網絡服務就像訪問一台高性能、高可用的服務器一樣。客戶程序不受服務器集群的影響不需作任何修改。系統的伸縮性通過在服務機群中透明地加入和刪除一個節點來達到,通過檢測節點或服務進程故障和正確地重置系統達到高可用性。由於我們的負載調度技術是在Linux內核中實現的,我們稱之為Linux虛擬服務器(Linux Virtual Server)。 圖2:虛擬服務器的結構 在1998年5月,我成立了Linux Virtual Server的自由軟件項目,進行Linux服務器集群的開發工作。同時,Linux Virtual Server項目是國內最早出現的自由軟件項目之一。 Linux Virtual Server項目的目標:使用集群技術和Linux操作系統實現一個高性能、高可用的服務器,它具有很好的可伸縮性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。 目前,LVS項目已提供了一個實現可伸縮網絡服務的Linux Virtual Server框架,如圖3所示。在LVS框架中,提供了含有三種IP負載均衡技術的IP虛擬服務器軟件IPVS、基於內容請求分發的內核Layer-7交換機KTCPVS和集群管理軟件。可以利用LVS框架實現高可伸縮的、高可用的Web、Cache、Mail和Media等網絡服務;在此基礎上,可以開發支持龐大用戶數的、高可伸縮的、高可用的電子商務應用。 圖3:Linux虛擬服務器框架 3.1 IP虛擬服務器軟件IPVS 在調度器的實現技術中,IP負載均衡技術是效率最高的。在已有的IP負載均衡技術中有通過網絡地址轉換(Network Address Translation)將一組服務器構成一個高性能的、高可用的虛擬服務器,我們稱之為VS/NAT技術(Virtual Server via Network Address Translation),大多數商品化的IP負載均衡調度器產品都是使用此方法,如Cisco的LocalDirector、F5的Big/IP和Alteon的ACEDirector。在分析VS/NAT的缺點和網絡服務的非對稱性的基礎上,我們提出通過IP隧道實現虛擬服務器的方法VS/TUN(Virtual Server via IP Tunneling),和通過直接路由實現虛擬服務器的方法VS/DR(Virtual Server via Direct Routing),它們可以極大地提高系統的伸縮性。所以,IPVS軟件實現了這三種IP負載均衡技術,它們的大致原理如下(我們將在其他章節對其工作原理進行詳細描述), Virtual Server via Network Address Translation(VS/NAT) 通過網絡地址轉換,調度器重寫請求報文的目標地址,根據預設的調度算法,將請求分派給後端的真實服務器;真實服務器的響應報文通過調度器時,報文的源地址被重寫,再返回給客戶,完成整個負載調度過程。 Virtual Server via IP Tunneling(VS/TUN) 采用NAT技術時,由於請求和響應報文都必須經過調度器地址重寫,當客戶請求越來越多時,調度器的處理能力將成為瓶頸。為了解決這個問題,調度器把請求報文通過IP隧道轉發至真實服務器,而真實服務器將響應直接返回給客戶,所以調度器只處理請求報文。由於一般網絡服務應答比請求報文大許多,采用VS/TUN技術後,集群系統的最大吞吐量可以提高10倍。 Virtual Server via Direct Routing(VS/DR) VS/DR通過改寫請求報文的MAC地址,將請求發送到真實服務器,而真實服務器將響應直接返回給客戶。同VS/TUN技術一樣,VS/DR技術可極大地提高集群系統的伸縮性。這種方法沒有IP隧道的開銷,對集群中的真實服務器也沒有必須支持IP隧道協議的要求,但是要求調度器與真實服務器都有一塊網卡連在同一物理網段上。 針對不同的網絡服務需求和服務器配置,IPVS調度器實現了如下八種負載調度算法: 輪叫(Round Robin) 調度器通過"輪叫"調度算法將外部請求按順序輪流分配到集群中的真實服務器上,它均等地對待每一台服務器,而不管服務器上實際的連接數和系統負載。 加權輪叫(Weighted Round Robin) 調度器通過"加權輪叫"調度算法根據真實服務器的不同處理能力來調度訪問請求。這樣可以保證處理能力強的服務器處理更多的訪問流量。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。 最少鏈接(Least Connections) 調度器通過"最少連接"調度算法動態地將網絡請求調度到已建立的鏈接數最少的服務器上。如果集群系統的真實服務器具有相近的系統性能,采用"最小連接"調度算法可以較好地均衡負載。 加權最少鏈接(Weighted Least Connections) 在集群系統中的服務器性能差異較大的情況下,調度器采用"加權最少鏈接"調度算法優化負載均衡性能,具有較高權值的服務器將承受較大比例的活動連接負載。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。 基於局部性的最少鏈接(Locality-Based Least Connections) "基於局部性的最少鏈接" 調度算法是針對目標IP地址的負載均衡,目前主要用於Cache集群系統。該算法根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於一半的工作負載,則用"最少鏈接"的原則選出一個可用的服務器,將請求發送到該服務器。 帶復制的基於局部性最少鏈接(Locality-Based Least Connections with Replication) "帶復制的基於局部性最少鏈接"調度算法也是針對目標IP地址的負載均衡,目前主要用於Cache集群系統。它與LBLC算法的不同之處是它要維護從一個目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一台服務器的映射。該算法根據請求的目標IP地址找出該目標IP地址對應的服務器組,按"最小連接"原則從服務器組中選出一台服務器,若服務器沒有超載,將請求發送到該服務器,若服務器超載;則按"最小連接"原則從這個集群中選出一台服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低復制的程度。 目標地址散列(Destination Hashing) "目標地址散列"調度算法根據請求的目標IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。 源地址散列(Source Hashing) "源地址散列"調度算法根據請求的源IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。 3.2 內核Layer-7交換機KTCPVS 在基於IP負載調度技術中,當一個TCP連接的初始SYN報文到達時,調度器就選擇一台服務器,將報文轉發給它。此後通過查發報文的IP和TCP報文頭地址,保證此連接的後繼報文被轉發到該服務器。這樣,IPVS無法檢查到請求的內容再選擇服務器,這就要求後端服務器組提供相同的服務,不管請求被發送到哪一台服務器,返回結果都是一樣的。但是,在有些應用中後端服務器功能不一,有的提供Html文檔,有的提供圖片,有的提供CGI,這就需要基於內容的調度(Content-Based Scheduling)。 由於用戶空間TCP Gateway的開銷太大,我們提出在操作系統的內核中實現Layer-7交換方法,來避免用戶空間與核心空間的切換和內存復制的開銷。在Linux操作系統的內核中,我們實現了Layer-7交換,稱之為KTCPVS(Kernel TCP Virtual Server)。目前,KTCPVS已經能對HTTP請求進行基於內容的調度,但它還不很成熟,在其調度算法和各種協議的功能支持等方面,有大量的工作需要做。 雖然應用層交換處理復雜,它的伸縮性有限,但應用層交換帶來以下好處: 相同頁面的請求被發送到同一服務器,可以提高單台服務器的Cache命中率。 一些研究[5]表明WEB訪問流中存在局部性。Layer-7交換可以充分利用訪問的局部性,將相同類型的請求發送到同一台服務器,使得每台服務器收到的請求具有更好的相似性,可進一步提高單台服務器的Cache命中率。 後端服務器可運行不同類型的服務,如文檔服務,圖片服務,CGI服務和數據庫服務等。 4. LVS集群的特點 LVS集群的特點可以歸結如下: 功能 有實現三種IP負載均衡技術和八種連接調度算法的IPVS軟件。在IPVS內部實現上,采用了高效的Hash函數和垃圾回收機制,能正確處理所調度報文相關的ICMP消息(有些商品化的系統反而不能)。虛擬服務的設置數目沒有限制,每個虛擬服務有自己的服務器集。它支持持久的虛擬服務(如HTTP Cookie和HTTPS等需要該功能的支持),並提供詳盡的統計數據,如連接的處理速率和報文的流量等。針對大規模拒絕服務(Deny of Service)攻擊,實現了三種防衛策略。 有基於內容請求分發的應用層交換軟件KTCPVS,它也是在Linux內核中實現。有相關的集群管理軟件對資源進行監測,能及時將故障屏蔽,實現系統的高可用性。主、從調度器能周期性地進行狀態同步,從而實現更高的可用性。 適用性 後端服務器可運行任何支持TCP/IP的操作系統,包括Linux,各種Unix(如FreeBSD、Sun Solaris、HP Unix等),Mac/OS和Windows NT/2000等。 負載調度器能夠支持絕大多數的TCP和UDP協議: 協議 內 容 TCP HTTP,FTP,PROXY,SMTP,POP3,IMAP4,DNS,LDAP,HTTPS,SSMTP等 UDP DNS,NTP,ICP,視頻、音頻流播放協議等 無需對客戶機和服務器作任何修改,可適用大多數Internet服務。 性能 LVS服務器集群系統具有良好的伸縮性,可支持幾百萬個並發連接。配置100M網卡,采用VS/TUN或VS/DR調度技術,集群系統的吞吐量可高達1Gbits/s;如配置千兆網卡,則系統的最大吞吐量可接近10Gbits/s。 可靠性 LVS服務器集群軟件已經在很多大型的、關鍵性的站點得到很好的應用,所以它的可靠性在真實應用得到很好的證實。有很多調度器運行一年多,未作一次重啟動。 軟件許可證 LVS集群軟件是按GPL(GNU Public License)許可證發行的自由軟件,這意味著你可以得到軟件的源代碼,有權對其進行修改,但必須保證你的修改也是以GPL方式發行。 5. LVS集群的應用 LVS項目從成立到現在為止,受到不少關注,LVS集群系統已被應用於很多重負載的站點,就我所知該系統已在美、英、德、澳等國的幾十個站點上正式使用。 我們沒有上百台機器和高速的網絡來實際測試LVS的終極性能,所以舉LVS的應用實例來說明LVS的高性能和穩定性。我們所知的一些大型LVS應用實例如下: 英國國家JANET Cache Service(wwwcache.ja.net)是為英國150所以上的大學提供Web Cache服務。他們用28個結點的LVS集群代替了原有現50多台相互獨立的Cache服務器,用他們的話說現在速度就跟夏天一樣,因為夏天是放假期間沒有很多人使用網絡。 Linux的門戶站點(www.linux.com)用LVS將很多台VA Linux SMP服務器組成高性能的WEB服務,已使用將近一年。 SourceForge(sourceforge.net)是在全球范圍內為開發源碼項目提供WEB、FTP、Mailing List和CVS等服務,他們也使用LVS將負載調度到十幾台機器上。 世界上最大的PC制造商之一采用了兩個LVS集群系統,一個在美洲,一個在歐洲,用於網上直銷系統。 以RealPlayer提供音頻視頻服務而聞名的Real公司(www.real.com)使用由20台服務器組成的LVS集群,為其全球用戶提供音頻視頻服務。在2000年3月時,整個集群系統已收到平均每秒20,000個連接的請求流。 NetWalk(www.netwalk.com)用多台服務器構造LVS系統,提供1024個虛擬服務,其中本項目的一個美國鏡像站點(www.us.linuxvirtualserver.org)。 RedHat(www.redhat.com)從其6.1發行版起已包含LVS代碼,他們開發了一個LVS集群管理工具叫Piranha,用於控制LVS集群,並提供了一個圖形化的配置界面。 VA Linux(www.valinux.com)向客戶提供基於LVS的服務器集群系統,並且提供相關的服務和支持。 TurboLinux的"世界一流Linux集群產品"TurboCluster實際上是基於LVS的想法和代碼的,只是他們在新聞發布和產品演示時忘了致謝。 紅旗Linux和中軟都提供基於LVS的集群解決方案,並在2000年9月召開的Linux World China 2000上展示。 在這裡,再引用兩位LVS用戶的評論,來進一步說明LVS的性能和可靠性。 "We tried virtually all of the commercial load balancers, LVS beats them all for reliability, cost, manageability, you-name-it" Jerry Glomph Black, Director, Internet & Technical Operations, Real Networks, Seattle Washington, USA http://marc.theaimsgroup.com/?1=linux-virtual-server&m=95385809030794&w=2 "I can say without a douBT that lvs toasts F5/BigIP solutions, at least in our real world implementations. I wouldn't trade a good lvs box for a Cisco Local Director either" Drew Streib, Information Architect, VA Linux Systems, USA http://marc.theaimsgroup.com/?1=linux-virtual-server&m=95385694529750&w=2 6. LVS項目的開發進展與感觸 LVS項目於1998年5月在網站上發布IPVS第一個版本源程序,一直得到了來自 Internet 的用戶和開發者的鼓勵和支持。應該說,剛開始發布的程序是非常簡單的,由於用戶的使用、反饋和期望,讓我覺得這項工作的價值,並不斷地化時間對該軟件添加新功能和完善,其中也得到其他開發者的幫助,所以該軟件逐漸發展成為功能較齊全、有用的系統,這遠遠超出我當初成立項目時的想象。在這裡,我要感謝Julian Anastasov提供了很多系統的Bug fixes和改進,Joseph Mack博士編寫了LVS HOWTO文檔;還感謝一些廠商贊助我開發(如硬件設備等),和贊助我多次出國作相關的技術報告。 目前,正在進行的 LVS項目開發工作包括: 擴充IPVS對其他傳輸協議的支持,如AH(Authentication Header)和ESP(Encapsulating Security Payload )等,這樣IPVS調度器將實現IPSec的服務器集群。 提供一個統一的、功能較完善、更靈活的LVS集群管理軟件。 擴充和改進KTCPVS的調度算法和多種協議的支持,使之功能較完備和系統更穩定。 在TCP粘合(TCP Splicing)和TCP轉移(TCP Handoff)等方面,做一些嘗試性工作,進一步改進LVS集群中的應用層調度。 最後,我談一下自己多年來做自由軟件開發的幾點感觸。一是通過自由軟件方式可以使得軟件具有頑強的生命力;我以前也做過幾個獨立的系統,如在SUN上用Common Lisp開發的知識庫系統和基於C++的對象數據庫系統,有些地方也是做得非常漂亮的(如元級反射機制和對象的關系處理),但因為種種原因這些軟件沒有以開放源碼方式發布,現在它們在我導師的軟件倉庫裡已無人問津,我也已經忘記裡面的實現細節;而LVS項目是我做著玩的,一開始只是個很簡單的程序,通過自由軟件的發布和開發,它發展成一個有用的、功能較齊全的軟件,體現了自由軟件的強大生命力。二是通過自由軟件的集市開發,可以使得初始的想法不斷地深入,可以學到很多東西。三是做自由軟件後時間會更有效率,由於用戶的反饋和期待,會自覺不斷地改進和完善系統,於是沒有時間去玩游戲和網上聊天。四是做自由軟件會使得你有一點點成就感,每當收到用戶的致謝和想到你的軟件在實際系統中運行,會有一點滿足。所以,行動起來吧,花一些時間做自由軟件,你會有意想不到的收獲。 7. LVS項目的網絡資源 如果你對LVS項目感興趣,請訪問Linux Vritual Server項目的主頁(http://www.LinuxVirtualServer.org/或者http://www.linux-vs.org/),你可以獲得最新的 LVS 源代碼和有關運行軟件,及最新的文檔資料。 如果你在使用LVS 的過程中遇到困難,請訂閱我們的郵件列表[email protected],提問、解答或者發表你的高見。 8. 參考文獻 [1] Information Navigators, Internet Growth Charts, http://navigators.com/stats.html [2] Srinivasan Seetharaman. IP over DWDM. http://www.cis.ohio-state.edu-/~jain/cis788-99/ip_dwdm/ [3] Lucent Technologies. Web ProForum tutorial: DWDM. October 1999, http://www.webproforum.com/acrobat/dwdm.pdf [4] Lucent Technologies. Lucent Technologies announces record-breaking 320-channel optical networking system. April 2000, http://www.lucent.com/press-/0400/000417.nsb.html [5] Yahoo! Inc., The Yahoo! Directory and Web Services, http://www.yahoo.com/ [6] Dell Inc. http://www.dell.com/