曹園青
(河套學(xué)院網(wǎng)絡(luò)信息中心,巴彥淖爾015000)
作為現(xiàn)代互聯(lián)網(wǎng)最常用的網(wǎng)絡(luò)服務(wù)提供方式,Web 服務(wù)已經(jīng)根深蒂固到我們?nèi)粘I畹姆椒矫婷妫W(wǎng)購、社交、金融、教育無不例外。隨著中國網(wǎng)民數(shù)量及使用網(wǎng)絡(luò)時(shí)間的雙重增加,單位時(shí)間對(duì)Web 服務(wù)器的并發(fā)量也在急劇增大[1]。此外,業(yè)務(wù)量的提高,網(wǎng)絡(luò)訪問量和數(shù)據(jù)流量快速增長(zhǎng),使各個(gè)核心組件的處理能力和計(jì)算強(qiáng)度也相應(yīng)增大,單一的服務(wù)器設(shè)備根本無法承擔(dān)[2],從而就會(huì)出現(xiàn)服務(wù)器負(fù)載過重導(dǎo)致頁面無響應(yīng)等使用戶使用體驗(yàn)較差等狀況[3]。
解決上述問題最奏效的方式,就是Web 服務(wù)器集群策略,通俗地講,就是Web 系統(tǒng)不再是由一臺(tái)服務(wù)器構(gòu)成,而是由多臺(tái)分布式的服務(wù)器共同組成,但對(duì)于用戶而言,就如同一臺(tái)服務(wù)器一般。把用戶的所有的高并發(fā)請(qǐng)求按照一定的算法合理地分配到后方服務(wù)器,充分調(diào)動(dòng)每一臺(tái)服務(wù)器的資源(CPU、內(nèi)存、硬盤、SCSI 總線等),由過去的“一(服務(wù)器)對(duì)一(客戶端)”服務(wù),切換到現(xiàn)在的“多(服務(wù)器)對(duì)一(客戶端)”服務(wù),大大提高了用戶訪問速度和Web 系統(tǒng)性能,縮短了客戶端響應(yīng)請(qǐng)求時(shí)間,解決了高并發(fā)訪問應(yīng)用服務(wù)器的難題。
負(fù)載均衡是服務(wù)器集群中一種最常見的策略,而服務(wù)器的負(fù)載均衡表示的是多臺(tái)服務(wù)器以對(duì)稱的方式組成一個(gè)服務(wù)器,每臺(tái)服務(wù)器的地位都相同,都可以獨(dú)立對(duì)外提供服務(wù)[4],它們按照一定的算法規(guī)則,共同為用戶群提供服務(wù),當(dāng)有用戶請(qǐng)求時(shí),先由負(fù)載均衡模塊將用戶請(qǐng)求轉(zhuǎn)發(fā)給后端服務(wù)器[5]。
負(fù)載均衡技術(shù)的主要優(yōu)點(diǎn)有:拓展現(xiàn)有的網(wǎng)絡(luò)帶寬、增加吞吐量、加強(qiáng)網(wǎng)絡(luò)數(shù)據(jù)處理能力、提升網(wǎng)絡(luò)的靈活性和可用性,有效解決數(shù)據(jù)訪問和業(yè)務(wù)信息急劇增長(zhǎng)給服務(wù)器帶來的巨大處理壓力[6]。
實(shí)現(xiàn)負(fù)載均衡的方法有很多種,如硬件負(fù)載均衡策略、軟件負(fù)載均衡策略、IP 負(fù)載均衡策略、LVS 負(fù)載均衡策略,用途最為廣泛的是硬件負(fù)載均衡策略和軟件負(fù)載均衡策略。硬件方式是指通過硬件來實(shí)現(xiàn)負(fù)載均衡,例如華為的F5 硬件負(fù)載均衡器[7],由于單一的設(shè)備完成單一的任務(wù),所以系統(tǒng)性能特別高,可以達(dá)到極佳的負(fù)載均衡效果,但唯一的缺點(diǎn)就是價(jià)格昂貴。而軟件負(fù)載均衡策略是指在服務(wù)器或者集群的每臺(tái)服務(wù)器的操作系統(tǒng)上安裝軟件來實(shí)現(xiàn)負(fù)載均衡,主流的軟件有Connect Control、DNS Load Balance、Nginx、Check Point Firewall-1、Ha proxy 等,它具有配置容易、操作簡(jiǎn)單、價(jià)格便宜等優(yōu)點(diǎn),但性能比起硬件負(fù)載均衡來說略顯一般,其中最為普遍和經(jīng)典的策略為Nginx。
Nginx 的創(chuàng)始人是俄羅斯著名系統(tǒng)管理人Igor Sysoev,起初被用于開發(fā)俄羅斯的國家Web 門戶站點(diǎn)Rambler.ru,在2004 年Nginx 的源代碼被發(fā)布。因其內(nèi)存占用率低、并發(fā)能力強(qiáng)的特點(diǎn),為整個(gè)市場(chǎng)所青睞[8]。此外,Nginx 作為世界第2 大服務(wù)器軟件,因其良好的架構(gòu)和開源特性,使得對(duì)其的應(yīng)用和研究也越來越廣泛和深入[9]。
相關(guān)統(tǒng)計(jì)數(shù)據(jù)顯示,從2004 年至2018 年,世界上大約有11.7%的Web 應(yīng)用服務(wù)器都在使用Nginx 軟件,其中,訪問量排名前兩千名的熱門網(wǎng)站就有28%是基于Nginx 方案的,并且這個(gè)比例還在與日俱增,例如國內(nèi)很多知名的門戶網(wǎng)站網(wǎng)易、鳳凰、搜狐、新華、游俠等都在使用。
Nginx 之所以如此受青睞,歸功于自身的幾個(gè)特點(diǎn):①對(duì)客戶端的TCP 報(bào)文請(qǐng)求的響應(yīng)時(shí)間極短(幾萬并發(fā)的情況下);②擴(kuò)展性功能強(qiáng)。Nginx 由幾個(gè)不同的功能模塊構(gòu)成,這些模塊的功能性和層次性都不同,并且耦合度特別弱,這就意味著,當(dāng)其中的一個(gè)模塊不能正常工作時(shí),其他的模塊可以忽略單模塊故障而運(yùn)行正常,這對(duì)排錯(cuò)過程是非常有益的;③Nginx 的構(gòu)架設(shè)計(jì)簡(jiǎn)單,模塊部署優(yōu)秀,具有極強(qiáng)的可靠性。大部分對(duì)并發(fā)數(shù)要求高的Web 站點(diǎn)都會(huì)選擇Nginx;④單服務(wù)器的并發(fā)數(shù)性能強(qiáng)大,最高可達(dá)10 萬;⑤對(duì)于大量的代碼編程者而言,Nginx 開源代碼是他們的福音,可以通過修改代碼來帶來個(gè)性化的體驗(yàn)。
Sugon Cloudview 虛擬化平臺(tái)是一款開放的平臺(tái)架構(gòu),基于OSGi 模塊化機(jī)制,功能組件可靈活組合,標(biāo)準(zhǔn)的服務(wù)接口可兼容支持第三方服務(wù)器、存儲(chǔ)、網(wǎng)絡(luò)方案,兼容支持Xen、VMWare 等異構(gòu)虛擬化平臺(tái),此外,它還具有高度可擴(kuò)展性,對(duì)平臺(tái)中物理資源、虛擬資源實(shí)現(xiàn)物理分組及邏輯分組管理,滿足服務(wù)器、存儲(chǔ)、網(wǎng)絡(luò)資源的可擴(kuò)展性要求,支持Windows、Redhat、Suse 等主流操作系統(tǒng),支持虛擬機(jī)創(chuàng)建、啟停、動(dòng)態(tài)遷移、配置修改、性能監(jiān)控、遠(yuǎn)程訪問等功能。
新設(shè)計(jì)的共享存儲(chǔ)模型為基于光纖通道SAN(Storage Area Network)的磁盤子系統(tǒng),共由五個(gè)RAID 5.0 SCSI 磁盤陣列組成的虛擬化資源池,其中,兩個(gè)RAID 5.0 是由磁盤陣列提供,三個(gè)RAID 5.0 是由物理服務(wù)器的本地SCSI 存儲(chǔ)提供,五個(gè)磁盤陣列在光存儲(chǔ)交換機(jī)的連接下,構(gòu)成了光纖通道存儲(chǔ)局域網(wǎng),這樣既結(jié)合了I/O 總線的通道傳輸特征和和遠(yuǎn)距離特征,又提供了傳統(tǒng)網(wǎng)絡(luò)所具有的靈活連接性和高度的可擴(kuò)展性。
在三臺(tái)物理服務(wù)器(hvn0、hvn1 和hvn2)上部署Sugon Cloudview 1.8 系統(tǒng),構(gòu)建出虛擬化平臺(tái)的資源池,配合SAN 磁盤子系統(tǒng),在兩者的基礎(chǔ)上創(chuàng)建4 臺(tái)虛擬服務(wù)器,其中,1 臺(tái)用作Nginx 負(fù)載均衡虛擬機(jī)(Nginx-Server),其他3 臺(tái)用作Web 應(yīng)用服務(wù)虛擬機(jī)(Web-Server1、Web-Server2 和Web-Server3)。平臺(tái)構(gòu)架如圖1 所示。
圖1 Sugon Cloudview虛擬化平臺(tái)構(gòu)架
負(fù)載均衡的算法,即是分發(fā)請(qǐng)求的調(diào)度算法,對(duì)負(fù)載均衡的效果起著決定性的作用[10]。Nginx 主流算法有五種,分別是輪詢、ip_hash、weight、fair(第三方)和url_hash(第三方),每種算法都有自己的適用場(chǎng)景,由于新設(shè)計(jì)的側(cè)重點(diǎn)在于對(duì)比基于不同虛擬化平臺(tái)的Nginx 負(fù)載均衡的性能優(yōu)劣,而不是新Nginx 算法的設(shè)計(jì),所以,為了保證測(cè)試結(jié)果的一致性和可靠性,將所有虛擬機(jī)的配置設(shè)為一樣,并采用默認(rèn)的Nginx 輪訓(xùn)算法,Nginx 版本為1.9.9,配置文件如下所示:
Nginx 作為一個(gè)配置靈活的高性能負(fù)載均衡解決方案,可以通過更改配置文件中的某些配置項(xiàng),來使負(fù)載均衡系統(tǒng)的性能提高一個(gè)水平,下面通過更改一些默認(rèn)配置,來優(yōu)化Nginx 的性能,讓Nginx 客戶端的訪問速度更快:
第一個(gè)優(yōu)化項(xiàng)worker_processes 是指worker 進(jìn)程的數(shù)量,建立worker 進(jìn)程的對(duì)象是Nginx 的master 模塊,Nginx 配置文件里的worker_processes 項(xiàng)直接掌控著worker 的數(shù)量,這個(gè)值太高,會(huì)導(dǎo)致系統(tǒng)不斷在不同worker 進(jìn)程間來回切換,大大地增加了系統(tǒng)的負(fù)擔(dān),這個(gè)值太低,會(huì)造成系統(tǒng)對(duì)并發(fā)請(qǐng)求的處理變地愈發(fā)艱巨,從而很多系統(tǒng)的閑置資源無法充分利用,所以,此項(xiàng)參數(shù)建議為CPU 的核數(shù)。
第二個(gè)優(yōu)化項(xiàng)worker_connections 指的是每一個(gè)worker 進(jìn)程能并發(fā)處理的最大連接數(shù),不能超過最大文件打開數(shù)。這里建議為CPU 核數(shù)與1024 的乘積。
第三個(gè)優(yōu)化項(xiàng)worker_cpu_affinity 的作用是把CPU 的每個(gè)內(nèi)核綁定在worker 進(jìn)程上,這樣做的目的是減小進(jìn)程處理過程中選擇內(nèi)核的時(shí)間,從而大大縮減了系統(tǒng)開銷。
為了驗(yàn)證基于CVM 虛擬化平臺(tái)的Nginx 負(fù)載均衡的性能效果,我們對(duì)比同等配置下基于KVM 的Nginx 負(fù)載均衡方案。首先,將CVM 和KVM 分別部署在3 臺(tái)配置相同的物理機(jī)上,然后,分別在CVM 平臺(tái)和KVM 平臺(tái)上虛擬出4 臺(tái)配置相同的虛擬機(jī),物理機(jī)和虛擬機(jī)的配置如表1 所示。
表1 物理機(jī)與虛擬機(jī)配置表
測(cè)試環(huán)境的服務(wù)器集群的架構(gòu)如圖2 所示,Nginx負(fù)載均衡服務(wù)器,用來接收和處理來自客戶端的并發(fā)請(qǐng)求,并根據(jù)負(fù)載均衡算法來進(jìn)行請(qǐng)求在集群Web 服務(wù)器中的合理分配。
圖2 虛擬服務(wù)器集群構(gòu)架
最后利用httperf 壓力測(cè)試工具分別對(duì)CVM 和KVM 兩個(gè)集群進(jìn)行壓力測(cè)試。測(cè)試工具的選擇決定著一個(gè)解決方案的可靠性,httperf 是一款高效可靠的HTTP 壓力測(cè)試工具,它可以模擬多客戶端和高并發(fā)連接數(shù)的實(shí)際應(yīng)用場(chǎng)景,長(zhǎng)時(shí)間或超大負(fù)荷地測(cè)試Web應(yīng)用服務(wù)器的性能,最高可支持1 萬的并發(fā)訪問,可以充分地測(cè)試Web 服務(wù)器的性能。它的測(cè)試結(jié)果側(cè)重于響應(yīng)速率和響應(yīng)時(shí)間。
在CentOS6.4 下安裝好httperf-0.9.0 后,輸入如下命令,即可進(jìn)行壓力測(cè)試:
httperf--server 192.168.0.167--port 80--uri/index.html--rate 500--num-conn 1000--num-call 1-timeout 10
其中,rate 代表每秒發(fā)送的請(qǐng)求,num-conn 代表連接的總數(shù),num-call 代表每個(gè)連接發(fā)送的請(qǐng)求數(shù)目。
新設(shè)計(jì)的測(cè)試方案為:首先對(duì)比測(cè)試單物理機(jī)和基于CVM 虛擬化集群的Nginx 方案的響應(yīng)時(shí)間,并發(fā)連接數(shù)從500 增至5000,分別測(cè)試10 個(gè)數(shù)據(jù)點(diǎn)(步長(zhǎng)為500);然后對(duì)比測(cè)試基于CVM 虛擬化集群的Nginx方案和基于KVM 虛擬化集群的Nginx 方案的響應(yīng)時(shí)間,并發(fā)連接數(shù)從1000 增至7000,分別測(cè)試7 個(gè)數(shù)據(jù)點(diǎn)(步長(zhǎng)為1000)。所有的數(shù)據(jù)點(diǎn)都測(cè)試3 遍,最后取算數(shù)平均值,測(cè)試結(jié)果經(jīng)過Excel 可視化后,輸出折線圖?;贑VM 虛擬化集群和KVM 虛擬化集群的Nginx 方案測(cè)試數(shù)據(jù)分別如表2 和表3 所示,可視化圖表分別如圖3 和圖4 所示。
表2 單物理機(jī)和CVM+Nginx 集群響應(yīng)時(shí)間
表3 KVM+Nginx 集群和CVM+Nginx 集群響應(yīng)時(shí)間
圖3 單物理機(jī)和CVM+Nginx集群響應(yīng)時(shí)間
圖4 KVM+Nginx集群和CVM+Nginx集群響應(yīng)時(shí)間
從圖3 不難看出,并發(fā)數(shù)在1000 之前,單物理機(jī)和CVM+Nginx 集群的響應(yīng)時(shí)間基本上保持一致,在1000 之后,隨著并發(fā)數(shù)的增加,單物理機(jī)的響應(yīng)時(shí)間急劇上升,但CVM+Nginx 集群的響應(yīng)時(shí)間還是很快,這就說明CVM+Nginx 集群的性能要顯著優(yōu)于單物理機(jī),處理多任務(wù)的水平會(huì)更加出色。
從圖4 可以得到,在并發(fā)數(shù)低于5000 時(shí),KVM+Nginx 集群和CVM+Nginx 集群的響應(yīng)時(shí)間都比較理想,均在20ms 以內(nèi),但并發(fā)數(shù)高于5000 后,KVM+Nginx 集群的響應(yīng)時(shí)間要比CVM+Nginx 集群慢,說明CVM+Nginx 集群的性能要比KVM+Nginx 集群好。
本文提出了一種新的Nginx 的實(shí)現(xiàn)方式,即基于CVM 的Nginx 負(fù)載均衡集群方案,相比傳統(tǒng)的基于KVM 的Nginx 集群,在相同的硬件條件下,從系統(tǒng)響應(yīng)時(shí)間的性能指標(biāo)角度進(jìn)行了參數(shù)的對(duì)比,結(jié)果表明新方案擁有更快的相應(yīng)速度,具有明顯的性能優(yōu)勢(shì),從而驗(yàn)證了新方案是可行的,可以為客戶端請(qǐng)求更合理地分配負(fù)載服務(wù)器,達(dá)到了負(fù)載均衡的目標(biāo),滿足了設(shè)計(jì)的基本要求。