專(zhuān)利名稱(chēng):一種分布式實(shí)時(shí)數(shù)據(jù)復(fù)制同步方法
技術(shù)領(lǐng)域:
本發(fā)明屬于計(jì)算機(jī)應(yīng)用技術(shù)領(lǐng)域,涉及分布式實(shí)時(shí)數(shù)據(jù)的復(fù)制同步方法。
背景技術(shù):
在空中交通管制系統(tǒng)(ATC, Air Traffic Control system)、艦船管理系統(tǒng)(CMS, Combat Management System)等實(shí)時(shí)、重大使命系統(tǒng)(Real-time,mission-critical system)中,服務(wù)進(jìn)程一般采用冗余配置部署在多臺(tái)處理機(jī)上,多臺(tái)處理機(jī)上的相同進(jìn)程構(gòu)成一個(gè)集群(Cluster),同時(shí)只有一個(gè)處理機(jī)上的進(jìn)程為主態(tài),其它為從態(tài)。當(dāng)主態(tài)進(jìn)程所在處理機(jī)或主態(tài)進(jìn)程本身出現(xiàn)問(wèn)題,集群控制進(jìn)程將自動(dòng)選擇某個(gè)從態(tài)進(jìn)程切換到主態(tài)繼續(xù)運(yùn)行。如何保證多臺(tái)處理機(jī)上的主從進(jìn)程間數(shù)據(jù)的一致性和實(shí)時(shí)更新成為一個(gè)技術(shù)關(guān)鍵和難點(diǎn)。傳統(tǒng)的方法采用數(shù)據(jù)庫(kù)作為存儲(chǔ)介質(zhì),多臺(tái)處理機(jī)同時(shí)連接到數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)共享,但此方法存放兩個(gè)問(wèn)題(1)存在單點(diǎn)故障,如數(shù)據(jù)庫(kù)宕機(jī),則整個(gè)系統(tǒng)將不可用;(2)實(shí)時(shí)性不高,無(wú)法滿足ATC等實(shí)時(shí)、重大使命系統(tǒng)的要求。另外也存在采用基于事務(wù)處理的數(shù)據(jù)同步的方法,但在處理機(jī)很多且同步數(shù)據(jù)量大的情況下,其實(shí)時(shí)性受到很大影響,基本上不能滿足數(shù)據(jù)的一致性和實(shí)時(shí)更新的要求。
發(fā)明內(nèi)容
本發(fā)明的目的是針對(duì)現(xiàn)有技術(shù)的不足,提出一種分布式實(shí)時(shí)數(shù)據(jù)復(fù)制同步方法,簡(jiǎn)稱(chēng)DDR方法。本方法不釆用數(shù)據(jù)庫(kù)作為存儲(chǔ)介質(zhì),不存在因數(shù)據(jù)庫(kù)宕機(jī)造成整個(gè)系統(tǒng)不能使用的情況,同時(shí),提高了數(shù)據(jù)傳輸?shù)膶?shí)時(shí)性和可靠性,滿足ATC、 CMS等實(shí)時(shí)、重大使命系統(tǒng)中的實(shí)時(shí)數(shù)據(jù)同步復(fù)制需要,保持主從進(jìn)程間數(shù)據(jù)的一致性,進(jìn)而提高整個(gè)系統(tǒng)運(yùn)行的可靠性、可用性。
本發(fā)明的目的是這樣達(dá)到在需保持?jǐn)?shù)據(jù)同步的每臺(tái)處理機(jī)上運(yùn)行一個(gè)實(shí)時(shí)數(shù)據(jù)同步進(jìn)程,簡(jiǎn)稱(chēng)DDR進(jìn)程,每個(gè)DDR進(jìn)程中保存和維持與其它處理機(jī)上的DDR進(jìn)程相同的數(shù)據(jù)拷貝。同時(shí),提供一個(gè)函數(shù)接口庫(kù),簡(jiǎn)稱(chēng)DDR接口庫(kù),用于應(yīng)用程序與數(shù)據(jù)同步進(jìn)程DDR進(jìn)行數(shù)據(jù)交互。為提高DDR進(jìn)程與DDR接口庫(kù)數(shù)據(jù)存取的性能,將DDR進(jìn)程管理的數(shù)據(jù)存放在操作系統(tǒng)提供的共享內(nèi)存(ShareMemory)中。DDR進(jìn)程管理的數(shù)據(jù)以條為單位,每條數(shù)據(jù)的空間大小固定為N字節(jié),共M條數(shù)據(jù)記錄,存儲(chǔ)在一塊連續(xù)的MXN字節(jié)大小的共享內(nèi)存中,每一條數(shù)據(jù)內(nèi)容均包括該數(shù)據(jù)的邏輯時(shí)間LTS、更新的應(yīng)用程序編號(hào)UID和用戶數(shù)據(jù)USER DATA三部分,其中應(yīng)用程序編號(hào)UID由處理機(jī)編號(hào)和應(yīng)用程序的進(jìn)程號(hào)PID組成,保持唯一性。每個(gè)DDR進(jìn)程會(huì)定期廣播心跳信息給其它DDR進(jìn)程,以保證在每個(gè)DDR進(jìn)程中維持所有正常運(yùn)行的DDR進(jìn)程的IP地址列表和當(dāng)前的主態(tài)DDR進(jìn)程編號(hào)。整個(gè)DDR進(jìn)程組中只能有一個(gè)主態(tài)DDR進(jìn)程,如果判斷出現(xiàn)2個(gè)以上主態(tài)或無(wú)主態(tài)進(jìn)程時(shí),將啟動(dòng)主態(tài)選舉算法選舉一個(gè)IP地址最小的處理機(jī)上的DDR進(jìn)程為主態(tài),其余均為從態(tài);數(shù)據(jù)復(fù)制步驟包括實(shí)時(shí)數(shù)據(jù)同步進(jìn)程DDR初始化;主態(tài)選舉;數(shù)據(jù)一致性周期性檢査;數(shù)據(jù)更新;數(shù)據(jù)更新通知;數(shù)據(jù)更新沖突解決;數(shù)據(jù)讀取和DDR進(jìn)程退出幾個(gè)部分,其中數(shù)據(jù)讀取是應(yīng)用程序通過(guò)DDR接口庫(kù)直接從本地共享內(nèi)存中讀取某條數(shù)據(jù),不產(chǎn)生網(wǎng)絡(luò)訪問(wèn)。數(shù)據(jù)復(fù)制步驟的具體過(guò)程是
(1) 實(shí)時(shí)數(shù)據(jù)同步進(jìn)程DDR初始化
a) 程序啟動(dòng),初始化共享內(nèi)存數(shù)據(jù)區(qū),
b) 將進(jìn)程的主從狀態(tài)置為從態(tài)狀態(tài),
c) DDR進(jìn)程啟動(dòng)成功后,周期性向其它DDR進(jìn)程廣播心跳信息HBM,
d) 接收其它DDR進(jìn)程心跳信息HBM,并更新本地活動(dòng)列表,如超過(guò)規(guī)定時(shí)間未收到某個(gè)的心跳消息HBM消息,則在活動(dòng)列表中刪除該進(jìn)程的相應(yīng)信息。
(2) 主態(tài)選舉
a) 主態(tài)DDR進(jìn)程選舉算法:若從態(tài)DDR進(jìn)程收到主DDR進(jìn)程將退出消息MDM消息或超過(guò)規(guī)定時(shí)間未收到數(shù)據(jù)一致性檢查消息MCM消息,則認(rèn)為主態(tài)進(jìn)程已不能正常工作,根據(jù)本地活動(dòng)DDR進(jìn)程列表檢査本進(jìn)程所在處理機(jī)的IP地址是否最小,判斷本進(jìn)程是否應(yīng)切換到主態(tài),如需切換到主態(tài),則廣播發(fā)送主DDR進(jìn)程存活消息MEM消息,同時(shí)將本機(jī)DDR進(jìn)程切換為主態(tài)。
b) 多主態(tài)DDR進(jìn)程沖突解決算法若主態(tài)DDR進(jìn)程收到數(shù)據(jù)一致性檢査消息MCM消息或主態(tài)DDR進(jìn)程存活消息MEM,則認(rèn)為存在多個(gè)主態(tài),因此用本機(jī)IP地址和收到的MCM消息的IP地址比較若本機(jī)IP較大,則認(rèn)為有其它DDR進(jìn)程
8更適合主態(tài),將本機(jī)DDR進(jìn)程切換為從態(tài);若本機(jī)IP較小,則發(fā)送MEM消息給 相應(yīng)DDR進(jìn)程,其它主態(tài)DDR進(jìn)程作同樣判斷。
(3) 數(shù)據(jù)一致性周期性檢査
主態(tài)DDR進(jìn)程定期廣播發(fā)送數(shù)據(jù)一致性檢査消息MCM, MCM消息中包含主態(tài) DDR進(jìn)程的每條數(shù)據(jù)的LTS和UID字段,DDR進(jìn)程收到MCM消息后將作以下處理
a) 主態(tài)DDR進(jìn)程收到MCM消息,則知道出現(xiàn)多個(gè)主態(tài),則啟動(dòng)第(2)步中 的多主態(tài)DDR進(jìn)程沖突解決,從而保證只有一個(gè)主態(tài)進(jìn)程。
b) 每個(gè)從態(tài)DDR進(jìn)程收到MCM消息,則根據(jù)MCM消息中內(nèi)容逐條與本地?cái)?shù) 據(jù)的LTS和UID比較。
如果MCM消息中的該條記錄的LTS值較大,說(shuō)明主態(tài)DDR進(jìn)程的數(shù)據(jù)為較新 版本,向主態(tài)DDR進(jìn)程發(fā)送數(shù)據(jù)重傳消息RDM,請(qǐng)求主態(tài)重傳該條數(shù)據(jù),主態(tài)DDR 進(jìn)程收到RDM消息后,用數(shù)據(jù)重傳應(yīng)答消息RRM,廣播該條數(shù)據(jù)的最新版本數(shù)據(jù)。
如果MCM消息中的該條記錄的LTS值較小,則主態(tài)DDR進(jìn)程的數(shù)據(jù)為舊版本, 從態(tài)DDR進(jìn)程發(fā)送RRM消息給主態(tài)DDR進(jìn)程,以更新該條數(shù)據(jù)。
如果MCM消息中的該條記錄與本地記錄的LTS值相等,但是兩者UID值不相 等,說(shuō)明存在數(shù)據(jù)沖突且還未被應(yīng)用程序解決,向主態(tài)DDR進(jìn)程發(fā)送RDM消息, 請(qǐng)求主態(tài)重傳該條數(shù)據(jù),
主態(tài)DDR進(jìn)程收到RDM消息后,用RRM消息廣播該條數(shù)據(jù)的最新版本數(shù)據(jù)。
如果MCM消息中的該條記錄與本地記錄的LTS值和UID值均相等,說(shuō)明兩者 數(shù)據(jù)版本一致,不作任何處理。
(4) 數(shù)據(jù)更新
a) 當(dāng)應(yīng)用程序需更新某條數(shù)據(jù)時(shí),調(diào)用DDR接口庫(kù)的提供的更新函數(shù)將更 新數(shù)據(jù)發(fā)送給本地DDR進(jìn)程,本地DDR進(jìn)程采用以下算法更新數(shù)據(jù)
i) 將該條數(shù)據(jù)的LTS加l, UID更新為調(diào)用進(jìn)程的UID,更新本地的數(shù)據(jù);
ii) 向其它DDR進(jìn)程廣播發(fā)送數(shù)據(jù)更新UDM消息,以更新該條數(shù)據(jù);
b) DDR進(jìn)程接收到數(shù)據(jù)更新消息UDM按以下算法處理
i) 如UDM消息中該條數(shù)據(jù)的LTS值小于本地該條數(shù)據(jù)的LTS值,說(shuō)明本地 數(shù)據(jù)較新,不做處理;
ii) 如UDM消息中該條數(shù)據(jù)的LTS值大于本地該條數(shù)據(jù)的LTS值,則用UDM中的數(shù)據(jù)更新本地?cái)?shù)據(jù),包括LTS和UID字段;
iii) 如UDM消息中該條數(shù)據(jù)的LTS值等于本地該條數(shù)據(jù)的LTS值,但UID 值不相等,說(shuō)明產(chǎn)生數(shù)據(jù)更新沖突,按第(6)步"數(shù)據(jù)更新沖突解決算法"解 決沖突,并記錄詳細(xì)的日志;
iv) 其它情況,則不做處理;
c) DDR進(jìn)程接收到數(shù)據(jù)重傳應(yīng)答消息RRM按以下算法處理
i) 如RRM消息中該條數(shù)據(jù)的LTS值小于本地該條數(shù)據(jù)的LTS值,說(shuō)明本 地?cái)?shù)據(jù)較新,不做處理;
ii) 如RRM消息中該條數(shù)據(jù)的LTS值大于本地該條數(shù)據(jù)的LTS值,則用RRM 中的數(shù)據(jù)更新本地?cái)?shù)據(jù),包括LTS和UID字段;
iii) 如RRM消息中該條數(shù)據(jù)的LTS值等于本地該條數(shù)據(jù)的LTS值,但UID 值不相等,說(shuō)明產(chǎn)生數(shù)據(jù)更新沖突,按第(6)步"數(shù)據(jù)更新沖突解決算法"解 決沖突,并記錄詳細(xì)的日志。
(5) 數(shù)據(jù)更新通知接收到數(shù)據(jù)更新的DDR進(jìn)程發(fā)送數(shù)據(jù)更新通知消息給 本地DDR接口庫(kù),應(yīng)用程序通過(guò)定時(shí)輪詢或注冊(cè)回調(diào)函數(shù)方式獲得此通知消息。
(6) 數(shù)據(jù)更新沖突解決
當(dāng)DDR進(jìn)程收到UDM或RRM消息時(shí)并檢測(cè)到數(shù)據(jù)更新沖突時(shí)按下列方法進(jìn) 行處理
a) 將該條數(shù)據(jù)的本地?cái)?shù)據(jù)保存到?jīng)_突數(shù)據(jù)列表中;
b) 用收到的數(shù)據(jù)更新本地相應(yīng)數(shù)據(jù);
c) 向沖突數(shù)據(jù)中的數(shù)據(jù)更新消息UID對(duì)應(yīng)的DDR接口庫(kù)發(fā)送數(shù)據(jù)沖突通知 消息,由DDR接口庫(kù)對(duì)應(yīng)的本地應(yīng)用程序解決此沖突;
d) 向本地其它應(yīng)用程序的DDR接口庫(kù)發(fā)送數(shù)據(jù)更新通知。
(7) 數(shù)據(jù)讀取
應(yīng)用程序通過(guò)DDR接口庫(kù)直接從本地共享內(nèi)存中讀取某條數(shù)據(jù)。
(8) DDR進(jìn)程退出
處于主態(tài)的DDR進(jìn)程退出時(shí),廣播發(fā)送主DDR進(jìn)程將退出消息MDM消息。 本發(fā)明具有的積極效果是情況,且數(shù)據(jù) 讀取是應(yīng)用程序通過(guò)DDR接口庫(kù)直接從本地共享內(nèi)存中讀取,不產(chǎn)生網(wǎng)絡(luò)訪問(wèn), 數(shù)據(jù)更新快,實(shí)吋性高。
2、 數(shù)據(jù)分布在每臺(tái)處理機(jī)上,且保持一致,可靠性更高,特別適合于實(shí)時(shí)、 分布式、重大使命系統(tǒng)。
3、 本地儲(chǔ)存采用共享內(nèi)存方式,使本機(jī)多個(gè)應(yīng)用進(jìn)程間數(shù)據(jù)交換速度更快、 支持的應(yīng)用程序更多。共享內(nèi)存方式比本機(jī)文件共享、TCP/IP等方式效率更高。
圖1是以4臺(tái)處理機(jī)為例的分布式數(shù)據(jù)復(fù)制部署示意圖。 圖2是存儲(chǔ)在MXN大小共享存儲(chǔ)空間的數(shù)據(jù)結(jié)構(gòu)示意圖。
具體實(shí)施例方式
本分布式實(shí)時(shí)數(shù)據(jù)復(fù)制同步方法的過(guò)程即是實(shí)時(shí)數(shù)據(jù)同步進(jìn)程DDR進(jìn)程的 實(shí)施過(guò)程。
DDR進(jìn)程間用于數(shù)據(jù)交互的消息定義如下
HBM: Heartbeat Message, DDR進(jìn)程心跳消息,用于向其它DDR進(jìn)程周期性 報(bào)告本機(jī)DDR進(jìn)程的存活等狀態(tài)。HBM消息數(shù)據(jù)包括消息順序號(hào)、本機(jī)IP、消 息產(chǎn)生時(shí)間、主從狀態(tài)。
MCM: Master Check Message,數(shù)據(jù)一致性檢查消息,主DDR進(jìn)程定期廣播 的數(shù)據(jù)一致性檢査消息,便于其它DDR進(jìn)程檢査和更新數(shù)據(jù),以保持全局?jǐn)?shù)據(jù)一 致。MCM消息數(shù)據(jù)包括消息順序號(hào)、本機(jī)IP、消息產(chǎn)生時(shí)間、每條數(shù)據(jù)的邏輯 時(shí)間LTS和應(yīng)用程序編號(hào)UID字段等。
UDM: Update Data Message,數(shù)據(jù)更新消息,用于DDR進(jìn)程將數(shù)據(jù)更新情況 和更新的數(shù)據(jù)及時(shí)發(fā)送給其他的DDR進(jìn)程。UDM消息包括消息順序號(hào),本機(jī)IP 地址,消息產(chǎn)生時(shí)間,待更新數(shù)據(jù)的編號(hào)、邏輯時(shí)間LTS、應(yīng)用程序編號(hào)UID、 用戶數(shù)據(jù)user data等。
RDM: Retransmission Data Message,數(shù)據(jù)重傳消息,用于DDR進(jìn)程向某個(gè) DDR進(jìn)程請(qǐng)求重傳某條數(shù)據(jù);RDM消息數(shù)據(jù)包括消息順序號(hào)、本機(jī)IP地址、消 息產(chǎn)生時(shí)間、請(qǐng)求重傳數(shù)據(jù)的編號(hào)。
RRM: R印ly Retransmission Message,數(shù)據(jù)重傳應(yīng)答消息,用于對(duì)收到RDM消息后的應(yīng)答;RRM消息數(shù)據(jù)包括消息順序號(hào)、本機(jī)IP地址、消息產(chǎn)生時(shí)間、 重傳的數(shù)據(jù)條的編號(hào)、邏輯時(shí)間LTS、應(yīng)用程序編號(hào)UID、用戶數(shù)據(jù)user data head 禾口 user data。
MDM: Master Dead Message,主DDR進(jìn)程將退出消息,在DDR進(jìn)程將退出前 發(fā)送給其它DDR進(jìn)程,用于其它進(jìn)程啟動(dòng)主機(jī)選舉過(guò)程;MDM消息數(shù)據(jù)包括消 息順序號(hào)、本機(jī)IP地址、消息產(chǎn)生時(shí)間。
MEM: Master Exist Message, 主DDR進(jìn)程存活消息,用于解決同時(shí)存在多 個(gè)主DDR進(jìn)程的情況。MEM消息數(shù)據(jù)包括消息順序號(hào)、本機(jī)IP地址、消息產(chǎn) 生時(shí)間。
DDR接口庫(kù)的定義
應(yīng)用程序與數(shù)據(jù)同步進(jìn)程DDR進(jìn)行數(shù)據(jù)交互通過(guò)提供函數(shù)接口庫(kù)即DDR接口 庫(kù)方式完成。在DDR接口庫(kù)中有為應(yīng)用程序提供數(shù)據(jù)獲取、數(shù)據(jù)更新、定時(shí)輪詢 和注冊(cè)更新通知回調(diào)等接口函數(shù)。
DDR接口庫(kù)函數(shù)定義為
(1) 數(shù)據(jù)獲取函數(shù)定義為
int Get (int nddrNo, char承pUserdata, int nUserdataLength), 本函 數(shù)從本地共享內(nèi)存數(shù)據(jù)中取出第nddrNo條數(shù)據(jù)并將數(shù)據(jù)內(nèi)容放入pUserdata中, 數(shù)據(jù)最長(zhǎng)為nUserdataLength字節(jié)。應(yīng)用程序直接通過(guò)DDR接口庫(kù)從本地共享內(nèi) 存中讀取數(shù)據(jù),不產(chǎn)生網(wǎng)絡(luò)訪問(wèn),既可減少網(wǎng)絡(luò)開(kāi)銷(xiāo),又可提高數(shù)據(jù)讀取的實(shí)時(shí) 性。
(2) 數(shù)據(jù)更新函數(shù)定義為
irrt Set (irrt nddrNo, const char氺pUserdata, int nUserdataLength), 本函數(shù)將pUserdata中的數(shù)據(jù)更新到本地?cái)?shù)據(jù)拷貝中第nddrNo條數(shù)據(jù)中,數(shù)據(jù) 最長(zhǎng)為nUserdataLength字節(jié)0
(3) 定時(shí)輪詢函數(shù)定義為
intGetNotify (int * changedRecords),根據(jù)函數(shù)返回有多少條數(shù)據(jù)變化, 將變化數(shù)據(jù)的編號(hào)放入changedRecords數(shù)組中。應(yīng)用程序可根據(jù) changedRecords數(shù)組中的數(shù)據(jù)編號(hào)調(diào)用get函數(shù)取得具體的變化的數(shù)據(jù)。當(dāng)某 條數(shù)據(jù)發(fā)生變化時(shí),本地發(fā)送包含數(shù)據(jù)編號(hào)的通知消息到本地應(yīng)用程序的DDR接
12口庫(kù)的隊(duì)列中,應(yīng)用程序采用定時(shí)輪詢方式獲取變化的數(shù)據(jù)信息。 (4)注冊(cè)回調(diào)函數(shù)為 int RegisterNotifyCallback (void氺funcptr), funcptr為形如void func (int nRecordNo)函數(shù)指針,nRecordNo為變化的數(shù)據(jù)編號(hào)。當(dāng)有通知消息時(shí), DDR接口庫(kù)自動(dòng)調(diào)用應(yīng)用程序注冊(cè)的函數(shù)(funcptr)完成相應(yīng)的功能處理。 本實(shí)施例中數(shù)據(jù)復(fù)制的具體步驟是
(1) 實(shí)時(shí)數(shù)據(jù)同步進(jìn)程DDR初始化
a) 程序啟動(dòng),根據(jù)配置參數(shù),初始化共享內(nèi)存數(shù)據(jù)區(qū),
b) 將進(jìn)程的主從狀態(tài)置為從態(tài)狀態(tài),
c) DDR進(jìn)程啟動(dòng)成功后,以2秒鐘為周期向其它DDR進(jìn)程廣播心跳信息HBM,
d) 接收其它DDR進(jìn)程心跳信息HBM,并更新本地活動(dòng)列表,如超過(guò)規(guī)定的5 秒未收到某個(gè)的心跳消息朋M消息,則在活動(dòng)列表中刪除該進(jìn)程的相應(yīng)信息。
(2) 主態(tài)選舉
a) 主態(tài)DDR進(jìn)程選舉
若從態(tài)DDR進(jìn)程收到主DDR進(jìn)程將退出消息MDM消息或超過(guò)規(guī)定時(shí)間,一 般定為2.5 3秒,未收到數(shù)據(jù)一致性檢查消息MCM消息,則認(rèn)為主態(tài)進(jìn)程已不 能正常工作。因此DDR進(jìn)程檢査本機(jī)IP地址和本地活動(dòng)DDR進(jìn)程列表中最小IP 地址的關(guān)系
如果本機(jī)IP地址最小,則認(rèn)為本進(jìn)程應(yīng)切換到主態(tài),廣播發(fā)送主DDR進(jìn)程 存活消息MEM消息,同時(shí)將本機(jī)DDR進(jìn)程切換為主態(tài)。 如果本機(jī)IP地址不為最小,則不做任何處理。
b) 多主態(tài)DDR進(jìn)程沖突解決
若主態(tài)DDR進(jìn)程收到數(shù)據(jù)一致性檢查消息MCM消息或主態(tài)DDR進(jìn)程存活消 息MEM,則認(rèn)為存在多個(gè)主態(tài),因此用本機(jī)IP地址和收到的MCM消息的IP地址 比較若本機(jī)IP較大,則認(rèn)為有其它DDR進(jìn)程更適合主態(tài),將本機(jī)DDR進(jìn)程切 換為從態(tài);若本機(jī)IP較小,則發(fā)送MEM消息給相應(yīng)DDR進(jìn)程,其它主態(tài)DDR進(jìn) 程作同樣判斷。
(3)數(shù)據(jù)一致性周期性檢査主態(tài)DDR進(jìn)程定期1秒廣播發(fā)送數(shù)據(jù)一致性檢查消息MCM消息,MCM消息 中包含主態(tài)DDR進(jìn)程的每條數(shù)據(jù)的LTS和UID字段,DDR進(jìn)程收到MCM消息后將 作以下處理
a) 主態(tài)DDR進(jìn)程收到MCM消息,則知道出現(xiàn)多個(gè)主態(tài),啟動(dòng)第(2)步中 的多主態(tài)DDR進(jìn)程沖突解決,最后保證只有一個(gè)主態(tài)進(jìn)程。
b) 每個(gè)從態(tài)DDR進(jìn)程收到MCM消息,則根據(jù)MCM消息中內(nèi)容逐條與本地?cái)?shù) 據(jù)的LTS和UID比較。
如果LTS (MCM) > LTS (local record),則主態(tài)DDR進(jìn)程的該條記錄為 較新版本,向主態(tài)DDR進(jìn)程發(fā)送RDM消息,請(qǐng)求主態(tài)DDR進(jìn)程重傳該條數(shù)據(jù),主 態(tài)DDR進(jìn)程收到RDM消息后,隨機(jī)延遲0-50毫秒時(shí)間后,用RRM消息廣播該條 數(shù)據(jù)的最新版本數(shù)據(jù)。采用隨機(jī)延遲時(shí)間后發(fā)送RRM消息的目的是將可能收到的 多臺(tái)從態(tài)DDR進(jìn)程的RDM消息壓縮為一次RRM消息應(yīng)答,減少網(wǎng)絡(luò)流量及DDR進(jìn) 程處理時(shí)間。
如果LTS (MCM) < LTS (local record),則主態(tài)DDR進(jìn)程的數(shù)據(jù)為舊版 本,從態(tài)DDR進(jìn)程發(fā)送RRM消息給主態(tài)DDR進(jìn)程,以更新該條數(shù)據(jù)。
如果LTS (MCM) = LTS (local record),并且UID (MCM) ! = ■ (local record),說(shuō)明存在數(shù)據(jù)沖突,但還未被應(yīng)用程序解決,向主態(tài)DDR進(jìn)程發(fā)送RDM 消息,請(qǐng)求主態(tài)重傳該條數(shù)據(jù),主態(tài)DDR進(jìn)程收到RDM消息后,用RRM消息廣播 該條數(shù)據(jù)的最新版本數(shù)據(jù)。
如果LTS (MCM) = LTS (local record),并且UID (MCM) = UID (local record),說(shuō)明兩者數(shù)據(jù)版本一致,不作任何處理。 (4)數(shù)據(jù)更新
a)當(dāng)應(yīng)用程序需更新某條數(shù)據(jù)時(shí),調(diào)用DDR接口庫(kù)的數(shù)據(jù)更新Set函數(shù)將 待更新的數(shù)據(jù)發(fā)送給本地DDR進(jìn)程,本地DDR進(jìn)程采用以下算法更新數(shù)據(jù)
i )將該條數(shù)據(jù)的LTS加1, UID更新為調(diào)用進(jìn)程的UID,更新本地的數(shù)據(jù); ii)向其它DDR進(jìn)程廣播發(fā)送數(shù)據(jù)更新UDM消息;
b) DDR進(jìn)程接收到數(shù)據(jù)更新消息UDM或數(shù)據(jù)重傳應(yīng)答消息RRM消息按以下 算法處理i) 如LTS(UDM) 〈LTS(local record )或LTS (RRM) < LTS (local record), 不做處理;
ii) 如LTS(UDM) 〉 LTS (local record)或LTS (RRM) 〉 LTS (local record) 則用UDM或RRM中的數(shù)據(jù)更新本地對(duì)應(yīng)數(shù)據(jù),包括LTS和UID字段;
iii) 如LTS (UDM) = LTS (local record),并且UID(UDM) UID (local record);或LTS(RRM) = LTS (local record),且UID(RRM) != UID (local record),說(shuō)明產(chǎn)生數(shù)據(jù)更新沖突,按照第(6)步"數(shù)據(jù)更新沖突解決算法"解決 沖突,并記錄詳細(xì)的日志;
iv) 其它情況,則不做處理。
(5) 數(shù)據(jù)更新通知接收到數(shù)據(jù)更新的DDR進(jìn)程發(fā)送數(shù)據(jù)更新通知消息給 本地DDR接口庫(kù),應(yīng)用程序通過(guò)定時(shí)輪詢或注冊(cè)回調(diào)函數(shù)方式獲得此通知消息。
(6) 數(shù)據(jù)更新沖突解決
當(dāng)DDR進(jìn)程收到UDM或RRM消息時(shí)并檢測(cè)到數(shù)據(jù)更新沖突時(shí),這時(shí)按下列方 法進(jìn)行處理
a) 將該條數(shù)據(jù)的本地?cái)?shù)據(jù)保存到?jīng)_突數(shù)據(jù)列表中;
b) 用收到的數(shù)據(jù)更新本地相應(yīng)數(shù)據(jù);
c) 向沖突數(shù)據(jù)中的數(shù)據(jù)更新者UID對(duì)應(yīng)的DDR接口庫(kù)發(fā)送數(shù)據(jù)沖突通知消 息,由DDR接口庫(kù)對(duì)應(yīng)的本地應(yīng)用程序解決此沖突;
d) 向本地其它應(yīng)用程序的DDR接口庫(kù)發(fā)送數(shù)據(jù)更新通知。
(7) 數(shù)據(jù)讀取
應(yīng)用程序通過(guò)DDR接口庫(kù)直接從本地共享內(nèi)存中讀取需要的數(shù)據(jù)條數(shù)據(jù)
(8) DDR進(jìn)程退出處于主態(tài)的DDR進(jìn)程退出時(shí),廣播發(fā)送主DDR進(jìn)程將 退出消息MDM消息,此消息表示整個(gè)進(jìn)程的退出。
權(quán)利要求
1、一種分布式實(shí)時(shí)數(shù)據(jù)復(fù)制同步方法,其特征在于在需保持?jǐn)?shù)據(jù)同步的每臺(tái)處理機(jī)上運(yùn)行一個(gè)實(shí)時(shí)數(shù)據(jù)同步進(jìn)程,簡(jiǎn)稱(chēng)DDR進(jìn)程,每個(gè)DDR進(jìn)程中保存和維持與其它處理機(jī)上的DDR進(jìn)程相同的數(shù)據(jù)拷貝;同時(shí),提供一個(gè)函數(shù)接口庫(kù),簡(jiǎn)稱(chēng)DDR接口庫(kù),用于應(yīng)用程序與數(shù)據(jù)同步進(jìn)程DDR進(jìn)行數(shù)據(jù)交互;DDR進(jìn)程管理的數(shù)據(jù)以條為單位,每條數(shù)據(jù)的空間大小固定為N字節(jié),共M條數(shù)據(jù)記錄,存儲(chǔ)在一塊連續(xù)的M×N字節(jié)大小、由操作系統(tǒng)提供的共享內(nèi)存中,每一條數(shù)據(jù)內(nèi)容均包括該數(shù)據(jù)的邏輯時(shí)間LTS、更新的應(yīng)用程序編號(hào)UID和用戶數(shù)據(jù)USER DATA三部分,其中應(yīng)用程序編號(hào)UID由處理機(jī)編號(hào)和應(yīng)用程序的進(jìn)程號(hào)PID組成;每個(gè)DDR進(jìn)程定期廣播心跳信息給其它DDR進(jìn)程,以保證在每個(gè)DDR進(jìn)程中維持所有正常運(yùn)行的DDR進(jìn)程的IP地址列表和當(dāng)前的主態(tài)DDR進(jìn)程編號(hào);整個(gè)DDR進(jìn)程組中只能有一個(gè)主態(tài)DDR進(jìn)程,如果判斷出現(xiàn)2個(gè)以上主態(tài)或無(wú)主態(tài)進(jìn)程時(shí),則啟動(dòng)主態(tài)選舉算法選舉一個(gè)IP地址最小的處理機(jī)上的DDR進(jìn)程為主態(tài),其余均為從態(tài);數(shù)據(jù)復(fù)制步驟包括實(shí)時(shí)數(shù)據(jù)同步進(jìn)程DDR初始化;主態(tài)選舉;數(shù)據(jù)一致性周期性檢查;數(shù)據(jù)更新;數(shù)據(jù)更新通知;數(shù)據(jù)更新沖突解決;數(shù)據(jù)讀取和DDR進(jìn)程退出幾個(gè)部分,其中數(shù)據(jù)讀取是應(yīng)用程序通過(guò)DDR接口庫(kù)直接從本地共享內(nèi)存中讀取某條數(shù)據(jù),不產(chǎn)生網(wǎng)絡(luò)訪問(wèn)。
2、 如權(quán)利要求1所述的分布式實(shí)時(shí)數(shù)據(jù)復(fù)制同步方法,其特征在于所述 數(shù)據(jù)復(fù)制步驟(1) 實(shí)時(shí)數(shù)據(jù)同步進(jìn)程DDR初始化a) 程序啟動(dòng),初始化共享內(nèi)存數(shù)據(jù)區(qū),b) 將進(jìn)程的主從狀態(tài)置為從態(tài)狀態(tài),c) DDR進(jìn)程啟動(dòng)成功后,周期性向其它DDR進(jìn)程廣播心跳信息HBM,d) 接收其它DDR進(jìn)程心跳信息HBM,并更新本地活動(dòng)列表,如超過(guò)規(guī)定時(shí)間 未收到某個(gè)的心跳消息HBM消息,則在活動(dòng)列表中刪除該進(jìn)程的相應(yīng)信息;(2) 主態(tài)選舉a)主態(tài)DDR進(jìn)程選舉算法若從態(tài)DDR進(jìn)程收到主DDR進(jìn)程將退出消息MDM 消息或超過(guò)規(guī)定時(shí)間未收到數(shù)據(jù)一致性檢査消息MCM消息,則認(rèn)為主態(tài)進(jìn)程已不能正常工作,根據(jù)本地活動(dòng)DDR進(jìn)程列表檢査本進(jìn)程所在處理機(jī)的IP地址是否最小,判斷本進(jìn)程是否應(yīng)切換到主態(tài),如需切換到主態(tài),則廣播發(fā)送主DDR進(jìn)程存活消息MEM消息,同時(shí)將本機(jī)DDR進(jìn)程切換為主態(tài),b)多主態(tài)DDR進(jìn)程沖突解決算法若主態(tài)DDR進(jìn)程收到數(shù)據(jù)一致性檢查消息MCM消息或主態(tài)DDR進(jìn)程存活消息MEM,則認(rèn)為存在多個(gè)主態(tài),因此用本機(jī)IP地址和收到的MCM消息的IP地址比較若本機(jī)IP較大,則認(rèn)為有其它DDR進(jìn)程更適合主態(tài),將本機(jī)DDR進(jìn)程切換為從態(tài),若本機(jī)IP較小,則發(fā)送MEM消息給相應(yīng)DDR進(jìn)程,其它主態(tài)DDR進(jìn)程作同樣判斷;(3) 數(shù)據(jù)一致性周期性檢查主態(tài)DDR進(jìn)程定期廣播發(fā)送數(shù)據(jù)一致性檢査消息MCM,MCM消息中包含主態(tài)DDR進(jìn)程的每條數(shù)據(jù)的LTS和UID字段,DDR進(jìn)程收到MCM消息后將作以下處理-a) 主態(tài)DDR進(jìn)程收到MCM消息,則知道出現(xiàn)多個(gè)主態(tài),啟動(dòng)第(2)步中的多主態(tài)DDR進(jìn)程沖突解決,從而保證只有一個(gè)主態(tài)進(jìn)程,b) 每個(gè)從態(tài)DDR進(jìn)程收到MCM消息,則根據(jù)MCM消息中內(nèi)容逐條與本地?cái)?shù)據(jù)的LTS和UID比較如果MCM消息中的該條記錄的LTS值較大,說(shuō)明主態(tài)DDR進(jìn)程的數(shù)據(jù)為較新版本,向主態(tài)DDR進(jìn)程發(fā)送數(shù)據(jù)重傳消息RDM,請(qǐng)求主態(tài)重傳該條數(shù)據(jù),主態(tài)DDR進(jìn)程收到RDM消息后,用數(shù)據(jù)重傳應(yīng)答消息RRM,廣播該條數(shù)據(jù)的最新版本數(shù)據(jù),如果MCM消息中的該條記錄的LTS值較小,則主態(tài)DDR進(jìn)程的數(shù)據(jù)為舊版本,從態(tài)DDR進(jìn)程發(fā)送RRM消息給主態(tài)DDR進(jìn)程,以更新該條數(shù)據(jù),如果MCM消息中的該條記錄與本地記錄的LTS值相等,但是兩者UID值不相等,說(shuō)明存在數(shù)據(jù)沖突且還未被應(yīng)用程序解決,向主態(tài)DDR進(jìn)程發(fā)送RDM消息,請(qǐng)求主態(tài)重傳該條數(shù)據(jù),主態(tài)DDR進(jìn)程收到RDM消息后,用RRM消息廣播該條數(shù)據(jù)的最新版本數(shù)據(jù),如果MCM消息中的該條記錄與本地記錄的LTS值和UID值均相等,說(shuō)明兩者數(shù)據(jù)版本一致,不作任何處理;(4) 數(shù)據(jù)更新a)當(dāng)應(yīng)用程序需更新某條數(shù)據(jù)時(shí),調(diào)用DDR接口庫(kù)的提供的更新函數(shù)將更新數(shù)據(jù)發(fā)送給本地DDR進(jìn)程,本地DDR進(jìn)程采用以下算法更新數(shù)據(jù)i )將該條數(shù)據(jù)的LTS加1, UID更新為調(diào)用進(jìn)程的UID,更新本地的數(shù)據(jù),ii)向其它DDR進(jìn)程廣播發(fā)送數(shù)據(jù)更新UDM消息,以更新該條數(shù)據(jù);b) DDR進(jìn)程接收到數(shù)據(jù)更新消息UDM按以下算法處理i) 如UDM消息中該條數(shù)據(jù)的LTS值小于本地該條數(shù)據(jù)的LTS值,說(shuō)明本地?cái)?shù)據(jù)較新,不做處理,ii) 如UDM消息中該條數(shù)據(jù)的LTS值大于本地該條數(shù)據(jù)的LTS值,則用UDM中的數(shù)據(jù)更新本地?cái)?shù)據(jù),包括LTS和UID字段,iii) 如UDM消息中該條數(shù)據(jù)的LTS值等于本地該條數(shù)據(jù)的LTS值,但UID值不相等,說(shuō)明產(chǎn)生數(shù)據(jù)更新沖突,按第(6)步"數(shù)據(jù)更新沖突解決算法"解決沖突,并記錄詳細(xì)的曰志,iv) 其它情況,則不做處理;c) DDR進(jìn)程接收到數(shù)據(jù)重傳應(yīng)答消息RRM按以下算法處理,i) 如RRM消息中該條數(shù)據(jù)的LTS值小于本地該條數(shù)據(jù)的LTS值,說(shuō)明本地?cái)?shù)據(jù)較新,不做處理,ii) 如RRM消息中該條數(shù)據(jù)的LTS值大于本地該條數(shù)據(jù)的LTS值,則用RRM中的數(shù)據(jù)更新本地?cái)?shù)據(jù),包括LTS和UID字段,iii) 如RRM消息中該條數(shù)據(jù)的LTS值等于本地該條數(shù)據(jù)的LTS值,但UID值不相等,說(shuō)明產(chǎn)生數(shù)據(jù)更新沖突,按第(6)步"數(shù)據(jù)更新沖突解決算法"解決沖突,并記錄詳細(xì)的日志;(5) 數(shù)據(jù)更新通知接收到數(shù)據(jù)更新的DDR進(jìn)程發(fā)送數(shù)據(jù)更新通知消息給本地DDR接口庫(kù),應(yīng)用程序通過(guò)定時(shí)輪詢或注冊(cè)回調(diào)函數(shù)方式獲得此通知消息;(6) 數(shù)據(jù)更新沖突解決當(dāng)DDR進(jìn)程收到UDM或RRM消息時(shí)并檢測(cè)到數(shù)據(jù)更新沖突時(shí)按下列方法進(jìn)行處理a) 將該條數(shù)據(jù)的本地?cái)?shù)據(jù)保存到?jīng)_突數(shù)據(jù)列表中,b) 用收到的數(shù)據(jù)更新本地相應(yīng)數(shù)據(jù),c) 向沖突數(shù)據(jù)中的數(shù)據(jù)更新消息UID對(duì)應(yīng)的DDR接口庫(kù)發(fā)送數(shù)據(jù)沖突通知消息,由DDR接口庫(kù)對(duì)應(yīng)的本地應(yīng)用程序解決此沖突,d) 向本地其它應(yīng)用程序的DDR接口庫(kù)發(fā)送數(shù)據(jù)更新通知;(7) 數(shù)據(jù)讀取應(yīng)用程序通過(guò)DDR接口庫(kù)直接從本地共享內(nèi)存中讀取某條數(shù)據(jù);(8) DDR進(jìn)程退出處于主態(tài)的DDR進(jìn)程退出時(shí),廣播發(fā)送主DDR進(jìn)程將退出消息MDM消息。
3、 如權(quán)利要求1所述的分布式實(shí)時(shí)數(shù)據(jù)復(fù)制同步方法,其特征在于所述提供一個(gè)函數(shù)接口庫(kù),用于應(yīng)用程序與數(shù)據(jù)同步進(jìn)程DDR進(jìn)行數(shù)據(jù)交互是指在DDR接口庫(kù)中有為應(yīng)用程序提供數(shù)據(jù)獲取、數(shù)據(jù)更新、定時(shí)輪詢和注冊(cè)更新通知回調(diào)的接口函數(shù),DDR接口庫(kù)函數(shù)定義為(1) 獲取數(shù)據(jù)函數(shù)定義為int Get (int nddrNo, char承pUserdata, int nUserdataLength), 本函數(shù)從本地共享內(nèi)存數(shù)據(jù)中取出第nddrNo條數(shù)據(jù)并將數(shù)據(jù)內(nèi)容放入pUserdata中,數(shù)據(jù)最長(zhǎng)為nUserdatalength字節(jié);(2) 更新數(shù)據(jù)函數(shù)定義為int Set (int nddrNo, const char氺pUserdata, int nUserdataLength),本函數(shù)將pUserdata中的數(shù)據(jù)更新到本地?cái)?shù)據(jù)拷貝中第nddrNo條數(shù)據(jù)中,數(shù)據(jù)最長(zhǎng)為nUserdataLength字節(jié);(3) 定時(shí)輪詢函數(shù)定義為int GetNotify (int承changedRecords),根據(jù)函數(shù)返回有多少條數(shù)據(jù)變化,將變化數(shù)據(jù)的編號(hào)放入changedRecords數(shù)組中,應(yīng)用程序可根據(jù)changedRecords數(shù)組中的數(shù)據(jù)編號(hào)調(diào)用get函數(shù)取得具體的變化的數(shù)據(jù);(4) 注冊(cè)回調(diào)函數(shù)為int RegisterNotifyCallback (void襯uncptr), funcptr為形女口 void func(int nRecordNo)函數(shù)指針,nRecordNo為變化的數(shù)據(jù)編號(hào),當(dāng)有通知消息時(shí),DDR接口庫(kù)自動(dòng)調(diào)用應(yīng)用程序注冊(cè)的函數(shù)(funcptr)完成相應(yīng)的功能處理。
4、 如權(quán)利要求2所述的分布式實(shí)時(shí)數(shù)據(jù)復(fù)制同步方法,其特征在于所述心跳消息HBM消息數(shù)據(jù)包括消息順序號(hào)、本機(jī)IP、消息產(chǎn)生時(shí)間、主從狀態(tài);所述數(shù)據(jù)一致性檢査消息MCM消息數(shù)據(jù)包括消息順序號(hào)、本機(jī)IP、消息產(chǎn)生時(shí)間、每條數(shù)據(jù)的邏輯時(shí)間LTS和應(yīng)用程序編號(hào)UID字段;所述數(shù)據(jù)更新消息UDM消息包括消息順序號(hào)、本機(jī)IP地址、消息產(chǎn)生時(shí)間、更新的數(shù)據(jù)條編號(hào)、邏輯時(shí)間LTS、應(yīng)用程序編號(hào)UID字段和用戶數(shù)據(jù)user datahead禾口 user data^所述數(shù)據(jù)重傳消息RDM消息數(shù)據(jù)包括消息順序號(hào)、本機(jī)IP地址、消息產(chǎn)生時(shí)間、請(qǐng)求重傳數(shù)據(jù)條的編號(hào);所述數(shù)據(jù)重傳應(yīng)答消息RRM消息數(shù)據(jù)包括消息順序號(hào)、本機(jī)IP地址、消息產(chǎn)生時(shí)間、重傳數(shù)據(jù)條的編號(hào)、邏輯時(shí)間LTS、應(yīng)用程序編號(hào)UID字段和用戶數(shù)據(jù)user data head禾口 user data;所述主DDR進(jìn)程將退出消息MDM消息數(shù)據(jù)包括消息順序號(hào)、本機(jī)IP地址、消息產(chǎn)生時(shí)間;所述主DDR進(jìn)程存活消息MEM消息數(shù)據(jù)包括消息順序號(hào)、本機(jī)IP、消息產(chǎn)生時(shí)間。
全文摘要
分布式實(shí)時(shí)數(shù)據(jù)復(fù)制同步方法屬計(jì)算機(jī)應(yīng)用。每臺(tái)處理機(jī)上運(yùn)行一個(gè)DDR進(jìn)程,定期廣播心跳信息,保存和維持與其它處理機(jī)上進(jìn)程相同的數(shù)據(jù)拷貝。應(yīng)用程序與DDR進(jìn)程在DDR接口庫(kù)中進(jìn)行數(shù)據(jù)交互。數(shù)據(jù)以條為單位,存儲(chǔ)在操作系統(tǒng)提供的共享內(nèi)存中,每條數(shù)據(jù)固定為N字節(jié),M條數(shù)據(jù)記錄,含邏輯時(shí)間、更新應(yīng)用程序編號(hào)和用戶數(shù)據(jù)。整個(gè)DDR進(jìn)程組中只有一個(gè)主態(tài)。復(fù)制步驟包括同步進(jìn)程DDR初始化;主態(tài)選舉;數(shù)據(jù)一致性周期性檢查;數(shù)據(jù)更新;數(shù)據(jù)更新通知;數(shù)據(jù)更新沖突解決;數(shù)據(jù)讀取和DDR進(jìn)程退出。本方法不用數(shù)據(jù)庫(kù),杜絕了因數(shù)據(jù)庫(kù)宕機(jī)整個(gè)系統(tǒng)不能使用的情況,數(shù)據(jù)讀取不產(chǎn)生網(wǎng)絡(luò)訪問(wèn),數(shù)據(jù)更新快,實(shí)時(shí)性、可靠性高,特別適合于實(shí)時(shí)、分布式重大使命系統(tǒng)。
文檔編號(hào)G06F9/52GK101661408SQ200910167619
公開(kāi)日2010年3月3日 申請(qǐng)日期2009年9月14日 優(yōu)先權(quán)日2009年9月14日
發(fā)明者劉健波, 軍 楊, 波 楊 申請(qǐng)人:四川川大智勝軟件股份有限公司