欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

Atc系統(tǒng)中一種實(shí)現(xiàn)多機(jī)關(guān)鍵數(shù)據(jù)一致性功能的方法

文檔序號(hào):6583385閱讀:163來(lái)源:國(guó)知局
專(zhuān)利名稱(chēng):Atc系統(tǒng)中一種實(shí)現(xiàn)多機(jī)關(guān)鍵數(shù)據(jù)一致性功能的方法
技術(shù)領(lǐng)域
本發(fā)明涉及計(jì)算機(jī)分布式系統(tǒng)應(yīng)用領(lǐng)域,尤其是ATC系統(tǒng)中一種實(shí)現(xiàn)多機(jī)關(guān)鍵數(shù) 據(jù)一致性功能的方法,可用于中小型分布式系統(tǒng)中數(shù)據(jù)一致性功能的實(shí)現(xiàn)。
背景技術(shù)
在現(xiàn)代空中交通管制系統(tǒng)(簡(jiǎn)稱(chēng)ATC)中,通常有承擔(dān)顯示任務(wù)的多臺(tái)席位機(jī)器, 另外還有多臺(tái)服務(wù)器和通訊處理機(jī),需要保持這些機(jī)器中相應(yīng)數(shù)據(jù)的一致性。當(dāng)某主機(jī) 一個(gè)進(jìn)程提出修改某一共享的資源時(shí),也可能其它主機(jī)的進(jìn)程也在試圖修改這一資源,如 何保證他們的修改按照合理的順序進(jìn)行而又不相互干擾一直是需要解決的問(wèn)題之一。另 外,當(dāng)需要保證一致的數(shù)據(jù)在一個(gè)節(jié)點(diǎn)上被修改了,如何保證該修改及時(shí)地?cái)U(kuò)展到整個(gè)系 統(tǒng)中,即保證數(shù)據(jù)各副本一致也是另一個(gè)需要解決的問(wèn)題。在ATC系統(tǒng)中目前的趨勢(shì)是不 采用特殊的設(shè)備,尤其是網(wǎng)絡(luò)設(shè)備,所以ATC系統(tǒng)目前廣泛采用TCP/IP協(xié)議作為內(nèi)部通訊 的協(xié)議,網(wǎng)絡(luò)也主要采用一臺(tái)網(wǎng)為主的高速通信網(wǎng),進(jìn)程間數(shù)據(jù)傳遞也主要是以基于消息 傳遞的方法為主。本研究適用于ATC系統(tǒng)中運(yùn)行中非頻繁變化但又對(duì)運(yùn)行起關(guān)鍵作用的 數(shù)據(jù),這些數(shù)據(jù)以"KEY-Value"的方式進(jìn)行組織,即每個(gè)數(shù)據(jù)有一個(gè)全系統(tǒng)唯一的Key值, Value為該值對(duì)應(yīng)的內(nèi)容數(shù)據(jù);比如ATC系統(tǒng)中席位中劃定的臨時(shí)背景圖,是否進(jìn)行遙傳輸 出等均可以用一個(gè)Key表示。以期在保證這些系統(tǒng)中設(shè)置的KEY的內(nèi)容在每個(gè)機(jī)器上均相 同。當(dāng)一個(gè)節(jié)點(diǎn)A需要修改一個(gè)KEY的值時(shí),它需要向系統(tǒng)中所有其他節(jié)點(diǎn)發(fā)送請(qǐng)求獲得 該KEY修改權(quán),我們又稱(chēng)為加鎖請(qǐng)求的信息,當(dāng)一個(gè)節(jié)點(diǎn)B收到A發(fā)來(lái)的加鎖請(qǐng)求時(shí),B查 看自己有沒(méi)有也在請(qǐng)求修改KEY,若無(wú)請(qǐng)求,則B就回應(yīng)A,告訴A自己允許其修改該KEY,當(dāng) A收齊了系統(tǒng)中所有其它節(jié)點(diǎn)的回應(yīng),且該請(qǐng)求在A的請(qǐng)求列表中是最高請(qǐng)求時(shí),它就可以 修改該KEY的數(shù)據(jù)了 。經(jīng)文獻(xiàn)檢索暫未發(fā)現(xiàn)有這方面的公開(kāi)報(bào)道。

