專利名稱::基于多tcp連接映像的高可用系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明屬于計算機(jī)網(wǎng)絡(luò)
技術(shù)領(lǐng)域:
,具體涉及一種基于多TCP連接映像的高可用系統(tǒng)。國外已經(jīng)針對上述問題對基于TCP連接容錯的高可用系統(tǒng)做了初步的研究,但都面臨以下三個問題一是有些系統(tǒng)對TCP連接狀態(tài)做日志,開銷太大;二是有些系統(tǒng)需要修改客戶端的應(yīng)用程序,而通??蛻舳耸遣皇芸刂频?;三是有些系統(tǒng)只能保證故障發(fā)生后的連接能正常工作,而原來建立的連接就會中斷,這樣不能保證對客戶端透明。如FT_TCP(見Texas大學(xué)計算機(jī)科學(xué)系2001年7月技術(shù)報告)在服務(wù)器端圍繞TCP加入一層包裝器wrapper(如圖1所示)。Wrapper由三個部分組成(1)日志器(Logger)專門負(fù)責(zé)做日志。除此之外,它還要檢測原服務(wù)器的狀態(tài),在發(fā)現(xiàn)服務(wù)器失效后接管它的工作,重新啟動服務(wù)器服務(wù)程序,并利用日志信息與服務(wù)器進(jìn)行假通訊,即重新向服務(wù)器請求一個TCP連接,把客戶失效前傳出的數(shù)據(jù)包重新傳給服務(wù)器,使得恢復(fù)后的連接與原連接狀態(tài)一致。(2)南橋(SouthSideWrap)處于IP層和TCP層之間。它一方面接收從IP層傳往TCP層的數(shù)據(jù)包,將它傳往Logger和TCP層;另一方面接收從上層TCP來的數(shù)據(jù)包,并根據(jù)從Logger過來的確認(rèn)信息對這些數(shù)據(jù)包做相應(yīng)的修改,然后發(fā)給下層的IP層傳送給客戶。保證錯誤發(fā)生后對客戶端透明。(3)北橋(NorthSideWrap)處于TCP層之上,用戶程序之下。主要是記錄服務(wù)器端建立的套接口Socket讀數(shù)據(jù)的長度(通過Logger保存),以便在恢復(fù)時也讀到這個長度,保證恢復(fù)前后狀態(tài)的一致性。這種方案的缺點對每個經(jīng)過TCP層和IP層的包都要做日志,系統(tǒng)開銷過大并且恢復(fù)的時間過長。為實現(xiàn)上述發(fā)明目的,一種基于多TCP連接映像的高可用系統(tǒng),客戶通過網(wǎng)關(guān)與服務(wù)器通信,其特征在于該系統(tǒng)包括N(N≥2)個服務(wù)器,N個服務(wù)器均包括心跳監(jiān)測模塊、IP搶占模塊和TCP連接容錯模塊;心跳監(jiān)測模塊用于故障檢測,當(dāng)出現(xiàn)故障時,將故障狀態(tài)通知其它模塊;IP搶占模塊通過發(fā)送免費ARP包來通告系統(tǒng)對外的虛擬IP地址,當(dāng)主服務(wù)器失效時,負(fù)責(zé)無沖突地選舉出一個新的主服務(wù)器,并把對外的虛擬IP地址綁定在這個新的主服務(wù)器的網(wǎng)卡上;TCP連接容錯模塊負(fù)責(zé)將用戶的一個TCP連接能夠同時與幾個服務(wù)器通信。上述心跳監(jiān)測模塊包括狀態(tài)監(jiān)測子模塊、接收子模塊和選舉子模塊;狀態(tài)監(jiān)測子模塊負(fù)責(zé)每隔一段時間向多播組發(fā)送自己的心跳信息,以表明自己還處于激活狀態(tài);接收子模塊負(fù)責(zé)接收其它服務(wù)器發(fā)來的心跳信息;選舉子模塊負(fù)責(zé)在系統(tǒng)初啟時通過配置文件決定誰是主服務(wù)器。上述TCP連接容錯模塊包括TCP初始連接的同步子模塊、分發(fā)器和聚合器;TCP初始連接的同步子模塊負(fù)責(zé)對每個TCP初始連接進(jìn)行同步;分發(fā)器負(fù)責(zé)將從客戶來的TCP數(shù)據(jù)包分發(fā)到各個處于激活狀態(tài)的服務(wù)器;聚合器負(fù)責(zé)收集各個服務(wù)器應(yīng)答的TCP數(shù)據(jù)包進(jìn)行處理,做成一個統(tǒng)一的應(yīng)答數(shù)據(jù)包發(fā)送給客戶端程序,讓客戶端程序感覺自己只是與一個服務(wù)器在通信。本發(fā)明所述的基于多TCP連接映像的高可用系統(tǒng),具有如下優(yōu)點1)不需要做日志。在本系統(tǒng)中,TCP的連接信息不是通過做日志來進(jìn)行備份的,而是通過在其它的備份服務(wù)器建立同步的TCP連接(多個TCP連接映像)達(dá)到備份效果的;2)連接的恢復(fù)時間更短。由于主服務(wù)器和備份服務(wù)器上相應(yīng)的TCP連接在通信的過程中一直保持著同步,所以主服務(wù)器失效,從某個備份服務(wù)器上恢復(fù)這些連接信息就會變得容易些,不用根據(jù)日志從頭開始恢復(fù),從而縮短了連接信息的恢復(fù)時間;3)可用性更高。N臺服務(wù)器只要有一臺沒有失效,就可以保證服務(wù)不會被中斷。但是,N臺服務(wù)器同時失效的可能性是很小的。4)同步機(jī)制不需要額外的通信開銷。在TCP連接信息同步中,我們借用了TCP本身實現(xiàn)上的一些特征(如超時重發(fā),對重傳數(shù)據(jù)包的自我消化能力)來達(dá)到同步的效果;5)當(dāng)主服務(wù)器失效時,備份服務(wù)器能以與主服務(wù)器一致的狀態(tài)進(jìn)行故障接管,真正做到無縫(seamless)接管,且對用戶透明;6)不需要修改客戶端的任何軟件;7)在多機(jī)系統(tǒng)中避免了對開機(jī)先后次序的約束。在該系統(tǒng)中,主服務(wù)器和備份服務(wù)器都運行著相同的服務(wù)程序。其中,主服務(wù)器和備份服務(wù)器分擔(dān)著不同的工作主服務(wù)器對客戶而言,主服務(wù)器綁定整個系統(tǒng)對外的虛擬IP地址,負(fù)責(zé)截獲從客戶來的TCP數(shù)據(jù)包并分發(fā)到所有處于激活狀態(tài)下的服務(wù)器;對局域網(wǎng)中的服務(wù)器而言,主服務(wù)器綁定內(nèi)部局域網(wǎng)的網(wǎng)關(guān)地址,截獲所有備份服務(wù)器的應(yīng)答包并通過一定的同步機(jī)制做成一個統(tǒng)一的應(yīng)答包回送給客戶。備份服務(wù)器記錄從主服務(wù)器轉(zhuǎn)過來的連接。該系統(tǒng)每個服務(wù)器包括三個模塊心跳監(jiān)測模塊1、IP搶占模塊2和TCP連接容錯模塊3,模塊間的關(guān)系如圖2所示。各模塊的功能如下心跳監(jiān)測模塊(1)該模塊的主要功能是在系統(tǒng)啟動時通過讀取配置文件從所有服務(wù)器中第一次推舉出一個主服務(wù)器并且在以后的過程中進(jìn)行故障檢測。檢測系統(tǒng)中服務(wù)器是否失效、服務(wù)是否失效、網(wǎng)絡(luò)是否失效。當(dāng)出現(xiàn)故障時,它將故障狀態(tài)通知其它模塊,以便其它模塊能夠及時做出相應(yīng)的處理。如果失效的是備份服務(wù)器,本模塊僅將其從服務(wù)器鏈表中刪除;如果失效的是主服務(wù)器,則所有備份服務(wù)器的此模塊進(jìn)行合作選舉出一個新的主服務(wù)器。IP搶占模塊(2)當(dāng)主服務(wù)器失效時,心跳監(jiān)測模塊按照一定的算法無沖突地選舉出一個新的主服務(wù)器后,本模塊通過發(fā)送免費ARP包來通告系統(tǒng)對外的虛擬IP地址,并把對外的虛擬IP地址綁定在這個新的主服務(wù)器的網(wǎng)卡上。TCP連接容錯模塊(3)該模塊由TCP初始連接的同步、分發(fā)器和聚合器三個子模塊組成,使得用戶的每個TCP連接同時在多個服務(wù)器上保存有同步的映象。TCP初始連接的同步子模塊對每個第一次到達(dá)主服務(wù)器的TCP連接進(jìn)行初始同步。分發(fā)器將從客戶來的TCP數(shù)據(jù)包分發(fā)到各個處于激活狀態(tài)的服務(wù)器。聚合器收集各個服務(wù)器應(yīng)答的TCP數(shù)據(jù)包,對其進(jìn)行一定的處理,做成一個統(tǒng)一的應(yīng)答數(shù)據(jù)包發(fā)送給客戶端程序,讓客戶端程序感覺自己只是與一個服務(wù)器在通信。2工作流程描述2.1正常工作流程正常工作流程如圖4所示。1)客戶以虛擬IP地址發(fā)送請求;2)擁有虛擬IP地址的主服務(wù)器收到請求后,通過IP層的分發(fā)器,發(fā)往各備份服務(wù)器;3)主服務(wù)器和備份服務(wù)器分別根據(jù)收到的請求進(jìn)行處理;4)請求處理完畢后,將返回的數(shù)據(jù)傳給各自的IP層;5)備份服務(wù)器在IP層收到來自本機(jī)的數(shù)據(jù)包后,將此數(shù)據(jù)包的目的地址修改為主服務(wù)器的地址并重新計算校驗和,所有返回給主服務(wù)器的數(shù)據(jù)包通過聚合器進(jìn)行聚合處理;6)將聚合后的數(shù)據(jù)發(fā)往客戶。2.2主服務(wù)器失效后的處理主服務(wù)器失效后處理流程如圖3所示。1)運行在備份服務(wù)器上的心跳監(jiān)測模塊1檢測到主服務(wù)器失效;2)備份服務(wù)器啟動選舉算法選舉出新的主服務(wù)器。如果備份服務(wù)器發(fā)現(xiàn)選舉出來的主服務(wù)器是自身,則將自己狀態(tài)變量g_node_state的值由BACKUP變?yōu)镻RIMARY;3)新的主服務(wù)器從hostlist鏈表中刪除失效的服務(wù)器,并且遍歷連接哈希表,將相關(guān)數(shù)據(jù)項的狀態(tài)置為INACTIVE,將連接哈希表中所有未完成的連接的狀態(tài)置為RECOVERY;4)啟動IP搶占模塊2,對外宣告接管了虛擬IP地址和內(nèi)部網(wǎng)關(guān)地址;5)啟動分發(fā)器和聚合器;6)分發(fā)器接收客戶轉(zhuǎn)來的數(shù)據(jù)包并將它發(fā)給處于激活狀態(tài)的服務(wù)器;7)聚合器收集從各個服務(wù)器發(fā)來的應(yīng)答包,每來一個應(yīng)答包,就將相應(yīng)連接的所有服務(wù)器的狀態(tài)從RECOVERY變?yōu)镋STABLISHED;8)對于某個連接來說,當(dāng)它的各個激活服務(wù)器的狀態(tài)都從RECOVERY變?yōu)镋STABLISHED后,則該連接的狀態(tài)從RECOVERY狀態(tài)變?yōu)镋STABLISHED。此后,該連接就處于正常傳輸狀態(tài)。2.3備份服務(wù)器失效后的處理備份服務(wù)器失效后處理流程如圖3所示。1)備份服務(wù)器失效;2)經(jīng)過給定時間之后,主服務(wù)器發(fā)現(xiàn)備份服務(wù)器失效,將其從hostlist鏈表中刪除,另外,鎖住當(dāng)前連接哈希表,將其中每個活動連接的該服務(wù)器狀態(tài)置為INACTIVE,然后釋放連接哈希表;3)將數(shù)據(jù)包分發(fā)給那些處于激活的服務(wù)器。此時分發(fā)器在分發(fā)的過程中不會再將數(shù)據(jù)包分發(fā)給這個失效的備份服務(wù)器;4)聚合器聚合所有處于激活服務(wù)器的應(yīng)答包。此時聚合器不再等待失效的備份服務(wù)器的應(yīng)答包。3、各模塊的實現(xiàn)3.1心跳監(jiān)測模塊為了對整個系統(tǒng)中各個服務(wù)器的狀態(tài)進(jìn)行監(jiān)測,本發(fā)明在心跳監(jiān)測模塊中包含了三個核心子模塊,它們的功能分別如下1)狀態(tài)監(jiān)測子模塊每隔一段時間,就向多播組發(fā)送自己的心跳信息,以表明自己還處于激活狀態(tài)。如圖5所示,心跳信息是以多播的形式發(fā)給系統(tǒng)中的其它服務(wù)器機(jī)的,每個服務(wù)器在發(fā)送自己的心跳信息的同時也在接收其它各個服務(wù)器傳來的心跳信息。一旦某個服務(wù)器失效,其它任何服務(wù)器就無法收到來自它的心跳信息,當(dāng)這個時間超過一定的間隔時間(我們是以四個心跳信息的間隔時間為準(zhǔn),可以進(jìn)行設(shè)置)后,其它服務(wù)器就將它的狀態(tài)標(biāo)記為INACTIVE。心跳信息的報文格式syncaddr用來傳送心跳信息的網(wǎng)卡接口的內(nèi)部IP地址。id該服務(wù)器的編號。Primary表示該服務(wù)器是否為主服務(wù)器(0——備份服務(wù)器,1——主服務(wù)器)。hostlist在整個系統(tǒng)中是一個很重要的數(shù)據(jù)結(jié)構(gòu),用來記錄當(dāng)前處于激活狀態(tài)下的服務(wù)器,它是心跳監(jiān)測模塊和TCP連接容錯模塊的一個公共數(shù)據(jù)集。心跳監(jiān)測模塊要根據(jù)hostlist進(jìn)行正確的選舉,TCP連接容錯模塊也要根據(jù)hostlist把數(shù)據(jù)包分發(fā)給那些處于激活狀態(tài)的服務(wù)器。hostlist的管理主要由心跳監(jiān)測模塊完成。2)接收子模塊RcvThread接收其它服務(wù)器發(fā)來的心跳信息。3)選舉子模塊VotingThread系統(tǒng)初啟時此子模塊通過配置文件決定誰是主服務(wù)器。具體方法如下服務(wù)器初啟,讀配置文件,發(fā)現(xiàn)自己被配置為主服務(wù)器,這時候不是立刻把自己推舉為主服務(wù)器,而是監(jiān)聽心跳信息的接收端口一段時間(至少要大于心跳信息的間隔時間,這樣才能保證收到已啟動的服務(wù)器的心跳信息),根據(jù)接收到的心跳信息判斷系統(tǒng)中是否已經(jīng)存在一個主服務(wù)器,如果存在,則不推舉自己為主服務(wù)器,以避免沖突;如果不存在,才將自己推舉為主服務(wù)器。這樣處理避免了對開機(jī)先后次序的約束。在以后的過程中,此子模塊還每隔一段時間(可以設(shè)置)就檢查當(dāng)前系統(tǒng)中服務(wù)器的狀態(tài)當(dāng)發(fā)現(xiàn)主服務(wù)器失效時,則重新從處于激活的備份服務(wù)器中選舉出一個新的主服務(wù)器;當(dāng)發(fā)現(xiàn)某個備份服務(wù)器失效時,則將該服務(wù)器從記錄服務(wù)器的鏈表中刪除。選舉機(jī)制根據(jù)各個服務(wù)器的id號來判斷誰來擔(dān)當(dāng)主服務(wù)器,其基本思想就是看誰的id號最小。其中,id號在每個服務(wù)器的配置文件中給出。當(dāng)系統(tǒng)初啟后一段時間,每個服務(wù)器的狀態(tài)信息(hostlist_head)都建立起來了,其中保存著每個服務(wù)器的id號,而且hostlist_head在每個服務(wù)器上都是相同的。當(dāng)某個服務(wù)器失效時,其它服務(wù)器將從各自的hostlist_head中刪除此失效服務(wù)器,因此,對每個仍處于激活狀態(tài)的服務(wù)器來說都有一個由所有處于激活狀態(tài)服務(wù)器的id號組成的集合,那么在這個相同的集合中找一個最小id,其結(jié)果必然相同,這就保證了選舉的一致性。選舉結(jié)果出來后,每個服務(wù)器將這個結(jié)果與自己的id號相比較,如果與自己的id號相同,則啟動IP搶占線程,將系統(tǒng)對外的虛擬IP地址搶過來綁定在自己的外部網(wǎng)卡上,同時也要把內(nèi)部局域網(wǎng)的網(wǎng)關(guān)地址搶過來綁定在自己的內(nèi)部網(wǎng)卡上。服務(wù)器失效的判斷方法RcvThread每收到一個服務(wù)器傳來的心跳信息(心跳監(jiān)測Thread發(fā)出),就根據(jù)自己的時鐘,將該服務(wù)器的LastUpdateTime變量更新一次,VotingThread核心線程就是通過檢測每個服務(wù)器的LastUpdateTime來判斷服務(wù)器狀態(tài)的。服務(wù)器失效條件為CurrentTim-LastUpdateTime>DEATHVERDICTTIME3.2IP搶占模塊當(dāng)一臺主機(jī)把以太網(wǎng)數(shù)據(jù)幀發(fā)送到位于同一局域網(wǎng)上的另一臺主機(jī)時,是根據(jù)48位的以太網(wǎng)地址而不是根據(jù)IP地址來確定目的接口的。地址解析為這兩種不同的地址形式提供了映射32bit的IP地址和數(shù)據(jù)鏈路層使用的地址(如MAC地址)。地址轉(zhuǎn)換協(xié)議ARP為IP地址到對應(yīng)的硬件地址之間提供了動態(tài)映射。每個主機(jī)都有一個ARP高速緩存。它存放了最近Internet地址到硬件地址之間的映射記錄。當(dāng)一個IP包經(jīng)過路由選擇后,就可得到下一站路由器地址或目的主機(jī)的地址,然后在ARP高速緩存中去尋找與之對應(yīng)的MAC地址,如果未找到,則在局域網(wǎng)內(nèi)廣播一個ARP請求分組,該分組攜帶下一站的IP地址或目的主機(jī)的IP地址,該局域網(wǎng)內(nèi)的其它主機(jī)收到這個ARP分組后就會將分組中攜帶的IP地址與自己的地址進(jìn)行比較,如果相同,則將自己的MAC地址包裝在ARP應(yīng)答包中,回送給請求的主機(jī)。發(fā)出請求的主機(jī)收到應(yīng)答包后,就將這個新的IP地址與MAC地址映射關(guān)系添加到自己的ARP緩存中,然后根據(jù)這個MAC地址發(fā)送IP數(shù)據(jù)包。在本發(fā)明中,引入了一個浮動的虛擬IP地址,模塊示意圖如圖6所示。這里的浮動是指這個虛擬IP地址可以轉(zhuǎn)移。它被綁定在主服務(wù)器的一個網(wǎng)絡(luò)接口上。當(dāng)主服務(wù)器失效時,這個虛擬IP地址可以移動到新的主服務(wù)器的一個網(wǎng)絡(luò)接口上。在主機(jī)上設(shè)置一個虛擬IP地址需要通過相應(yīng)的內(nèi)核函數(shù)創(chuàng)建一個邏輯網(wǎng)絡(luò)接口。虛擬IP地址與主機(jī)的某個實際的物理網(wǎng)卡具有相同的MAC地址。向外廣播攜帶虛擬IP地址和主機(jī)外部網(wǎng)卡MAC地址的ARP應(yīng)答包,可以更新同一子網(wǎng)內(nèi)其它主機(jī)的ARP緩存。由于ARP高速緩存中每一項的生存時間一般為20分鐘,所以需要每隔一段時間發(fā)送一次ARP應(yīng)答包,這樣才能保證其它主機(jī)都會將發(fā)往虛擬IP地址的IP包正確的發(fā)到擁有虛擬IP地址的主機(jī)上。當(dāng)主服務(wù)器失效時,為了讓新的主服務(wù)器接管這個虛擬IP地址,需要立即在新的主服務(wù)器的外部網(wǎng)卡上創(chuàng)建一個同樣的邏輯網(wǎng)絡(luò)接口,廣播帶有自己的MAC地址的ARP應(yīng)答包到其它主機(jī),使得其它主機(jī)的ARP緩存得到更新,以便將傳給虛擬IP地址的IP包定向到這個新的MAC地址。3.3TCP連接容錯模塊TCP連接容錯模塊位于IP層與TCP層之間,一方面它要截獲送往IP層的數(shù)據(jù)包,并把它分發(fā)給所有處于激活狀態(tài)的服務(wù)器(由分發(fā)器完成);另一方面,服務(wù)器的應(yīng)答數(shù)據(jù)包也要通過主服務(wù)器發(fā)送出去,聚合器要對這些應(yīng)答的數(shù)據(jù)包進(jìn)行處理,以達(dá)到同步的效果(由聚合器完成)。本模塊由以下三個子模塊構(gòu)成1)TCP初始連接的同步子模塊聚合器正常工作的前提是每個TCP連接的初始序列號要一致。因此,需要設(shè)置一個TCP初始連接的同步子模塊負(fù)責(zé)對每個TCP初始連接進(jìn)行同步。同步過程如下在主服務(wù)器IP層的NF_IP_PRE_ROUTING處,對進(jìn)來的syn包,首先調(diào)用HA_Init_tcp_v4_sequence計算一個初始序列號,將結(jié)果放入tcph->ack_seq中,且將tcph->res1置為1;將修改過的syn包傳到TCP層,TCP收到包,首先檢查tcph->res1,如果為1,取出tcph->ack_seq中的值作為第二次握手信息的初始序列號,同時在IP層將此包復(fù)制一份轉(zhuǎn)發(fā)給所有激活的備份服務(wù)器,備份服務(wù)器收到此包后,檢測tcph->res1的值,如果tcph->res1等于1,取出tcph->ack_seq的值作為第二次握手信息的初始序列號。從而使得主服務(wù)器和備份服務(wù)器產(chǎn)生的第二次握手信息的初始序列號相同,這是聚合器正常運轉(zhuǎn)的首要條件。2)分發(fā)器分發(fā)器是在NF_IP_PRE_ROUTING處注冊一個鉤子函數(shù),它負(fù)責(zé)截獲客戶端發(fā)來的數(shù)據(jù)包并進(jìn)行分發(fā)。分發(fā)就是在IP層復(fù)制經(jīng)過的數(shù)據(jù)包skb,然后修改其目的地址為各服務(wù)器機(jī)的地址,重新計算TCP和IP層的校驗和,然后轉(zhuǎn)發(fā)出去。分發(fā)器用到一個很關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)ha_conn,該結(jié)構(gòu)記錄與當(dāng)前連接有關(guān)的所有服務(wù)器的狀態(tài)信息(node_info),包括IP地址。從客戶端發(fā)往服務(wù)端的每個數(shù)據(jù)包都會被分發(fā)給所有服務(wù)器。具體的分發(fā)過程如圖7所示。(1)判斷目的IP地址是否為服務(wù)器端對外的虛擬IP地址,協(xié)議類型是否為TCP,不是則將此包丟棄,是則轉(zhuǎn)(2);(2)連接哈希表(ha_conn_table[])中查找相應(yīng)的連接;(3)找出該連接(ha_conn)中的所有服務(wù)器(head_node_list),為它們分別發(fā)一份數(shù)據(jù)包,分發(fā)過程如下(a)skb_copy得到一份拷貝;(b)修改目的地址;(c)為TCP首部重新計算校驗和;(d)用ip_send_check(structiphdr*)為IP首部重新計算校驗和;(e)調(diào)用ip_rcv_finish(structskb_buff*)對該數(shù)據(jù)包進(jìn)行路由和轉(zhuǎn)發(fā)。需要說明的是,雖然這里沒有修改TCP首部的數(shù)據(jù),但對TCP進(jìn)行校驗和的重新計算仍然是有必要的。因為TCP包含一個12字節(jié)長的偽首部,它是為了計算校驗和而設(shè)置的。偽首部包含IP首部的一些字段,其目的是讓TCP兩次檢查數(shù)據(jù)是否已經(jīng)正確到達(dá)目的地第一次確保IP沒有接受到地址不是本服務(wù)器的數(shù)據(jù)包;第二次確保IP層沒有把應(yīng)該傳給另一高層協(xié)議的數(shù)據(jù)包錯傳給TCP層。TCP校驗和的計算包括了偽首部,所以,修改了IP首部的目的地址之后,需要重新更新TCP校驗和。3)聚合器各個服務(wù)器處理請求之后,產(chǎn)生的應(yīng)答消息可能會由于各自資源的不同,產(chǎn)生數(shù)據(jù)不一致的情況。為了同步各服務(wù)器間的狀態(tài),本方案在NF_IP_POST_ROUTING處插入了聚合器。聚合器的主要工作是完成數(shù)據(jù)的聚合應(yīng)答,形成一個能使各服務(wù)器狀態(tài)同步的應(yīng)答發(fā)往客戶端。聚合應(yīng)答的基本思想就是讓應(yīng)答快的服務(wù)器等待應(yīng)答慢的服務(wù)器。本方案并不是對所有的應(yīng)答包進(jìn)行轉(zhuǎn)發(fā),而是有選擇的轉(zhuǎn)發(fā)。對于一段新的數(shù)據(jù)包,只有當(dāng)確認(rèn)所有的服務(wù)器都已經(jīng)發(fā)送過此包之后才會被轉(zhuǎn)發(fā)出去。在實現(xiàn)中用到如下數(shù)據(jù)結(jié)構(gòu)對于每個連接,在主服務(wù)器中都有一個這樣的結(jié)構(gòu)。Node_info記錄了每個服務(wù)器發(fā)送序號、確認(rèn)序號和窗口大小,ha_conn中的相關(guān)數(shù)據(jù)結(jié)構(gòu)是根據(jù)各個服務(wù)器記錄信息推導(dǎo)出來的。node_info中的數(shù)據(jù)項send_seq表示該服務(wù)器的連接數(shù)據(jù)要發(fā)送的下一個序列號。ack_seq表示該服務(wù)器希望收到的從客戶傳來的數(shù)據(jù)的序列號。window表示該服務(wù)器接收窗口的大小。ha_conn中的數(shù)據(jù)項min_send_seq用于輸出流的處理。表示發(fā)送最慢的服務(wù)器發(fā)送到什么地方,它之前的數(shù)據(jù)已經(jīng)被所有的服務(wù)器發(fā)出。其值等于各個服務(wù)器中send_seq的最小值,可以保證輸出流的同步。min_ack_seq用于輸入流的處理。表示最小的應(yīng)答序號,它之前的數(shù)據(jù)已經(jīng)被所有的服務(wù)器正確的收到并確認(rèn)。其值等于各個服務(wù)器中ack_seq的最小值可以保證輸入流的同步。min_window表示各個服務(wù)器最小的接收窗口大小。具體的聚合過程如圖8所示。(a)分發(fā)器在連接請求建立后將各數(shù)據(jù)結(jié)構(gòu)初始化;(b)對于所有來自服務(wù)器的數(shù)據(jù)包,先更新此服務(wù)器的(node_info)的記錄信息send_seq和ack_seq,并重新計算ha_conn中的min_send_seq和min_ack_seq;(c)假如此數(shù)據(jù)包是不帶數(shù)據(jù)的純ACK應(yīng)答包則直接發(fā)送出去,否則轉(zhuǎn)d);(d)假如是重傳的數(shù)據(jù)包也需要直接發(fā)送,以防止聚合器發(fā)出去的數(shù)據(jù)包在中途丟失,否則轉(zhuǎn)e);(e)假如是失序的數(shù)據(jù)包,則直接丟掉,等待按序到達(dá)的數(shù)據(jù)包,而這些被丟棄的失序包因為沒有被應(yīng)答,會由該服務(wù)器重傳,否則轉(zhuǎn)f);(f)假如是按序到來的帶有數(shù)據(jù)的應(yīng)答包,則繼續(xù)判斷min_send_seq是否被更新。如果min_send_seq得到更新,則說明該服務(wù)器的數(shù)據(jù)是最后到達(dá)的一個,之前其它服務(wù)器已經(jīng)傳出了這個數(shù)據(jù)段。在這種情況下,聚合器會把這段各服務(wù)器都已經(jīng)發(fā)送過的數(shù)據(jù)選擇一個最短的發(fā)送出去;(g)聚合器會把每個出去的數(shù)據(jù)包中TCP首部的window字段改為min_window,ack_seq字段改min_ack_seq,源IP電址改為虛擬IP地址;(h)重新計算要發(fā)送出去的數(shù)據(jù)包的TCP校驗和,IP校驗和,然后調(diào)用ip_finish_output2(structsk_buff*skb)函數(shù)把數(shù)據(jù)包發(fā)送出去。在具有4個(2個或2個以上服務(wù)器均可)服務(wù)器上構(gòu)建一個TCP連接容錯系統(tǒng),其基本配置如表1、表2所示,各服務(wù)器上的配置文件如表3所示。表1各服務(wù)器的硬件配置表2各服務(wù)器的網(wǎng)絡(luò)配置#serveripprimary192.168.0.2011192.168.0.2020192.168.0.2030192.168.0.2040表3各服務(wù)器中的配置文件其中,一臺作為主服務(wù)器,其余的服務(wù)器均作為備份服務(wù)器。具體實施如下主服務(wù)器啟動本發(fā)明底模塊后將內(nèi)部網(wǎng)關(guān)地址10.0.0.100綁定在自己的內(nèi)部網(wǎng)卡NICA上,作為一個內(nèi)部的可浮動的IP地址;另外,主服務(wù)器還要將外部虛擬地址211.69.0.150綁在自己的外部網(wǎng)卡NICB上,客戶端程序就是通過這個外部虛擬地址地址來與服務(wù)器進(jìn)行TCP連接通信。每臺機(jī)器均需要裝載本發(fā)明的模塊(3個子模塊),但系統(tǒng)初始化時,只在主服務(wù)器上啟動心跳監(jiān)測模塊及分發(fā)器、聚合器;在備份服務(wù)器上啟動心跳監(jiān)測模塊。權(quán)利要求1.一種基于多TCP連接映像的高可用系統(tǒng),客戶通過網(wǎng)關(guān)與服務(wù)器通信,其特征在于該系統(tǒng)包括N(N≥2)個服務(wù)器,N個服務(wù)器均包括心跳監(jiān)測模塊、IP搶占模塊和TCP連接容錯模塊;所述心跳監(jiān)測模塊用于故障檢測,當(dāng)出現(xiàn)故障時,將故障狀態(tài)通知其它模塊;所述IP搶占模塊通過發(fā)送免費ARP包來通告系統(tǒng)對外的虛擬IP地址,當(dāng)主服務(wù)器失效時,負(fù)責(zé)無沖突地選舉出一個新的主服務(wù)器,并把對外的虛擬IP地址綁定在這個新的主服務(wù)器的網(wǎng)卡上;所述TCP連接容錯模塊負(fù)責(zé)將用戶的一個TCP連接能夠同時與幾個服務(wù)器通信。2.根據(jù)權(quán)利要求1所述的高可用系統(tǒng),其特征在于所述心跳監(jiān)測模塊包括狀態(tài)監(jiān)測子模塊、接收子模塊和選舉子模塊;所述狀態(tài)監(jiān)測子模塊負(fù)責(zé)每隔一段時間向多播組發(fā)送自己的心跳信息,以表明自己還處于激活狀態(tài);所述接收子模塊負(fù)責(zé)接收其它服務(wù)器發(fā)來的心跳信息;所述選舉子模塊負(fù)責(zé)在系統(tǒng)初啟時此子模塊通過配置文件決定誰是主服務(wù)器。3.根據(jù)權(quán)利要求1或2所述的高可用系統(tǒng),其特征在于所述TCP連接容錯模塊包括TCP初始連接的同步子模塊、分發(fā)器和聚合器;所述TCP初始連接的同步子模塊負(fù)責(zé)對每個TCP初始連接進(jìn)行同步;所述分發(fā)器負(fù)責(zé)將從客戶來的TCP數(shù)據(jù)包分發(fā)到各個處于激活狀態(tài)的服務(wù)器;所述聚合器負(fù)責(zé)收集各個服務(wù)器應(yīng)答的TCP數(shù)據(jù)包進(jìn)行處理,做成一個統(tǒng)一的應(yīng)答數(shù)據(jù)包發(fā)送給客戶端程序,讓客戶端程序感覺自己只是與一個服務(wù)器在通信。全文摘要本發(fā)明公開了一種基于多TCP連接映像的高可用系統(tǒng)。該系統(tǒng)中各個服務(wù)器均包含有心跳監(jiān)測模塊、IP搶占模塊和TCP連接容錯模塊。其工作流程和方法中運用了狀態(tài)檢測技術(shù)、IP地址搶占技術(shù)、TCP連接容錯技術(shù)、選舉主服務(wù)器技術(shù)以及TCP初始連接同步技術(shù)。所發(fā)明的基于多TCP連接映像的高可用系統(tǒng)與現(xiàn)有的系統(tǒng)相比,不需要做日志,恢復(fù)時間更短,可用性更高,同步機(jī)制不需要額外的通信開銷,能真正做到無縫接管且不需要修改客戶端的任何軟件。文檔編號G06F13/42GK1423197SQ02147870公開日2003年6月11日申請日期2002年12月16日優(yōu)先權(quán)日2002年12月16日發(fā)明者金海,徐婕,邵志遠(yuǎn),程斌,岳建輝申請人:華中科技大學(xué)