一種不中斷服務(wù)的服務(wù)端程序平滑升級(jí)的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及服務(wù)器端程序升級(jí)的方法,特別是涉及一種不中斷服務(wù)的服務(wù)端程序平滑升級(jí)的方法。
【背景技術(shù)】
[0002]服務(wù)器對(duì)高可用性的需求決定服務(wù)器端不能隨時(shí)停止服務(wù)端應(yīng)用,這是因?yàn)椴还苁菓?yīng)用的bug故障還是因升級(jí)所需的中斷連接,不僅會(huì)造成服務(wù)器端的數(shù)據(jù)丟失,也會(huì)導(dǎo)致針對(duì)客戶端的服務(wù)“宕機(jī)”。
[0003]通常情況下,客戶端和服務(wù)端的連接分為短連接和長連接,短連接場景以HTTP短連接較為常見,涉及到的流程有:瀏覽器建立與HTTP服務(wù)器的連接,請(qǐng)求web頁面;服務(wù)器響應(yīng)瀏覽器請(qǐng)求并返回請(qǐng)求頁面;瀏覽器關(guān)閉與HTTP服務(wù)器的連接。每一次HTTP請(qǐng)求的響應(yīng)都單獨(dú)建立一次連接,短連接場景因其“連接只建立在數(shù)據(jù)傳輸時(shí)”這一特性,使服務(wù)端程序的升級(jí)可以等到連接中斷時(shí)進(jìn)行。
[0004]Nginx實(shí)現(xiàn)服務(wù)端程序升級(jí)的原理是:(I)在不停止老進(jìn)程的情況下,啟動(dòng)新進(jìn)程;(2)老進(jìn)程負(fù)責(zé)處理仍未處理完的請(qǐng)求,但不再接受新的處理請(qǐng)求;(3)新進(jìn)程接受新請(qǐng)求;(4)老進(jìn)程處理完所有請(qǐng)求,關(guān)閉所有連接后停止;其中新進(jìn)程的執(zhí)行需向新進(jìn)程發(fā)送USR2信號(hào),老進(jìn)程的逐步停止需向老進(jìn)程發(fā)送WINCH信號(hào)。從表面上看,這種服務(wù)端程序升級(jí)方式似乎保證了新、舊版本程序的平滑替換,但實(shí)質(zhì)上看,舊版本程序在停止接收新請(qǐng)求后,需等待至已有請(qǐng)求全部處理完畢方才退出,之后客戶端還需再次建立與服務(wù)端連接才能享用新版本程序所提供的服務(wù)。Nginx升級(jí)模式適用于短連接情景,但對(duì)于客戶端與服務(wù)端間需頻繁通信的長連接來說,一方面由于客戶端請(qǐng)求量過大,舊版本程序不會(huì)短時(shí)間內(nèi)停止服務(wù);另一方面,頻繁的創(chuàng)建連接也會(huì)造成資源的浪費(fèi)。
[0005]相較于短連接,長連接場景下的服務(wù)端程序升級(jí)較為復(fù)雜,因?yàn)榭蛻舳诵枰粩嗯c服務(wù)端通信,在相當(dāng)長的時(shí)間內(nèi)不會(huì)斷開與服務(wù)端的連接,比如即時(shí)通訊工具QQ或麥通。CN200510126314公開了一種通信系統(tǒng)軟件版本的平滑升級(jí)方法,包括:將硬件單板存儲(chǔ)區(qū)中的第一長度存儲(chǔ)塊中原來正常運(yùn)行的原始版本保留到緩沖存儲(chǔ)器,將所述單板存儲(chǔ)區(qū)重新劃分為第二長度存儲(chǔ)塊,并將所述原始版本和下載的新版本分別保存到兩個(gè)第二長度存儲(chǔ)塊中。利用現(xiàn)有硬件資源,重新合理的劃分存儲(chǔ)空間,軟件版本大小在一定范圍內(nèi)時(shí)都不需要增加額外的存儲(chǔ)設(shè)備,有效降低了系統(tǒng)成本。
[0006]但如何做到服務(wù)端程序升級(jí)時(shí),既可以不中斷服務(wù)又可以時(shí)刻維護(hù)客戶長連接,保證客戶端連接及客戶會(huì)話數(shù)據(jù)從舊版本程序向新版本程序的轉(zhuǎn)移,是當(dāng)前很多系統(tǒng)迫切需要解決的問題。
【發(fā)明內(nèi)容】
[0007]本發(fā)明的目的在于,在不斷開客戶端和服務(wù)器端連接的情況下,實(shí)現(xiàn)服務(wù)器端軟件的平滑升級(jí),并保證所有會(huì)話數(shù)據(jù)由舊版本程序轉(zhuǎn)移入新版本程序中。本發(fā)明方法有利于在服務(wù)端程序升級(jí)時(shí),保證所有客戶端與服務(wù)端的連接不斷開,減少客戶端重連服務(wù)器的邏輯處理,提高服務(wù)端可用性和穩(wěn)定性。
[0008]本發(fā)明的技術(shù)方案是,一種不中斷服務(wù)的服務(wù)端程序平滑升級(jí)的方法,具體包含如下步驟:
[0009]步驟1:服務(wù)器端開始啟動(dòng)新程序;
[0010]步驟I的具體實(shí)現(xiàn)方法,把新版本程序復(fù)制到舊版本程序所在服務(wù)器的特定目錄中,考慮到同一機(jī)器上的多個(gè)進(jìn)程不能同時(shí)偵聽相同端口號(hào),因而需為新版本程序分配不同于舊版本程序的服務(wù)端口號(hào),然后啟動(dòng)新版本程序。此時(shí),新、舊版本程序在同一服務(wù)器上同時(shí)正常運(yùn)行,但通過不同的服務(wù)端口提供服務(wù);
[0011]步驟2:確認(rèn)新版本程序在服務(wù)器端上運(yùn)行沒有問題后,分別向新、舊版本程序發(fā)送“開始升級(jí)”指令;
[0012]步驟3:舊版本程序接收到“開始升級(jí)”指令后,將自己的服務(wù)端口號(hào)的偵聽連接傳給新版本程序;為新版本程序分配不同于舊版本程序的新服務(wù)端口,新版本程序接收到“開始升級(jí)”指令后,接收到舊版本程序的偵聽連接并開始接管自此之后新接入服務(wù)端的所有客戶端,此時(shí),新版本程序通過新I日兩個(gè)版本的服務(wù)端口為客戶端提供服務(wù);
[0013]所謂偵聽連接(亦可稱為偵聽套接字),就是編程技術(shù)中用于接收客戶端連接的對(duì)象,這里說的連接亦可理解為編程技術(shù)中的套接字(即socket)。所述客戶端連接,其區(qū)別于偵聽連接,是指客戶端連入服務(wù)端偵聽連接后,服務(wù)端新創(chuàng)建的一個(gè)獨(dú)立于偵聽連接的連接對(duì)象;這個(gè)對(duì)象代表服務(wù)端與客戶端的連接通道,通過它可以發(fā)送和接收客戶端數(shù)據(jù),因而客戶會(huì)話可理解成是客戶連接及通過其傳輸?shù)臄?shù)據(jù)的綜合。
[0014]步驟3具體包括:
[0015](I)舊版本程序停止偵聽套接字的事件監(jiān)控,表示舊版本程序停止接收來自客戶端的連接請(qǐng)求,停止偵聽套接字的事件監(jiān)控并不會(huì)影響到客戶端后續(xù)向服務(wù)器繼續(xù)發(fā)出連接請(qǐng)求;
[0016](2)舊版本程序向新版本程序發(fā)送偵聽連接,之后舊版本程序關(guān)閉該偵聽連接。在新版本程序未接收到偵聽連接且舊版本程序已經(jīng)關(guān)閉偵聽連接的情況下,由于此過程中的新連接請(qǐng)求會(huì)被服務(wù)端操作系統(tǒng)緩存,因而客戶端仍然可以隨時(shí)向服務(wù)器發(fā)出連接請(qǐng)求,而且不會(huì)失敗。
[0017](3)新版本程序接收偵聽連接。如果接收到偵聽連接之前有新的客戶端連接請(qǐng)求發(fā)了過來,操作系統(tǒng)將幫助新版本程序緩存這些連接請(qǐng)求;
[0018](4)新版本程序開始接管所有用戶的之后發(fā)往服務(wù)器的所有連接請(qǐng)求;
[0019]步驟4:舊版本程序停止客戶端套接字的事件監(jiān)控,即舊版本程序停止接收已有客戶端連接的數(shù)據(jù)收發(fā),然后獲取之前所有接入舊版本程序的客戶端會(huì)話,并將其打包。數(shù)據(jù)打包時(shí)需將舊版本程序未處理完成的客戶端會(huì)話數(shù)據(jù)一并打包,新版本程序會(huì)在收到這些數(shù)據(jù)后繼續(xù)處理。
[0020]客戶端的會(huì)話數(shù)據(jù)包括客戶端連接、舊版本程序未處理完的數(shù)據(jù)、網(wǎng)絡(luò)庫接收隊(duì)列中的數(shù)據(jù)以及網(wǎng)絡(luò)庫發(fā)送隊(duì)列中的數(shù)據(jù)。
[0021]按照服務(wù)器端應(yīng)用程序的三層架所述構(gòu),網(wǎng)絡(luò)庫層位于操作系統(tǒng)層和應(yīng)用層中間,其內(nèi)含有發(fā)送隊(duì)列和接收隊(duì)列,承擔(dān)著在兩者間傳輸數(shù)據(jù)的角色,客戶端請(qǐng)求到達(dá)服務(wù)器的網(wǎng)卡后,服務(wù)端操作系統(tǒng)會(huì)接收這些數(shù)據(jù),并通知上一層的網(wǎng)絡(luò)庫;接著,網(wǎng)絡(luò)庫把操作系統(tǒng)收到的數(shù)據(jù)取出放入自己的接收隊(duì)列中,同時(shí)通知應(yīng)用層數(shù)據(jù)到達(dá);應(yīng)用層從網(wǎng)絡(luò)層的接收隊(duì)列中取出數(shù)據(jù),經(jīng)解析得到客戶請(qǐng)求數(shù)據(jù)包,并根據(jù)實(shí)際業(yè)務(wù)做相應(yīng)處理,處理的過程中可能涉及調(diào)用其它服務(wù),如數(shù)據(jù)庫、緩存及邏輯服務(wù)器等;當(dāng)應(yīng)用層處理完數(shù)據(jù)包后生成相應(yīng)的結(jié)果包,并將其傳至網(wǎng)絡(luò)庫的發(fā)送隊(duì)列;網(wǎng)絡(luò)庫將發(fā)送隊(duì)列中的各數(shù)據(jù)包依次發(fā)給操作系統(tǒng)層,最終操作系統(tǒng)會(huì)把返回的結(jié)果包發(fā)給客戶端,響應(yīng)客戶端請(qǐng)求。因而,發(fā)送隊(duì)列中存儲(chǔ)應(yīng)用層要發(fā)送至操作系統(tǒng)層的數(shù)據(jù),接收隊(duì)列存儲(chǔ)應(yīng)用層從操作系統(tǒng)層接收到的數(shù)據(jù);停留在程序應(yīng)用層還未發(fā)送至網(wǎng)絡(luò)庫層的數(shù)據(jù)被稱為未處理完的數(shù)據(jù)。
[0022]步驟5:舊版本程序調(diào)用“發(fā)送會(huì)話”接口,將已打包的客戶會(huì)話數(shù)據(jù)依次、逐步地傳至新版本程序中;
[0023]步驟6:新版本程序調(diào)用“接收會(huì)話”接口,解包后得到舊版本程序的客戶連接及會(huì)話數(shù)據(jù),這個(gè)客戶連接即是舊版本程序的客戶連接。接著,新版本程序?qū)@些連接所涉及的所有會(huì)話數(shù)據(jù)進(jìn)行處理;
[0024]解包后的會(huì)話數(shù)據(jù)主要包含兩部分:輸入到應(yīng)用中+輸出到網(wǎng)絡(luò)庫;
[0025]新版本程序?qū)獍髸?huì)話數(shù)據(jù)的處理,具體包括:
[0026](I)添加輸入數(shù)據(jù):通過調(diào)用網(wǎng)絡(luò)庫的添加輸入數(shù)據(jù)接口,將舊版本程序網(wǎng)絡(luò)庫層接收隊(duì)列中的數(shù)據(jù)轉(zhuǎn)移入到新版本程序的網(wǎng)絡(luò)庫層接收隊(duì)列中;
[0027](2)添加輸出數(shù)據(jù):通過調(diào)用網(wǎng)絡(luò)庫的添加輸出數(shù)據(jù)接口,將舊版本程序網(wǎng)絡(luò)庫發(fā)送隊(duì)列中的數(shù)據(jù)轉(zhuǎn)移入到新版本程序的網(wǎng)絡(luò)庫層發(fā)送隊(duì)列中;
[0028](3)處理舊版本程序中未處理完成的數(shù)據(jù):將舊版本程序應(yīng)用層中的數(shù)據(jù)轉(zhuǎn)移入新版本程序應(yīng)用層中,并進(jìn)行處理;
[0029]步驟7:轉(zhuǎn)到步驟5,對(duì)舊版本程序中的每個(gè)客戶會(huì)話循環(huán)執(zhí)行步驟5和步驟6,直到所有客戶會(huì)話數(shù)據(jù)全部轉(zhuǎn)移至新版本程序。這一過程會(huì)因?qū)嶋H場景不同而持續(xù)不同的時(shí)間,通??稍跇O短時(shí)間內(nèi)完成迀移;
[0030]步驟8:結(jié)束舊版本程序,并向新版本程序發(fā)送指令,告之停止新版本程序的新服務(wù)端口,僅保留舊版本程序的原服務(wù)端口。至此,整個(gè)服務(wù)器端程序平滑升級(jí)過程結(jié)束
[0031]本發(fā)明與現(xiàn)有技術(shù)相比,其有益效果:
[0032](I)本發(fā)明提供一種不中斷服務(wù)的服務(wù)端程序平滑升級(jí)的方法,實(shí)現(xiàn)在不斷開客戶端與服務(wù)端連接的情況下,進(jìn)行服務(wù)端軟件的升級(jí),有效降低傳統(tǒng)的服務(wù)端升級(jí)方式中額外開發(fā)工作和運(yùn)營維護(hù)的成本;
[0033](2)本發(fā)明方法使服務(wù)端程序升級(jí)過程全程對(duì)客戶端不可見,因而客戶端無需關(guān)注和參與升級(jí)流程,也無需處理升級(jí)中產(chǎn)生的任何數(shù)據(jù),利于簡化客戶端的結(jié)構(gòu)設(shè)計(jì);
[0034](3)本發(fā)明方法使服務(wù)端軟件的升級(jí)無需等到客戶端與服務(wù)端連接斷開后進(jìn)行,同時(shí)解決因服務(wù)端程序升級(jí)而可能產(chǎn)生的“宕機(jī)”問題,保證在不丟失任何數(shù)據(jù)的情況下完成新版本程序?qū)εf版本程序的替換,提高服務(wù)端應(yīng)用的可用性、可靠性和穩(wěn)定性。
【附圖說明】
[0035]圖1為本發(fā)明實(shí)施例中一種不中斷服務(wù)的服務(wù)端程序平滑升級(jí)的流程示意圖
[0036]圖2為本發(fā)明實(shí)施例中新版本程序啟動(dòng)時(shí)客戶端與服務(wù)端連接示意圖
[0037]圖3為本發(fā)明實(shí)施例中舊版程序停止偵聽連接請(qǐng)求時(shí)客戶端與服務(wù)端連接示意圖
[0038]圖4為本發(fā)明實(shí)施例中服務(wù)端程序應(yīng)用程序結(jié)構(gòu)及數(shù)據(jù)傳遞流向示意圖
[0039]圖5本發(fā)明實(shí)施例中新、舊版本記性會(huì)話數(shù)據(jù)傳輸時(shí)客戶端與服務(wù)端連接示意圖
【具體實(shí)施方式】
[0040]為使本發(fā)