發(fā)明內(nèi)容
本發(fā)明旨在解決以ATC系統(tǒng)為代表的分布式系統(tǒng)中保證數(shù)據(jù)一致性與資源訪(fǎng)問(wèn) 的互斥問(wèn)題。 實(shí)現(xiàn)本發(fā)明之目的的技術(shù)解決方案是這樣的 ATC系統(tǒng)中一種實(shí)現(xiàn)多機(jī)關(guān)鍵數(shù)據(jù)一致性功能的方法,包括在ATC分布式系統(tǒng) 中的每臺(tái)主機(jī)都運(yùn)行數(shù)據(jù)一致性服務(wù)端跨平臺(tái)軟件(簡(jiǎn)稱(chēng)KDC),所述KDC提供了編程接 口 LibKDC庫(kù),每個(gè)需要使用關(guān)鍵數(shù)據(jù)一致性功能的應(yīng)用進(jìn)程都需要使用這個(gè)接口庫(kù),作為 KDC的客戶(hù)端,并按照接口要求提供進(jìn)程號(hào);其特征是 (1)當(dāng)一個(gè)使用編程接口 LibKDC的進(jìn)程需要修改某個(gè)Key值的信息時(shí),需要向數(shù) 據(jù)一致性服務(wù)端KDC程序發(fā)出加鎖請(qǐng)求; (2)數(shù)據(jù)一致性服務(wù)端KDC向其他主機(jī)的KDC通過(guò)消息機(jī)制進(jìn)行詢(xún)問(wèn);
(3)當(dāng)確認(rèn)加鎖成功后,需要將該數(shù)據(jù)向其他主機(jī)同步,最后修改本地?cái)?shù)據(jù)庫(kù);
(4)完成后進(jìn)程發(fā)出鎖使用完畢的報(bào)文,數(shù)據(jù)一致性服務(wù)端KDC對(duì)還在等待進(jìn)行
3鎖請(qǐng)求回應(yīng)的主機(jī)鎖發(fā)出批準(zhǔn)報(bào)文,這樣其他進(jìn)程也可以訪(fǎng)問(wèn)該Key的數(shù)據(jù);
(5)收到更新數(shù)據(jù)的數(shù)據(jù)一致性服務(wù)端KDC修改本地?cái)?shù)據(jù); (6)在更新數(shù)據(jù)以后,查詢(xún)對(duì)該Key值發(fā)起過(guò)訂閱的進(jìn)程,對(duì)這些進(jìn)程發(fā)出指令。
所述的ATC系統(tǒng)中一種實(shí)現(xiàn)多機(jī)關(guān)鍵數(shù)據(jù)一致功能性的方法,其特征是,所述的 加鎖請(qǐng)求與更新數(shù)據(jù)的步驟如下 (2. 1)運(yùn)行開(kāi)始,數(shù)據(jù)一致性服務(wù)端KDC收到客戶(hù)端請(qǐng)求,對(duì)系統(tǒng)中除了本機(jī)外的 活躍節(jié)點(diǎn)發(fā)出加鎖請(qǐng)求,并形成回應(yīng)等待隊(duì)列; (2. 2)暫時(shí)沒(méi)有獲得鎖但又收到本機(jī)任意客戶(hù)端對(duì)同一 Key的請(qǐng)求,覆蓋原請(qǐng)求; (2.3)詢(xún)問(wèn)收到鎖請(qǐng)求,其邏輯時(shí)戳比本地等待中的最小的時(shí)戳要小嗎?如果是,
對(duì)加鎖請(qǐng)求發(fā)出加鎖回應(yīng)報(bào)文,如果回答不是,對(duì)該請(qǐng)求暫時(shí)放入隊(duì)列中; (2. 4)接收加鎖回應(yīng)報(bào)文,并在期待列表中去掉報(bào)文發(fā)出節(jié)點(diǎn); (2. 5)再次詢(xún)問(wèn)是否該鎖的期待回應(yīng)為空?如果回答不是,則返回(2. 2)步; (2. 6)如果回答是,則使用最新的對(duì)Key對(duì)應(yīng)的Value值對(duì)數(shù)據(jù)進(jìn)行修改,并傳遞
到其它主機(jī); (2. 7)檢查發(fā)向本地的請(qǐng)求鎖隊(duì)列中邏輯時(shí)戳最小的請(qǐng)求,對(duì)其發(fā)出加鎖回應(yīng);
(2.8)運(yùn)行結(jié)束。 本發(fā)明能夠支持1 32臺(tái)主機(jī),這些主機(jī)可以在硬件配置和操作系統(tǒng)平臺(tái)上不一 致,至少可以支持全系統(tǒng)中有100個(gè)KEY,且KEY的設(shè)置是任意的,與具體應(yīng)用無(wú)關(guān)。對(duì)于需 要同步的數(shù)據(jù),系統(tǒng)間節(jié)點(diǎn)間耦合度較低,任何節(jié)點(diǎn)主機(jī)都是平等的,任何一個(gè)機(jī)器或者進(jìn) 程退出都不會(huì)對(duì)系統(tǒng)造成較大影響,新加入的主機(jī)可以很快很好的融入到系統(tǒng)中。使用該 功能的是系統(tǒng)中每個(gè)主機(jī)的進(jìn)程,每個(gè)進(jìn)程在一臺(tái)主機(jī)上是唯一的,如果一個(gè)進(jìn)程在一臺(tái) 主機(jī)上需要運(yùn)行成兩個(gè)實(shí)例,應(yīng)在使用本發(fā)明提供的API接口時(shí)能夠予以區(qū)分;本發(fā)明要 求對(duì)整個(gè)系統(tǒng)進(jìn)程按類(lèi)型進(jìn)行編號(hào),編號(hào)應(yīng)不重復(fù),但具體的進(jìn)程編號(hào)與本發(fā)明提供的方 法是無(wú)關(guān)和隔離的,同時(shí)本發(fā)明與應(yīng)用是無(wú)關(guān),不僅可以應(yīng)用于ATC系統(tǒng)對(duì)其他類(lèi)似分布 式系統(tǒng)同樣適用。 與現(xiàn)有技術(shù)比較本發(fā)明具有突出的優(yōu)點(diǎn)。其一,該發(fā)明實(shí)現(xiàn)了中小型分布式系統(tǒng) 中數(shù)據(jù)一致性的保證,該方法具有通用性,適用其他類(lèi)似系統(tǒng),具有較大的應(yīng)用前景和價(jià) 值。其二,本發(fā)明描述的KDC操作的粒度為每一個(gè)Key值,粒度較小具有很好的并發(fā)性,同 時(shí)所使用的KEY是自定義的與應(yīng)用無(wú)關(guān)。其三,在ATC系統(tǒng)中試用效果良好,實(shí)現(xiàn)了本發(fā)明 的目的。


