伍春生
(中遠(yuǎn)海運(yùn)科技股份有限公司,上海 200135)
根據(jù)交通運(yùn)輸部發(fā)布的《全國高速公路視頻聯(lián)網(wǎng)監(jiān)測工作實(shí)施方案》的要求,全國高速公路視頻監(jiān)測設(shè)施要實(shí)現(xiàn)全網(wǎng)聯(lián)通和視頻資源實(shí)時在線共享,同時高速公路視頻云聯(lián)網(wǎng)平臺需具有一定的并發(fā)訪問能力。高速公路視頻云聯(lián)網(wǎng)平臺的用戶比較多,用戶可通過Web端、APP和微信公眾號訪問該平臺,訪問量通常比較大,因此需采用合適的負(fù)載均衡技術(shù)處理客戶端的請求。目前應(yīng)用最廣泛的負(fù)載均衡軟件有Nginx、HAProxy和LVS(Linux Virtual Server)。本文采用Nginx負(fù)載均衡技術(shù)處理客戶端請求,綜合分析Nginx內(nèi)置的多種負(fù)載均衡算法的優(yōu)劣,比選出合適的負(fù)載均衡算法。同時,結(jié)合服務(wù)器的中央處理器(Central Processing Unit,CPU)、內(nèi)存、磁盤IO和網(wǎng)絡(luò)帶寬等不同性能指標(biāo),綜合計算出各服務(wù)器初始設(shè)定的權(quán)值,進(jìn)而提高各服務(wù)器的資源利用率和系統(tǒng)的并發(fā)訪問能力,為用戶提供更優(yōu)質(zhì)的服務(wù)。
Nginx是一種高性能的反向代理服務(wù)器,目前很多主流互聯(lián)網(wǎng)公司都采用這種技術(shù)實(shí)現(xiàn)負(fù)載均衡。負(fù)載均衡一直是服務(wù)端研究領(lǐng)域內(nèi)的熱點(diǎn)問題[1],當(dāng)前已有很多學(xué)者對Nginx負(fù)載均衡技術(shù)進(jìn)行研究,通過對該技術(shù)的性能進(jìn)行深度優(yōu)化,使其更好地服務(wù)于應(yīng)用系統(tǒng),為用戶提供更好的上網(wǎng)體驗。劉振宇[2]和陳大才[3]從影響并發(fā)負(fù)載均衡的因素和服務(wù)器的性能出發(fā),對歷史數(shù)據(jù)進(jìn)行訓(xùn)練,得到各服務(wù)器的響應(yīng)預(yù)測時間模型,通過將當(dāng)前的請求分配給預(yù)測響應(yīng)時間最短的服務(wù)器,提高服務(wù)器集群中請求分配的均衡性。王利萍[4]和余欽水等[5]提出一種動態(tài)自適應(yīng)負(fù)載均衡算法,對后端服務(wù)器集群最近一段時間內(nèi)的請求響應(yīng)時間進(jìn)行數(shù)學(xué)分析,根據(jù)分析所得結(jié)果對各服務(wù)器的權(quán)值進(jìn)行重新計算,實(shí)現(xiàn)動態(tài)調(diào)整請求分配策略。服務(wù)器負(fù)載均衡并不是單一的技術(shù),而是由多種技術(shù)組合而成的體系[6]。當(dāng)客戶端發(fā)送請求時,負(fù)載均衡策略會將客戶端發(fā)送的請求分配到最空閑的服務(wù)器中處理[7],整個過程對客戶端是完全透明的,用戶只感覺到是1臺服務(wù)器在提供服務(wù)。
本文將當(dāng)前主流的互聯(lián)網(wǎng)負(fù)載均衡技術(shù)應(yīng)用到高速公路視頻云聯(lián)網(wǎng)平臺中,采用Nginx加權(quán)負(fù)載均衡算法建立高效的權(quán)值計算數(shù)學(xué)模型,為每個服務(wù)器設(shè)置最優(yōu)的權(quán)值,進(jìn)而提高整個系統(tǒng)的負(fù)載均衡能力。圖1為Nginx負(fù)載均衡主要過程。
圖1 Nginx負(fù)載均衡主要過程
不同的負(fù)載均衡算法對系統(tǒng)的性能有不同的影響,因此為高效地利用各服務(wù)器資源[8],向用戶提供優(yōu)質(zhì)的服務(wù),應(yīng)選取合適的負(fù)載均衡算法。同時,隨著平臺用戶量的不斷增多,平臺的并發(fā)訪問量不斷增加,可通過適當(dāng)增加服務(wù)器節(jié)點(diǎn)提高系統(tǒng)的并發(fā)能力。Nginx內(nèi)置有多種負(fù)載均衡算法,包括輪詢算法、IP哈希算法、最小連接數(shù)算法和加權(quán)負(fù)載均衡算法等。下面詳細(xì)分析這些算法的優(yōu)缺點(diǎn)。
輪詢算法是按客戶端發(fā)送請求的先后順序逐一將請求分配到后端服務(wù)器的算法,是Nginx中最簡單的負(fù)載均衡算法,適用于后端服務(wù)器性能均衡的情況。但是,對于實(shí)際的應(yīng)用場景而言,受硬件等各方面因素的影響,各后端服務(wù)器的性能差異很大,若采用該算法,性能較差的服務(wù)器易出現(xiàn)過載或宕機(jī)的問題,性能較好的服務(wù)器的資源不能得到有效利用,大部分時間處于空閑狀態(tài)。
IP哈希算法的原理是每次對發(fā)送請求的客戶端的IP地址進(jìn)行哈希計算,根據(jù)得到的哈希值將其映射到對應(yīng)的后端服務(wù)器上,在Nginx內(nèi)部默認(rèn)設(shè)置“如果連續(xù)20次以上獲取服務(wù)器失敗,將會啟動輪詢算法分配該請求”。IP哈希算法的優(yōu)點(diǎn)在于,相同的IP地址請求會被映射到同一臺服務(wù)器上,從而保持客戶端與后端服務(wù)器的長連接。然而,該優(yōu)點(diǎn)會導(dǎo)致IP哈希算法存在非常大的隱患,即當(dāng)同一時刻大量IP地址相同的客戶端發(fā)送請求時,若這些請求的哈希值相同,則會被分配到同一臺服務(wù)器上,此時該服務(wù)器的壓力非常大,而其他服務(wù)器較為空閑,存在請求負(fù)載不均衡的問題。
最小連接數(shù)算法在分配客戶端請求時始終遵循一條規(guī)則,即將請求分配給當(dāng)前連接數(shù)最小的后端服務(wù)器節(jié)點(diǎn)處理。每臺服務(wù)器都有一個記錄請求數(shù)count,接收到請求時count執(zhí)行加1,處理完一個請求時count執(zhí)行減1,因此每次count值最小的服務(wù)器都會分配到請求。但是,不同請求對應(yīng)的任務(wù)不同,其資源的消耗也不同,僅依靠服務(wù)器的請求連接數(shù)不能直觀反映服務(wù)器真實(shí)的負(fù)載情況。
加權(quán)負(fù)載均衡算法的原理是在Nginx的upstream模塊中為每臺服務(wù)器設(shè)定一個權(quán)值(weight),當(dāng)接收到客戶端發(fā)送的請求時,Nginx會根據(jù)既定的權(quán)值更配請求。該算法有3個重要參數(shù),即設(shè)定權(quán)值(effect_weight)、當(dāng)前權(quán)值(current_weight)和總權(quán)值(total_weight),每次執(zhí)行完請求之后,服務(wù)器權(quán)值都執(zhí)行減1操作,當(dāng)服務(wù)器當(dāng)前權(quán)值為0時,對其標(biāo)志位down進(jìn)行設(shè)置,若所有服務(wù)器的權(quán)值都為0,則當(dāng)前輪詢結(jié)束,系統(tǒng)發(fā)出結(jié)束指令。該算法有很強(qiáng)的適應(yīng)能力,在分配請求過程中不依賴客戶端的任何信息,完全依靠后端服務(wù)器已設(shè)置的權(quán)值分配請求。對于該算法無法保證用戶長連接的問題,可通過JWT和cookie等方式解決,這樣能同時具備IP哈希算法的優(yōu)點(diǎn)。該算法的流程見圖2。
圖2 加權(quán)負(fù)載均衡算法流程
Nginx加權(quán)負(fù)載均衡算法的核心是為不同性能的服務(wù)器設(shè)定權(quán)值。若權(quán)值設(shè)定過大,會導(dǎo)致該服務(wù)器出現(xiàn)過載甚至宕機(jī)的風(fēng)險;若權(quán)值設(shè)定過小,會導(dǎo)致該服務(wù)器資源不能得到有效利用。因此,需合理結(jié)合各服務(wù)器性能指標(biāo)計算出每臺服務(wù)器的權(quán)值。
本文采用內(nèi)存、CPU、磁盤IO和網(wǎng)絡(luò)帶寬作為服務(wù)器權(quán)值計算的參數(shù)。Sum表示服務(wù)器各部分性能總和,Ni表示第i臺服務(wù)器,其中i∈(1,2,3,…,n),有
(1)
(2)
(3)
(4)
式(1)~式(4)中:Summemory為服務(wù)器內(nèi)存性能總和;SumCPU為服務(wù)器CPU性能總和;Sumdisk為服務(wù)器磁盤IO性能總和;Sumnet為網(wǎng)絡(luò)帶寬性能總和。
對于單個服務(wù)器權(quán)值的計算,分別將該服務(wù)器的內(nèi)存、CPU、磁盤IO和網(wǎng)絡(luò)帶寬與服務(wù)器整體的比值乘以系數(shù)σ,即可得到服務(wù)器的實(shí)際權(quán)值。
(5)
式(5)中:Weight(Ni)為第i臺服務(wù)器的實(shí)際權(quán)值(若有小數(shù),則取整數(shù)部分);A為常數(shù);Summemory(Ni)、SumCPU(Ni)、Sumdisk(Ni)和Sumnet(Ni)分別為第i臺服務(wù)器的內(nèi)存、CPU、磁盤IO和網(wǎng)絡(luò)帶寬的情況;i∈(1,2,3,…,n);σmemory、σCPU、σdisk和σnet分別為第i個服務(wù)器節(jié)點(diǎn)的內(nèi)存、CPU、磁盤IO和網(wǎng)絡(luò)帶寬占整個服務(wù)器的比重。σmemory、σCPU、σdisk和σnet滿足
σmemory+σCPU+σdisk+σnet=1
(6)
下面分別計算服務(wù)器內(nèi)存、CPU、磁盤IO和網(wǎng)絡(luò)帶寬的使用率。
1)內(nèi)存使用率。在計算內(nèi)存使用率時,涉及的主要參數(shù)有總內(nèi)存(MemoryTotal)、緩存(Cache)和文件緩存(BufferFile)等。
考核成績設(shè)置為平時成績∶期中成績∶期末成績=4∶2∶4的模式(見表1).該模式充分體現(xiàn)了過程考核和集中考核相結(jié)合的原則,培養(yǎng)了學(xué)生參與意識、責(zé)任意識和規(guī)則意識.其假設(shè)的前提是學(xué)生平時表現(xiàn)直接影響平時成績,進(jìn)而間接影響期中和期末集中考核成績.線上考核滿足個性化學(xué)習(xí)需要,培養(yǎng)責(zé)任意識與規(guī)則意識,課堂考核培養(yǎng)學(xué)生參與意識、責(zé)任意識、團(tuán)隊意識、擔(dān)當(dāng)意識及創(chuàng)新意識.考核方式與學(xué)生學(xué)習(xí)狀態(tài)及學(xué)習(xí)效果直接相關(guān).考核過程公開、公正、透明,對所有學(xué)生一視同仁,才能獲得學(xué)生尊重與合作.
Usememery=(MemoryTotal-(MemoryFree+Cache+BufferFile))/MemoryTotal
(7)
2)CPU使用率。在計算CPU使用率時,需取2個時間間隔足夠短的t1和t2,t1與t2的差值TimeTotal為該時間段CPU總的使用時間,有
TimeTotal=t2-t1
(8)
在t1與t2時間段,CPU的空閑時間只需將t2時刻的空閑時間減去t1時刻的空閑時間即可求得,即
LeisureTime=LeisureTime2-LeisureTime1
(9)
式(9)中:LeisureTime為CPU在t1與t2時間段內(nèi)的空閑時間;LeisureTime1和LeisureTime2分別為t1和t2時間段內(nèi)除IO等待時間外的其他等待時間。
綜上可計算出CPU的使用率UseCPU為
UseCPU=(TimeTotal-LeisureTime)/TimeTotal
(10)
3)磁盤IO使用率。磁盤IO相關(guān)數(shù)據(jù)可通過iostat-d-x-k12命令獲取,如每秒讀寫次數(shù)、每秒讀寫數(shù)據(jù)量和磁盤IO使用率。
4)網(wǎng)絡(luò)帶寬使用率(Usenet)。記錄t1和t2時刻網(wǎng)絡(luò)中接收和發(fā)送的字節(jié)數(shù)值(此時以“byte”為單位),t1時刻發(fā)送和接收的文件大小為OutSize1和InSize1,t2時刻發(fā)送和接收的文件大小為OutSize2和InSize2,有
Usenet=(InSize2-InSize1+OutSize2-OutSize1)×8/(1 000 000·BandWidth)
(11)
式(11)中:BandWidth為網(wǎng)絡(luò)帶寬,注意t1與t2時間段網(wǎng)絡(luò)接收和發(fā)送總量的單位與網(wǎng)絡(luò)帶寬的單位不統(tǒng)一,需進(jìn)行轉(zhuǎn)換。
通過上述計算為每臺服務(wù)器設(shè)置權(quán)值,負(fù)載均衡一段時間之后,各服務(wù)器節(jié)點(diǎn)資源的使用情況為
Use(Ni)=σmemory·Usememory(Ni)+σCPU·UseCPU(Ni)+σdisk·Usedisk(Ni)+σnet·Usenet(Ni)
(12)
式(12)中:Use(Ni)為第i臺服務(wù)器資源使用率;Usememory(Ni)、UseCPU(Ni)、Usedisk(Ni)和Usenet(Ni)分別為當(dāng)前服務(wù)器內(nèi)存、CPU、磁盤IO和網(wǎng)絡(luò)帶寬的使用率;i∈(1,2,3,…,n)。
寧夏高速公路視頻云聯(lián)網(wǎng)平臺目前已上線試運(yùn)行,截至2020年12月17日,當(dāng)月平臺總訪問量為4 751次,平臺運(yùn)行穩(wěn)定,請求響應(yīng)時間也較為理想。圖3為寧夏高速公路視頻云聯(lián)網(wǎng)平臺主頁。通過查詢后臺日志可看到,目前部署的124.70.31.141服務(wù)器和124.70.31.55服務(wù)器是按計算設(shè)定的權(quán)值分配客戶端請求的,為用戶提供可靠的服務(wù),2臺服務(wù)器后臺日志狀態(tài)見圖4。
圖3 寧夏高速公路視頻云聯(lián)網(wǎng)平臺主頁
a)124.70.31.141服務(wù)器
獲取2020年12月15日09:56—10:36時間段,在10:24—10:36時間段出現(xiàn)114個用戶并發(fā)訪問,此時系統(tǒng)的響應(yīng)時間可有效反映采用本文建立的數(shù)學(xué)計算模型得出的服務(wù)器權(quán)值分配方案是高效的、可行的。圖5和圖6分別為寧夏高速公路視頻云聯(lián)網(wǎng)平臺線上并發(fā)連接數(shù)和線上請求響應(yīng)時間。從圖5和圖6中可看出,在并發(fā)訪問用戶為114個的情況下,系統(tǒng)最長響應(yīng)時間為0.651 400 s。
本文從實(shí)際問題出發(fā),深入研究了Nginx加權(quán)負(fù)載均衡算法,提出了一種高效的權(quán)值計算數(shù)學(xué)模型,綜合考慮各服務(wù)器的綜合性能指標(biāo),為其設(shè)定合理的權(quán)值,使系統(tǒng)在分配請求過程中充分利用各服務(wù)器的性能,大大提升系統(tǒng)的并發(fā)能力,縮短系統(tǒng)的響應(yīng)時間。目前視頻云聯(lián)網(wǎng)平臺還處于線上試運(yùn)行階段,系統(tǒng)的并發(fā)最高峰還未到來,考慮到以后正式上線推廣使用,保證平臺能承受10萬個用戶并發(fā)訪問,應(yīng)用層會隨著用戶的增多而適當(dāng)增加服務(wù)器,提升其并發(fā)能力。下一步將對持久層進(jìn)行優(yōu)化,主要工作是對數(shù)據(jù)庫分庫分表和主從復(fù)制等進(jìn)行優(yōu)化,引入高性能非關(guān)系型數(shù)據(jù)庫Redis作為緩存,緩解數(shù)據(jù)庫層的壓力等。