圖1是本發(fā)明所述數(shù)據(jù)一致性服務(wù)端(KDC)跨平臺(tái)軟件部署示意圖。 圖2是本發(fā)明所述的加鎖及數(shù)據(jù)更新流程示意圖。 圖3圖4是本發(fā)明所述的邏輯時(shí)戳與KDC互斥機(jī)制原理示意圖。 圖5是本發(fā)明所述的KDC修改數(shù)據(jù)過(guò)程實(shí)施例示意圖。 圖6是本發(fā)明所述的KDC版本同步實(shí)施例示意圖。
具體實(shí)施例方式
參見(jiàn)附圖給出實(shí)施例并對(duì)發(fā)明做出進(jìn)一步的說(shuō)明。從圖1可知,本發(fā)明中要求分 布式系統(tǒng)中的每臺(tái)主機(jī)都運(yùn)行數(shù)據(jù)一致性服務(wù)端KDC—個(gè),該軟件是一個(gè)跨平臺(tái)軟件,目 前可在WIN32\S0LARIS\LINUX\VXW0RK平臺(tái)上運(yùn)行。該軟件的運(yùn)行需要系統(tǒng)配置文件。
KDC提供了編程接口 LibKDC庫(kù),每個(gè)需要使用關(guān)鍵數(shù)據(jù)一致性功能的應(yīng)用進(jìn)程都 需要使用這個(gè)接口庫(kù),作為KDC的客戶(hù)端,并按照接口要求提供進(jìn)程號(hào)等信息。KDC的配置 文件對(duì)全系統(tǒng)有效,各主機(jī)使用同意內(nèi)容的配置文件,LibKDC會(huì)用到配置文件的一部分, LibKDC需要知道系統(tǒng)中定義的KEY和KDC用于監(jiān)聽(tīng)的端口號(hào)等信息。 KDC服務(wù)端使用嵌入式數(shù)據(jù)庫(kù)BDB(Berkely DB)運(yùn)行,Key-Value信息作為一個(gè)記 錄被寫(xiě)入和讀出;KDC客戶(hù)端提供對(duì)指定Key的加鎖、解鎖、寫(xiě)入、讀出、指定對(duì)某Key值的 訂閱功能,同時(shí)支持當(dāng)某個(gè)Key被修改時(shí)的異步通知對(duì)此Key訂閱過(guò)進(jìn)程的功能。
KDC與使用LibKDC的進(jìn)程間通過(guò)進(jìn)程間(IPC)方式進(jìn)行通訊,本發(fā)明中IPC使用 IP為127. 0. 0. 1的主機(jī)本地回環(huán)(Loopback)地址,KDC作為T(mén)CP服務(wù)端,LibKDC作為T(mén)CP 客戶(hù)端完成。 嵌入式數(shù)據(jù)庫(kù)BDB可以支持一臺(tái)主機(jī)內(nèi)不同進(jìn)程的并發(fā)訪(fǎng)問(wèn),KDC與多個(gè)使用 LibKDC的程序可以同時(shí)訪(fǎng)問(wèn)BDB形成的數(shù)據(jù)庫(kù)。 設(shè)計(jì)中每個(gè)Key為一個(gè)字符串,對(duì)特定系統(tǒng)要求將所用的Key全部列入配置文件 中,并進(jìn)行連續(xù)編號(hào),每個(gè)編號(hào)即為該Key的索引,在代碼實(shí)現(xiàn)中是以每個(gè)Key對(duì)應(yīng)的索引 用以?xún)?nèi)部操作和數(shù)據(jù)傳輸中區(qū)分不同Key,編程接口。參見(jiàn)圖2, (1)當(dāng)一個(gè)使用編程接口 LibKDC的進(jìn)程需要修改某個(gè)Key值的信息時(shí),需要向數(shù) 據(jù)一致性服務(wù)端KDC程序發(fā)出加鎖請(qǐng)求; (2)數(shù)據(jù)一致性服務(wù)端KDC向其他主機(jī)的KDC通過(guò)消息機(jī)制進(jìn)行詢(xún)問(wèn);
(3)當(dāng)確認(rèn)加鎖成功后,需要將該數(shù)據(jù)向其他主機(jī)同步,最后修改本地?cái)?shù)據(jù)庫(kù);
(4)完成后進(jìn)程發(fā)出釋放鎖的請(qǐng)求,數(shù)據(jù)一致性服務(wù)端KDC再通知其他主機(jī)鎖已 經(jīng)釋放了鎖,這樣其他進(jìn)程也可以訪(fǎng)問(wèn)該Key的數(shù)據(jù); (5)收到更新數(shù)據(jù)的數(shù)據(jù)一致性服務(wù)端KDC修改數(shù)據(jù)進(jìn)程所在的本地KDC ;
(6)在更新數(shù)據(jù)以后,查詢(xún)對(duì)該Key值發(fā)起過(guò)訂閱的進(jìn)程,對(duì)這些進(jìn)程發(fā)出指令;
(7)進(jìn)程收到該指令后,可以立即讀取該Key值的數(shù)據(jù)。 在所述的ATC系統(tǒng)中一種實(shí)現(xiàn)多機(jī)關(guān)鍵數(shù)據(jù)一致功能性的方法中,所述的加鎖請(qǐng) 求與更新數(shù)據(jù)的步驟如下 (2. 1)運(yùn)行開(kāi)始,數(shù)據(jù)一致性服務(wù)端KDC收到客戶(hù)端請(qǐng)求,對(duì)系統(tǒng)中除了本機(jī)外的 活躍節(jié)點(diǎn)發(fā)出加鎖請(qǐng)求,并形成回應(yīng)等待隊(duì)列; (2. 2)暫時(shí)沒(méi)有獲得鎖但又收到本機(jī)任意客戶(hù)端對(duì)同一 Key的請(qǐng)求,覆蓋原請(qǐng)求; (2.3)詢(xún)問(wèn)收到鎖請(qǐng)求,其邏輯時(shí)戳比本地等待中的最小的時(shí)戳要小嗎?如果是,
對(duì)加鎖請(qǐng)求發(fā)出加鎖回應(yīng)報(bào)文,如果回答不是,對(duì)該請(qǐng)求暫時(shí)放入隊(duì)列中; (2. 4)接收加鎖回應(yīng)報(bào)文,并在期待列表中去掉報(bào)文發(fā)出節(jié)點(diǎn); (2. 5)再次詢(xún)問(wèn)是否該鎖的期待回應(yīng)為空?如果回答不是,則返回(2. 2)步; (2. 6)如果回答是,則使用最新的對(duì)Key對(duì)應(yīng)的Value值對(duì)數(shù)據(jù)進(jìn)行修改,并傳遞
到其它主機(jī);
(2. 7)檢查發(fā)向本地的請(qǐng)求鎖隊(duì)列中邏輯時(shí)戳最小的請(qǐng)求,對(duì)其發(fā)出加鎖回應(yīng);
(2.8)運(yùn)行結(jié)束。 本發(fā)明最重要的是使用了加鎖機(jī)制避免多個(gè)主機(jī)多個(gè)進(jìn)程并地對(duì)數(shù)據(jù)進(jìn)行修改, 加鎖機(jī)制按每個(gè)Key值為粒度,需要對(duì)除本機(jī)節(jié)點(diǎn)外的其他主機(jī)發(fā)出加鎖請(qǐng)求,發(fā)出請(qǐng)求 前形成等待隊(duì)列,請(qǐng)求帶有邏輯時(shí)戳,各節(jié)點(diǎn)對(duì)收到的來(lái)自其他主機(jī)的加鎖請(qǐng)求進(jìn)行比較 以決定是否發(fā)出請(qǐng)求回應(yīng);發(fā)出加鎖請(qǐng)求的節(jié)點(diǎn)在檢查到等待隊(duì)列為空時(shí),認(rèn)為自己已經(jīng) 獲得鎖并開(kāi)始分發(fā)數(shù)據(jù)。在等待枷鎖等待隊(duì)列為空的過(guò)程中,如果本機(jī)使用該服務(wù)的進(jìn)程 對(duì)該key值提出更新請(qǐng)求,則覆蓋前一個(gè)對(duì)同Key值的更新請(qǐng)求,作為一種壓縮性的處理。 當(dāng)某個(gè)Key值需要被某節(jié)點(diǎn)讀取時(shí),也需要使用加鎖數(shù)據(jù),這樣不會(huì)讀到在某條數(shù)據(jù)更新 過(guò)程中的臟數(shù)據(jù),該方法保證了個(gè)節(jié)點(diǎn)同一個(gè)Key值按并發(fā)的順序性出現(xiàn)。
圖3圖4給出了所述的邏輯時(shí)戳與KDC互斥機(jī)制原理示意圖。本發(fā)明中消息傳遞 使用邏輯時(shí)間戳,分布式系統(tǒng)沒(méi)有內(nèi)在統(tǒng)一時(shí)鐘,本方案采用Lamport邏輯時(shí)鐘生成的邏 輯時(shí)鐘作為內(nèi)部時(shí)鐘,即每個(gè)進(jìn)程Pi都有一個(gè)邏輯時(shí)鐘Lci >0,且非減的整數(shù)序列,(m, Lci, i)Lci的更新基于以下規(guī)則 規(guī)則1 :在發(fā)生一個(gè)事件之前,我們更新Lei :lci = lci+d(d > 0) 規(guī)則2 :當(dāng)收到一個(gè)帶時(shí)戳的消息時(shí),Pi執(zhí)行更新Lci = max(Lci, LCj) + 假設(shè)每個(gè)lci初始化為INIT > O,對(duì)于不同的進(jìn)程可以有不同的初始化值
Lamport邏輯時(shí)鐘給出了一種分布式系統(tǒng)中所有事件分配時(shí)間的方法,它遵循下面規(guī)則 (a):若在同一進(jìn)程中a在b之前發(fā)生,則C(a) <C(b)。 (b):若a和b分別代表發(fā)送一個(gè)消息和接收該消息的事件則C(a) < C(b)。 (c):對(duì)于所有不同的事件a和b, C(a) # C(b)。 圖4說(shuō)明了 PI具有較小邏輯時(shí)戳先獲得鎖 這個(gè)算法提供了一種對(duì)系統(tǒng)中所有的事件進(jìn)行完全的排序的方法,對(duì)比各主機(jī)物 理時(shí)鐘,該算法使用因果關(guān)系產(chǎn)生時(shí)鐘,如圖4所示。為實(shí)現(xiàn)整個(gè)分布式系統(tǒng)中對(duì)指定Key 值數(shù)據(jù)的互斥訪(fǎng)問(wèn),任何一個(gè)進(jìn)程在修改某Key的數(shù)據(jù)前都需要通過(guò)消息先向系統(tǒng)中的其 他主機(jī)請(qǐng)求該KEY的鎖,收到該節(jié)點(diǎn)請(qǐng)求的節(jié)點(diǎn),會(huì)根據(jù)自己的狀態(tài)來(lái)決定是否立即給予 應(yīng)答它,若自己沒(méi)有邏輯時(shí)間戳比收到的這個(gè)請(qǐng)求更早的未決請(qǐng)求,就立即回應(yīng),若自己有 邏輯時(shí)間戳比收到的這個(gè)請(qǐng)求更早的請(qǐng)求(即未決請(qǐng)求),則就將對(duì)方的請(qǐng)求放入本地的 請(qǐng)求隊(duì)列;只有收齊了其他所有主機(jī)的回應(yīng)才可以獲得鎖。只有獲得鎖的進(jìn)程才可以對(duì)其 內(nèi)容進(jìn)行修改。當(dāng)多個(gè)進(jìn)程請(qǐng)求鎖時(shí),依照?qǐng)D4所示原理確定給鎖的先后順序
圖中箭頭方向代表發(fā)送請(qǐng)求鎖的報(bào)文的方向,箭頭上的數(shù)字代表請(qǐng)求的邏輯時(shí) 戳,方框代表分布式進(jìn)程。在PI和P2幾乎同時(shí)發(fā)出加鎖請(qǐng)求時(shí)因?yàn)镻I發(fā)出時(shí)的邏輯時(shí)戳 比P2的小,所以PI首先獲得鎖,在PI釋放鎖后,P2才會(huì)獲得鎖。 圖5是本發(fā)明的一個(gè)實(shí)施例。當(dāng)hostl上的進(jìn)程1需要修改KEY的數(shù)據(jù)時(shí),它直 接調(diào)用客戶(hù)端庫(kù)LibKdc的Modify函數(shù),該函數(shù)指定要修改的Key值和對(duì)應(yīng)的數(shù)據(jù),Modify 函數(shù)先將分布式鎖的請(qǐng)求報(bào)文發(fā)到本地的KDC,本地KDC收到請(qǐng)求后將該請(qǐng)求發(fā)送到系統(tǒng) 中的其它主機(jī),當(dāng)其它主機(jī)收到加鎖請(qǐng)求報(bào)文后根據(jù)上訴算法選擇立即回復(fù)或者稍后回 復(fù),當(dāng)hostl上的KDC收齊了其他主機(jī)的回應(yīng),它就向客戶(hù)端進(jìn)程發(fā)送加鎖成功報(bào)文,當(dāng)客 戶(hù)端收到加鎖成功報(bào)文后就將數(shù)據(jù)部分發(fā)到本地KDC服務(wù)進(jìn)程中,當(dāng)本地KDC向其他主機(jī)發(fā)送完刷新數(shù)據(jù)后修改本地BDB數(shù)據(jù)庫(kù),本地KDC通知本地客戶(hù)端鎖已經(jīng)釋放,其修改操作 完成。步驟如圖5所示。為了保存自己本地的未決的請(qǐng)求和其他主機(jī)發(fā)來(lái)的自己暫時(shí)未回 應(yīng)的請(qǐng)求,KDC設(shè)計(jì)了一個(gè)請(qǐng)求隊(duì)列,該隊(duì)列以KEY為索引來(lái)存儲(chǔ)針對(duì)它的請(qǐng)求,我們?cè)O(shè)計(jì) 了變量m即〈W0RD, list〈tagReqLock》m即RequestList,即以第一項(xiàng)Key的索引,第二項(xiàng)請(qǐng) 求信息〉來(lái)保存請(qǐng)求隊(duì)列。 當(dāng)KDC向當(dāng)前系統(tǒng)中活動(dòng)的其它節(jié)點(diǎn)發(fā)送加鎖請(qǐng)求時(shí),它每向一個(gè)節(jié)點(diǎn)發(fā)送請(qǐng)求 它都期待從該節(jié)點(diǎn)得到答復(fù),只有收到了所有的答復(fù)它才能獲得鎖,因此,我們需要記錄它 都向哪些主機(jī)節(jié)點(diǎn)發(fā)送了請(qǐng)求并等待這些節(jié)點(diǎn)的回復(fù)(因?yàn)橄到y(tǒng)中的節(jié)點(diǎn)可能加入也可能 退出,所以?xún)H僅參照活動(dòng)節(jié)點(diǎn)列表是不夠的),為此,我們?cè)O(shè)計(jì)了期望請(qǐng)求隊(duì)列map〈string, list〈WORD》mapExpR印lyList ;〃〈logic_stamp, list〈host_num》,這個(gè)映射的第一項(xiàng)是一 個(gè)字符串表示超過(guò)一個(gè)長(zhǎng)整型的大整數(shù)的邏輯時(shí)戳需要說(shuō)明的是為滿(mǎn)足長(zhǎng)時(shí)間工作的需要, 標(biāo)準(zhǔn)的4字節(jié)長(zhǎng)整形可能不滿(mǎn)足要求,所以需要有位數(shù)更長(zhǎng)的大整數(shù)來(lái)進(jìn)行表示;第二項(xiàng)是 期望回復(fù)的主機(jī)列表,邏輯時(shí)戳可以唯一標(biāo)志一個(gè)本地請(qǐng)求,每個(gè)本地請(qǐng)求都有一個(gè)期望回 復(fù)隊(duì)列,這個(gè)隊(duì)列在請(qǐng)求發(fā)送到其它節(jié)點(diǎn)時(shí)添加,每成功地將加鎖請(qǐng)求發(fā)向一個(gè)主機(jī)就將這 個(gè)主機(jī)的主機(jī)號(hào)添加到這個(gè)對(duì)應(yīng)的list中去,這樣,當(dāng)發(fā)送完后,list中有幾項(xiàng)數(shù)據(jù)就等于 一共向幾個(gè)主機(jī)發(fā)送了請(qǐng)求。當(dāng)發(fā)送請(qǐng)求的KDC收到了某主機(jī)的回應(yīng)的時(shí)候,就將回應(yīng)主機(jī) 的主機(jī)號(hào)從這個(gè)期望列表中刪除。總之,期望列表中存放的是期望從其得到回應(yīng)的主機(jī)號(hào),得 到回應(yīng)后就將其刪除??芍?,當(dāng)list為空的時(shí)候就說(shuō)明收齊了回應(yīng)。此時(shí)若該請(qǐng)求在本地一 收集完回應(yīng)的同Key值請(qǐng)求中邏輯時(shí)鐘最小,即判定獲得鎖。 需要說(shuō)明的是圖1中KDC系統(tǒng)中各部分之間的聯(lián)系,在本方案中網(wǎng)絡(luò)通信是聯(lián) 系LibKdc和KDC、 KDC和KDC之間的紐帶,所有的交互信息都是通過(guò)socket網(wǎng)絡(luò)通信實(shí) 現(xiàn)的,例如所述的LibKdc與KDC,這兩類(lèi)軟件均在一臺(tái)主機(jī)上運(yùn)行,可選的IPC通信方 案很多,為了更好地實(shí)現(xiàn)跨平臺(tái)的特性,本方案選用的是所謂的主機(jī)loopback IP地址 "127. 0. 0. 1 ",協(xié)議為T(mén)CP協(xié)議。我們采用了雙TCP連接策略,即在LibKdc與KDC之間存在 兩條TCP連接, 一條是數(shù)據(jù)端連接,主要是用來(lái)傳輸需要刷新的數(shù)據(jù),另一條是控制連接, 用來(lái)交互控制報(bào)文。KDC作為服務(wù)端在一個(gè)固定端口上偵聽(tīng);LibKdc接這個(gè)端口。 KDC中 核心互斥算法設(shè)計(jì)采用一個(gè)單線(xiàn)程程序,內(nèi)部使用select多路復(fù)用機(jī)制,LibKdc與KDC的 通信部分中接收模塊為一個(gè)線(xiàn)程,該線(xiàn)程中一樣使用select多路復(fù)用機(jī)制。TCP協(xié)議通信 的任何一端退出時(shí),另一端調(diào)用recv會(huì)返回小于或等于零,在本方案中使用這一技術(shù)作為 雙方判斷對(duì)方是否退出的依據(jù),并決定響應(yīng)動(dòng)作。當(dāng)KDC發(fā)現(xiàn)LibKdc退出時(shí)將立即清除該 LibKdc的請(qǐng)求和訂閱等信息。關(guān)于KDC與KDC之間的聯(lián)系,KDC之間也設(shè)置了 TCP連接,也 有數(shù)據(jù)端連接和控制端連接,其分工與上面一樣;這兩個(gè)連接的FD都在一個(gè)線(xiàn)程里,其內(nèi) 部使用select多路復(fù)用機(jī)制。此外,每?jī)蓚€(gè)KDC之間都還有一個(gè)用于數(shù)據(jù)刷新的TCP連接, 這個(gè)連接運(yùn)行在一個(gè)獨(dú)立線(xiàn)程中,為的是避免因刷新的數(shù)據(jù)可能比較大而影響控制信息的 發(fā)送。另外,KDC之間還有心跳報(bào)文的廣播,目的是讓其他KDC知道彼此的一些重要的信息, 同時(shí)也可以在對(duì)方假死或者對(duì)方網(wǎng)線(xiàn)被拔掉時(shí)作為判定該主機(jī)退出的判斷依據(jù)。
圖6是本發(fā)明所述的KDC版本同步實(shí)施例。在實(shí)踐中存在這樣一類(lèi)節(jié)點(diǎn),在獲得 鎖的節(jié)點(diǎn)更新某個(gè)KEY值時(shí),如果這個(gè)節(jié)點(diǎn)沒(méi)有啟動(dòng)或節(jié)點(diǎn)故障,在更新操作執(zhí)行以后該 節(jié)點(diǎn)恢復(fù)運(yùn)行,但此后這個(gè)KEY的信息在系統(tǒng)中再無(wú)節(jié)點(diǎn)提出更新請(qǐng)求并進(jìn)行更新,這個(gè)節(jié)點(diǎn)該KEY的數(shù)據(jù)將長(zhǎng)時(shí)間處于低版本,本發(fā)明設(shè)計(jì)一種使數(shù)據(jù)版本一致的方法。每個(gè)節(jié) 點(diǎn)都廣播自己的KEY及其版本號(hào),當(dāng)最后一次對(duì)這個(gè)KEY值刷新的節(jié)點(diǎn)KDC發(fā)現(xiàn)系統(tǒng)中存 在某些節(jié)點(diǎn)的版本號(hào)過(guò)低且持續(xù)了一段時(shí)間,它就會(huì)申請(qǐng)去同步這個(gè)低版本的數(shù)據(jù),當(dāng)然, 它也需要經(jīng)過(guò)申請(qǐng)鎖、刷新舊版本節(jié)點(diǎn)、釋放鎖這幾個(gè)步驟。 每個(gè)節(jié)點(diǎn)內(nèi)部維護(hù)了兩個(gè)列表。當(dāng)前系統(tǒng)最大版本號(hào)列表m—LastVersionSys,為 map〈unsigned short, KeyVersionStampConst>禾口本機(jī)本地片反本號(hào)歹廿表m_LocalVersion為 m即〈unsigned short, largeint〉。系統(tǒng)最大版本號(hào)列表用于判斷哪些節(jié)點(diǎn)屬于舊版本節(jié) 點(diǎn),以便在發(fā)起版本同步時(shí)向其發(fā)送更新數(shù)據(jù),本機(jī)本地版本號(hào)列表用于在心跳中發(fā)送本 機(jī)版本信息。m—LastVersionSys和m—LocalVersion內(nèi)對(duì)應(yīng)KEY值的版本號(hào)不一定相等,當(dāng) 且僅當(dāng)最新版本由本地刷新時(shí)相等。 版本號(hào)由一個(gè)字符串存儲(chǔ)的大數(shù)表示,在系統(tǒng)最初啟動(dòng)時(shí),系統(tǒng)內(nèi)部所有KEY值 對(duì)應(yīng)的數(shù)據(jù)的版本號(hào)均為0。在部分節(jié)點(diǎn)關(guān)閉重后時(shí),需要從數(shù)據(jù)庫(kù)中讀取各個(gè)KEY值的版 本號(hào)。版本號(hào)增長(zhǎng)的一般情況為某節(jié)點(diǎn)收到來(lái)自客戶(hù)端對(duì)某KEY值的數(shù)據(jù)刷新請(qǐng)求,在得 到鎖之后,將客戶(hù)端的刷新數(shù)據(jù)向其他節(jié)點(diǎn)發(fā)送,然后刷新本節(jié)點(diǎn)的數(shù)據(jù)庫(kù),并相應(yīng)將本地 數(shù)據(jù)庫(kù)的對(duì)應(yīng)KEY值的版本號(hào)加1。實(shí)際情況下,有部分節(jié)點(diǎn)刷新該版本的數(shù)據(jù)可能沒(méi)有成 功。或者在某個(gè)時(shí)刻部分節(jié)點(diǎn)已經(jīng)被關(guān)閉,在它們重新啟動(dòng)之后,數(shù)據(jù)需要和系統(tǒng)內(nèi)的其他 節(jié)點(diǎn)保持一致性。為了達(dá)到這個(gè)目的,系統(tǒng)采用了心跳報(bào)文廣播節(jié)點(diǎn)KEY值和其對(duì)應(yīng)版本 號(hào)和主動(dòng)版本同步兩種機(jī)制來(lái)共同保證一致性。 另外在運(yùn)行中需要注意的是系統(tǒng)初始化。KDC運(yùn)行之初的狀態(tài)我們稱(chēng)為初始化階 段,在系統(tǒng)初始化階段,本發(fā)明設(shè)計(jì)為從起始到穩(wěn)定需要以下過(guò)程只有最后處于穩(wěn)定狀態(tài) 的KDC才可以為客戶(hù)端提供服務(wù),沒(méi)有處于穩(wěn)定狀態(tài)的KDC只能收發(fā)心跳包,而不能證實(shí)作 為節(jié)點(diǎn)加入數(shù)據(jù)一致的工作。KDC節(jié)點(diǎn)初始化時(shí)只可能在下面兩種情況下達(dá)到穩(wěn)定狀態(tài)A 收到了另外一個(gè)已經(jīng)處于穩(wěn)定狀態(tài)的節(jié)點(diǎn)發(fā)來(lái)的心跳報(bào)文,或者,B自己已經(jīng)運(yùn)行了配置文 件中設(shè)置的最長(zhǎng)初始化時(shí)間。要達(dá)到穩(wěn)定狀態(tài)目的是讓自己的邏輯時(shí)戳與系統(tǒng)中的邏輯時(shí) 戳同步,以免一個(gè)剛剛加進(jìn)來(lái)的節(jié)點(diǎn)突然發(fā)送一個(gè)邏輯時(shí)鐘很小的請(qǐng)求。設(shè)置最大初始化 時(shí)間的目的是存在這樣一種情況系統(tǒng)中只有一臺(tái)KDC在運(yùn)行時(shí),它收不到心跳報(bào)文,它需 要經(jīng)過(guò)一個(gè)初始化時(shí)間以后才能夠穩(wěn)定。
權(quán)利要求
ATC系統(tǒng)中一種實(shí)現(xiàn)多機(jī)關(guān)鍵數(shù)據(jù)一致性功能的方法,包括在ATC分布式系統(tǒng)中的每臺(tái)主機(jī)都運(yùn)行數(shù)據(jù)一致性服務(wù)端跨平臺(tái)軟件(簡(jiǎn)稱(chēng)KDC),所述KDC提供了編程接口LibKDC庫(kù),每個(gè)需要使用關(guān)鍵數(shù)據(jù)一致性功能的應(yīng)用進(jìn)程都需要使用這個(gè)接口庫(kù),作為KDC的客戶(hù)端,并按照接口要求提供進(jìn)程號(hào);其特征是(1)當(dāng)一個(gè)使用編程接口LibKDC的進(jìn)程需要修改某個(gè)Key值的信息時(shí),需要向數(shù)據(jù)一致性服務(wù)端KDC程序發(fā)出加鎖請(qǐng)求;(2)數(shù)據(jù)一致性服務(wù)端KDC向其他主機(jī)的KDC通過(guò)消息機(jī)制進(jìn)行詢(xún)問(wèn);(3)當(dāng)確認(rèn)加鎖成功后,需要將該數(shù)據(jù)向其他主機(jī)同步,最后修改本地?cái)?shù)據(jù)庫(kù);(4)完成后進(jìn)程發(fā)出鎖使用完畢的報(bào)文,數(shù)據(jù)一致性服務(wù)端KDC對(duì)還在等待進(jìn)行鎖請(qǐng)求回應(yīng)的主機(jī)發(fā)出批準(zhǔn)報(bào)文,這樣其他進(jìn)程也可以訪(fǎng)問(wèn)該Key的數(shù)據(jù);(5)收到更新數(shù)據(jù)的數(shù)據(jù)一致性服務(wù)端KDC修改本地?cái)?shù)據(jù);(6)在更新數(shù)據(jù)以后,查詢(xún)對(duì)該Key值發(fā)起過(guò)訂閱的進(jìn)程,對(duì)這些進(jìn)程發(fā)出通知指令;(7)進(jìn)程收到該指令后,可以立即讀取該Key值的數(shù)據(jù)。
2. 根據(jù)權(quán)利要求1所述的ATC系統(tǒng)中一種實(shí)現(xiàn)多機(jī)關(guān)鍵數(shù)據(jù)一致功能性的方法,其特 征是,所述的加鎖請(qǐng)求與更新數(shù)據(jù)的步驟如下(2. 1)運(yùn)行開(kāi)始,數(shù)據(jù)一致性服務(wù)端KDC收到客戶(hù)端請(qǐng)求,對(duì)系統(tǒng)中除了本機(jī)外的活躍節(jié)點(diǎn)發(fā)出加鎖請(qǐng)求,并形成回應(yīng)等待隊(duì)列;(2. 2)暫時(shí)沒(méi)有獲得鎖但又收到本機(jī)任意客戶(hù)端對(duì)同一Key的請(qǐng)求,覆蓋原請(qǐng)求; (2.3)詢(xún)問(wèn)收到鎖請(qǐng)求,其邏輯時(shí)戳比本地等待中的最小的時(shí)戳要小嗎?如果是,對(duì)加鎖請(qǐng)求發(fā)出加鎖回應(yīng)報(bào)文,如果回答不是,對(duì)該請(qǐng)求暫時(shí)放入隊(duì)列中; (2. 4)接收加鎖回應(yīng)報(bào)文,并在期待列表中去掉報(bào)文發(fā)出節(jié)點(diǎn); (2.5)再次詢(xún)問(wèn)是否該鎖的期待回應(yīng)為空?如果回答不是,則返回(2.2)步; (2. 6)如果回答是,則使用最新的對(duì)Key對(duì)應(yīng)的Value值對(duì)數(shù)據(jù)進(jìn)行修改,并傳遞到其它主機(jī);(2. 7)檢查發(fā)向本地的請(qǐng)求鎖隊(duì)列中邏輯時(shí)戳最小的請(qǐng)求,對(duì)其發(fā)出加鎖回應(yīng); (2. 8)運(yùn)行結(jié)束。
全文摘要
本發(fā)明提供了ATC系統(tǒng)中實(shí)現(xiàn)多機(jī)關(guān)鍵數(shù)據(jù)一致性功能的方法。利用加鎖機(jī)制避免多個(gè)主機(jī)多個(gè)進(jìn)程并行對(duì)數(shù)據(jù)進(jìn)行修改,加鎖機(jī)制按每個(gè)Key值為粒度,需要對(duì)除本機(jī)節(jié)點(diǎn)外的其他主機(jī)發(fā)出加鎖請(qǐng)求,發(fā)出請(qǐng)求前形成等待隊(duì)列,請(qǐng)求帶有邏輯時(shí)戳,各節(jié)點(diǎn)對(duì)收到的來(lái)自其他主機(jī)的加鎖請(qǐng)求進(jìn)行比較以決定是否發(fā)出請(qǐng)求回應(yīng);發(fā)出加鎖請(qǐng)求的節(jié)點(diǎn)在檢查到等待隊(duì)列為空時(shí),認(rèn)為自己已經(jīng)獲得鎖并開(kāi)始分發(fā)數(shù)據(jù)。在等待加鎖等待隊(duì)列為空的過(guò)程中,如果本機(jī)使用該服務(wù)的進(jìn)程對(duì)該key值提出更新請(qǐng)求,則覆蓋前一個(gè)對(duì)同Key值的更新請(qǐng)求,作為一種壓縮性的處理。當(dāng)某個(gè)Key值需要被某節(jié)點(diǎn)讀取時(shí),也需要使用加鎖數(shù)據(jù),這樣不會(huì)讀到在某條數(shù)據(jù)更新中的臟數(shù)據(jù),保證了各節(jié)點(diǎn)同一個(gè)Key值按并發(fā)順序性出現(xiàn)。
文檔編號(hào)G06F9/46GK101751292SQ20091021667
公開(kāi)日2010年6月23日 申請(qǐng)日期2009年12月10日 優(yōu)先權(quán)日2009年12月10日
發(fā)明者劉舒, 楊誠(chéng), 楊錚, 肖啟戰(zhàn), 胡術(shù) 申請(qǐng)人:四川川大智勝軟件股份有限公司
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
鱼台县| 塘沽区| 霍林郭勒市| 平邑县| 潜江市| 尚义县| 天气| 元朗区| 建昌县| 金坛市| 博爱县| 洪江市| 蒙自县| 太白县| 定日县| 萨迦县| 梅河口市| 迭部县| 丹巴县| 肥乡县| 闽清县| 新宾| 天门市| 忻城县| 阿克苏市| 昔阳县| 漠河县| 丹江口市| 丰顺县| 鲁甸县| 彩票| 青龙| 文昌市| 砚山县| 嘉定区| 武汉市| 屯昌县| 文水县| 同仁县| 江达县| 盐源县|