亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種提供復(fù)制特性的分布式nosql數(shù)據(jù)庫(kù)的制作方法

文檔序號(hào):6338856閱讀:148來(lái)源:國(guó)知局
專利名稱:一種提供復(fù)制特性的分布式nosql數(shù)據(jù)庫(kù)的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及計(jì)算機(jī)應(yīng)用領(lǐng)域,尤其涉及分布式系統(tǒng)中多機(jī)數(shù)據(jù)的復(fù)制。
背景技術(shù)
在分布式系統(tǒng)中,通常配有多個(gè)計(jì)算機(jī)主機(jī),為了保證系統(tǒng)的可靠性和提高系 統(tǒng)性能,通常要求這些主機(jī)存儲(chǔ)內(nèi)容一樣的關(guān)鍵性的數(shù)據(jù)。這樣的主機(jī)組成了一個(gè)復(fù)制 組,這就要求如果組內(nèi)的某個(gè)服務(wù)器上的數(shù)據(jù)庫(kù)發(fā)生了更新,必須要在很快的時(shí)間內(nèi)將 更新傳播到組內(nèi)的其它服務(wù)器上;另外,當(dāng)一個(gè)復(fù)制組中有服務(wù)器出現(xiàn)退出、關(guān)閉這樣 的失效行為,組內(nèi)的其它服務(wù)器仍然可以繼續(xù)工作,而當(dāng)失效服務(wù)器重新開始工作后, 數(shù)據(jù)需要進(jìn)行同樣的更新。這就需要一種復(fù)制系統(tǒng)會(huì)實(shí)時(shí)自動(dòng)將服務(wù)器上更新、刪除操 作復(fù)制到系統(tǒng)中的其它服務(wù)器上,這樣當(dāng)一個(gè)服務(wù)器退出后,不會(huì)影響到整個(gè)復(fù)制組提 供的服務(wù)的方法。

發(fā)明內(nèi)容
本發(fā)明的目的旨在解決一個(gè)復(fù)制組中數(shù)據(jù)復(fù)制的問(wèn)題。本發(fā)明的基本思路是復(fù)制系統(tǒng)應(yīng)能支持2至多臺(tái)主機(jī),這些主機(jī)可以在硬件 配置、操作系統(tǒng)平臺(tái)上不相同,但要求部署的進(jìn)程相同(不同操作系統(tǒng)同一進(jìn)程要求功 能一致)。具有較強(qiáng)的容錯(cuò)功能。因此,在每臺(tái)復(fù)制組的主機(jī)上運(yùn)行復(fù)制系統(tǒng)的軟件 RepDB—個(gè),該軟件提供運(yùn)行于不同操作系統(tǒng)平臺(tái)的版本,這些版本內(nèi)核完全一致。復(fù) 制系統(tǒng)軟件提供編程開發(fā)接口 Rep—client庫(kù),每個(gè)需要使用復(fù)制系統(tǒng)功能的進(jìn)程使用這個(gè) 庫(kù),并按照接口要求進(jìn)行調(diào)用。復(fù)制組中所有主機(jī)使用相同的配置文件,配置文件中指 定了復(fù)制組主機(jī)間心跳的時(shí)間間隔、版本比較時(shí)間、監(jiān)聽端口等信息。在RepDB中存在 一個(gè)唯一的協(xié)調(diào)者master,master在擔(dān)當(dāng)?shù)膮f(xié)調(diào)者同時(shí),也要完成普通RepDB完成的工 作。各主機(jī)RepDB的數(shù)據(jù)之間的版本的比較通過(guò)哈希樹來(lái)實(shí)現(xiàn),避免在進(jìn)行版本比較 時(shí),當(dāng)數(shù)據(jù)量很大的時(shí)候,占用大量的帶寬和耗費(fèi)大量的系統(tǒng)資源。本發(fā)明的目的是這樣達(dá)到的
一種提供復(fù)制特性的分布式NOSQL數(shù)據(jù)庫(kù),其特征在于在每臺(tái)復(fù)制組的主機(jī)上運(yùn) 行復(fù)制系統(tǒng)軟件RepDB。系統(tǒng)軟件RepDB提供編程開發(fā)接口庫(kù)Rep—client。RepDB與編 程開發(fā)接口庫(kù)Rep—client進(jìn)程間通信通過(guò)環(huán)回地址Iocalhost (127.0.0.1)實(shí)現(xiàn),RepDB在 一個(gè)固定的端口上監(jiān)聽,Rep—client使用TCP協(xié)議連接這個(gè)端口。RepDB與編程開發(fā)接 口庫(kù)Rep—client之間的通信有兩條鏈路,一條是控制鏈路,另一條是數(shù)據(jù)鏈路。數(shù)據(jù)鏈 路用于數(shù)據(jù)庫(kù)的更新或刪除操作,控制鏈路用于RepDB與Rep—client之間的消息傳送。 RepDB只有在穩(wěn)定以后才允許Rep—client與它通信,在RepDB準(zhǔn)備好以后,給使用服務(wù) 的客戶端進(jìn)程通過(guò)接口 Rep—client發(fā)送一個(gè)REPDB—IS—READY消息,表示Rep—client可 以進(jìn)行更新數(shù)據(jù)的操作,當(dāng)本機(jī)數(shù)據(jù)發(fā)生改變時(shí),RepDB通知Rep—client提醒進(jìn)程讀取。 每個(gè)RepDB客戶端都可以更新數(shù)據(jù)庫(kù)中的數(shù)據(jù)。
復(fù)制組中所有主機(jī)使用相同的配置文件,配置文件中指定了包括復(fù)制組主機(jī)間 心跳的時(shí)間間隔、版本比較時(shí)間、監(jiān)聽端口的心跳信息,心跳信息使用UDP或鏈路層協(xié) 議進(jìn)行傳輸,每隔一段時(shí)間發(fā)送一次。主機(jī)之間通過(guò)心跳報(bào)文進(jìn)行信息傳遞,心跳信息 在接收后立即處理。心跳報(bào)文除了在每個(gè)時(shí)間間隔到達(dá)時(shí)發(fā)送心跳包之外,在本機(jī)數(shù)據(jù) 庫(kù)有數(shù)據(jù)時(shí),還將數(shù)據(jù)的相關(guān)信息傳遞給組中的每個(gè)主機(jī)。在所有RepDB中選舉唯一一個(gè)協(xié)調(diào)者master,master在擔(dān)當(dāng)?shù)膮f(xié)調(diào)者的同時(shí),
同樣完成普通RepDB能完成的工作。對(duì)于各個(gè)RepDB的數(shù)據(jù)之間的版本的比較通過(guò)哈希樹來(lái)實(shí)現(xiàn);哈希樹葉子節(jié) 點(diǎn)的個(gè)數(shù)預(yù)先確定,計(jì)算某個(gè)葉子節(jié)點(diǎn)的hash值由key值計(jì)算得到,方法如下將key 值的每一字節(jié)相加得到SUM,將SUM對(duì)哈希數(shù)葉子節(jié)點(diǎn)的個(gè)數(shù)取模,得到的一個(gè)整數(shù) Index,將該記錄放入哈希樹Index節(jié)點(diǎn)下。每個(gè)哈希樹的節(jié)點(diǎn)中會(huì)有很多記錄與之對(duì)應(yīng), 這些記錄我們按Key值進(jìn)行排序,將排序后的Key放入內(nèi)存,對(duì)內(nèi)存中的數(shù)據(jù)使用MD5 算法計(jì)算出數(shù)據(jù)摘要值。數(shù)據(jù)持久存儲(chǔ)使用Berkely DB (簡(jiǎn)稱BDB)創(chuàng)建的Key-Value數(shù)據(jù)庫(kù),在存儲(chǔ) 時(shí),Value使用ver—num +value的方式組成,其中ver—num為版本信息,value為數(shù)據(jù)的實(shí)
質(zhì)部分;在系統(tǒng)啟動(dòng)時(shí),將BDB中的除實(shí)質(zhì)數(shù)據(jù)外的Key和ver—num全部載入到RepDB 進(jìn)程的內(nèi)存中,在更新數(shù)據(jù)的時(shí)候既要修改BDB中的數(shù)據(jù),也要修改內(nèi)存中的數(shù)據(jù)。數(shù)據(jù)庫(kù)中的數(shù)據(jù)同步的方法是
(1).若master中沒(méi)有數(shù)據(jù),根據(jù)master的選舉規(guī)則,則系統(tǒng)中的所有RepDB都沒(méi)有 數(shù)據(jù),若新加入節(jié)點(diǎn)有數(shù)據(jù),將新加入節(jié)點(diǎn)的數(shù)據(jù)全部復(fù)制到當(dāng)前系統(tǒng)中。(2).若master中有數(shù)據(jù),則將master的葉子節(jié)點(diǎn)的hash值與發(fā)起同步節(jié)點(diǎn) 的葉子節(jié)點(diǎn)的hash值比較,若有不同,判斷系統(tǒng)中是否有在此葉子節(jié)點(diǎn)上與master hash值相同的RepDB,如果沒(méi)有,將不同的葉子節(jié)點(diǎn)放入一個(gè)等待處理隊(duì)列中m— mapWaitForDeal ; map<intl6_t, time—t> m—mapWaitForDeal;其中 map 的首項(xiàng)為 hash值不 同的葉子節(jié)點(diǎn)在merkle樹中的位置,time—t為發(fā)現(xiàn)差異時(shí)的時(shí)間戳。當(dāng)?shù)葔蛞欢ǖ臅r(shí)間后 才向master發(fā)出同步請(qǐng)求。如果在此葉子節(jié)點(diǎn)上存在與master的hash值相同的RepDB, 則直接向此RepDB發(fā)送同步請(qǐng)求,收到同步請(qǐng)求的RepDB將自己對(duì)應(yīng)的葉子節(jié)點(diǎn)的hash 取出來(lái)和此hash對(duì)應(yīng)的key及版本號(hào),發(fā)回給對(duì)方。收到回應(yīng)的RepDB再把收到的版本 號(hào)與本地的版本號(hào)相比較,若本地版本大,則發(fā)送刷新報(bào)文,若本地版本小,則發(fā)送刷 新請(qǐng)求報(bào)文。數(shù)據(jù)更新具體過(guò)程數(shù)據(jù)的更新在每個(gè)Rep—client都可以進(jìn)行。RepDB對(duì)于要 更新的數(shù)據(jù),每次都是先將更新操作連帶數(shù)據(jù)一起發(fā)送給master,先由master給此更新 操作分配一個(gè)版本號(hào),然后master再按照要求更新master自己的數(shù)據(jù)。要更新數(shù)據(jù)的 RepDB拿到這個(gè)版本號(hào)之后,把它作為更新數(shù)據(jù)的版本號(hào),再將數(shù)據(jù)發(fā)送給組里的其它 RepDB,最后在RepDB發(fā)送完數(shù)據(jù)之后,還要給master—個(gè)回應(yīng),表示數(shù)據(jù)已經(jīng)發(fā)送完 成。在刪除操作中,master為刪除操作分配版本號(hào)后,master和其它接收刪除命令的 RepDB都將刪除的記錄存入數(shù)據(jù)庫(kù)的刪除表中。本發(fā)明的有益效果是1、實(shí)現(xiàn)了多機(jī)間數(shù) 據(jù)的復(fù)制及多機(jī)間數(shù)據(jù)的一致性,可運(yùn)用于需要高可靠、高可 用,高性能的環(huán)境中,具有廣闊的應(yīng)用前景和價(jià)值。2、本方法能支持2至多臺(tái)主機(jī),這些主機(jī)可以在硬件配置、操作系統(tǒng)平臺(tái)上不 相同,具有較強(qiáng)的容錯(cuò)功能。3、將哈希樹用于數(shù)據(jù)庫(kù)版本的比較,通過(guò)傳遞比較hash值來(lái)快速的找到不一致 的葉子節(jié)點(diǎn),只對(duì)不一致的葉子節(jié)點(diǎn)中的key進(jìn)行同步,大大節(jié)約系統(tǒng)和網(wǎng)絡(luò)資源。


圖1是更新某個(gè)記錄的工作流程圖。圖2是更新發(fā)起主機(jī)在收到某個(gè)主機(jī)的更新某個(gè)記錄的工作流程圖。圖3是刪除某個(gè)記錄的發(fā)起節(jié)點(diǎn)的工作流程圖。圖4是版本同步工作流程圖。
具體實(shí)施例方式本發(fā)明的關(guān)鍵在于網(wǎng)絡(luò)通信與算法的實(shí)現(xiàn)。每臺(tái)復(fù)制組的主機(jī)上運(yùn)行復(fù)制系統(tǒng)的軟件RepDB —個(gè),該軟件提供不同平臺(tái)的 版本,這些版本內(nèi)核完全一致。復(fù)制系統(tǒng)軟件提供編程開發(fā)接口 Rep—client庫(kù),每個(gè)需 要使用復(fù)制系統(tǒng)功能的進(jìn)程使用這個(gè)庫(kù),并按照接口要求進(jìn)行調(diào)用。復(fù)制組中所有主機(jī)使用相同的配置文件,給配置文件中指定了復(fù)制組主機(jī)間心 跳的時(shí)間間隔、版本比較時(shí)間、監(jiān)聽端口等信息。主機(jī)之間通過(guò)心跳報(bào)文進(jìn)行信息傳遞,由于是多機(jī)、不使用傳統(tǒng)的RS232接 口,因?yàn)橹鳈C(jī)一般只配有2個(gè)串口,心跳報(bào)文使用網(wǎng)絡(luò)數(shù)據(jù)包的方式傳送,可以使用 UDP或鏈路層協(xié)議進(jìn)行傳輸,每隔一段時(shí)間Tl發(fā)送一次。心跳信息在處理時(shí)不同于一 般的網(wǎng)絡(luò)數(shù)據(jù)先放入消息隊(duì)列以后再進(jìn)行處理,而是在接收后立即處理,心跳信息報(bào)文 定義如下
typedef struct
{
DWORD host ip; // 主機(jī) IP time t start—time; //本機(jī)啟動(dòng)時(shí)間
CHAR ready—status; //本主機(jī)的準(zhǔn)備就緒態(tài),0初始態(tài)1:正常態(tài) CHAR sys—status; //系統(tǒng)是否穩(wěn)定,0 初始態(tài),1 穩(wěn)定狀態(tài) CHAR has—data; //本機(jī)是否有數(shù)據(jù),0:沒(méi)有數(shù)據(jù),1:有數(shù)據(jù) WORD priority; //本機(jī)的優(yōu)先等級(jí) BYTE blsManager; //是否是管理機(jī)
tagLogicTimeStamps version_stamps;//RepDB 當(dāng)?shù)剡壿嫽鶞?zhǔn)時(shí)間戳 }REPDBHeartBeat;
其中host—index是發(fā)送心跳信息的主機(jī) 的編號(hào),用于接收心跳信息的主機(jī)獲知此 心跳信息的發(fā)送者,此編號(hào)對(duì)復(fù)制組中的每個(gè)主機(jī)都是唯一的;start—time為啟動(dòng)時(shí)間; ready—status為主機(jī)準(zhǔn)備就緒狀態(tài);sys—status標(biāo)識(shí)整個(gè)復(fù)制系統(tǒng)是否穩(wěn)定,只有穩(wěn)定的復(fù)制系統(tǒng)才能提供服務(wù);blsManager標(biāo)識(shí)本機(jī)是否為管理機(jī)(master) ; has—data標(biāo)識(shí)本機(jī) 的數(shù)據(jù)庫(kù)中是否有數(shù)據(jù);priority為本機(jī)的優(yōu)先級(jí),優(yōu)先級(jí)高的主機(jī)在發(fā)送數(shù)據(jù)的能優(yōu)先 發(fā)送;stamps本地邏輯基準(zhǔn)時(shí)間戳。心跳報(bào)文除了在每個(gè)時(shí)間間隔到達(dá)時(shí)發(fā)送心跳包之外,在本機(jī)數(shù)據(jù)庫(kù)有數(shù)據(jù) 時(shí),還需要將數(shù)據(jù)的相關(guān)信息傳遞給組中的每個(gè)主機(jī)。復(fù)制系統(tǒng)由多個(gè)RepDB組成(大于等于2個(gè)),其中存在一個(gè)唯一的協(xié)調(diào)者 master。系統(tǒng)剛啟動(dòng)時(shí),所有的RepDB都不是master,master是從所有RepDB中選舉 出來(lái)的。master在擔(dān)當(dāng)master的同時(shí),它也是一個(gè)RepDB,所以master也需要完成普通
RepDB能完成的工作。RepDB需要與系統(tǒng)提供的編程開發(fā)接口 Rep—client庫(kù)進(jìn)行通信, 這就需要某種進(jìn)程間通信IPC。在本發(fā)明中,為了提高跨平臺(tái)性,使用操作系統(tǒng)提供的環(huán) 回地址Iocalhost實(shí)現(xiàn)這類通信。RepDB在一個(gè)固定的端口上監(jiān)聽,Rep—client使用TCP 協(xié)議連接這個(gè)這個(gè)端口。每個(gè)RepDB客戶端都可以更新數(shù)據(jù)庫(kù)中的數(shù)據(jù),而不受其它限 制。為實(shí)現(xiàn)較大數(shù)據(jù)量的存儲(chǔ),對(duì)于各個(gè)RepDB的數(shù)據(jù)之間的版本比較通過(guò)哈希樹來(lái)進(jìn) 行。哈希樹(hash tree)是指這樣一個(gè)樹結(jié)構(gòu)樹的每一個(gè)葉結(jié)點(diǎn)是一條指令加上 該指令的哈希值構(gòu)成、每個(gè)父結(jié)點(diǎn)下面的所有子結(jié)點(diǎn)的哈希值組合到一起再進(jìn)行hash運(yùn) 算就得到它們的父結(jié)點(diǎn);這個(gè)過(guò)程一直進(jìn)行下去直至得到樹的根結(jié)點(diǎn)。在本發(fā)明中,葉 子節(jié)點(diǎn)的個(gè)數(shù)是預(yù)先確定的;計(jì)算某個(gè)葉子節(jié)點(diǎn)的hash值是由key值計(jì)算得到將key 值的每一字節(jié)相加,再對(duì)葉子節(jié)點(diǎn)的個(gè)數(shù)取模,得到的一個(gè)整數(shù)就是用此key來(lái)計(jì)算hash 值的葉子節(jié)點(diǎn)的索引。例如,哈希樹共有100個(gè)葉子節(jié)點(diǎn),對(duì)于key= “aaa”的一條記 錄,用此記錄來(lái)計(jì)算hash值的葉子節(jié)點(diǎn)的索引是index= ( ‘a(chǎn)’ + ‘a(chǎn)’ + ‘a(chǎn)’ ) mod 100= (61+61+61) mod 100 = 83。這樣,每個(gè)key對(duì)應(yīng)的葉子節(jié)點(diǎn)也就固定了,不會(huì)因 為某些操作使得一個(gè)key與另一個(gè)葉子節(jié)點(diǎn)對(duì)應(yīng)。每個(gè)哈希樹的節(jié)點(diǎn)中會(huì)有很多記錄與之對(duì)應(yīng),每個(gè)記錄的版本信息進(jìn)行排序, 將排序后的版本信息放入內(nèi)存,對(duì)內(nèi)存中的數(shù)據(jù)使用MD5算法計(jì)算出hash值。使用哈希樹的好處在進(jìn)行版本比較時(shí),如果直接使用key進(jìn)行比較,當(dāng)數(shù)據(jù) 量很大的時(shí)候,將占用大量的帶寬,同時(shí)大量的比較操作也將耗費(fèi)大量的系統(tǒng)資源。使 用哈希樹,不同的key的集合,計(jì)算出來(lái)的hash值是不同的,相同的key的集合,用于計(jì) 算hash值的版本號(hào)不一樣,計(jì)算出來(lái)的hash值也不一樣,也就是說(shuō),如果兩個(gè)RepDB它 們的數(shù)據(jù)完全一致的話,那么它們的哈希樹的頂層值也應(yīng)該完全一樣,相反也成立。所 以可以通過(guò)傳遞比較hash值來(lái)快速的找到不一致的葉子節(jié)點(diǎn),最后才對(duì)不一致的葉子節(jié) 點(diǎn)中的key進(jìn)行同步。在所有的RepDB中要選擇一個(gè)唯一的RepDB作為master,master用于控制整個(gè) 更新和同步過(guò)程。Master首先是一個(gè)普通的RepDB,然后再是一個(gè)master,所以master
需要能夠完成所有其它RepDB所能完成的工作,同時(shí)還應(yīng)有格外管理功能。
協(xié)調(diào)者master的舉選規(guī)則是
1、如所有RepDB的數(shù)據(jù)庫(kù)中都沒(méi)有數(shù)據(jù),則按照大IP優(yōu)先的原則進(jìn)行選舉;
2、如只有一個(gè)RepDB的數(shù)據(jù)庫(kù)有數(shù)據(jù),則選舉有數(shù)據(jù)的RepDB作為master;
3、如果有多個(gè)RepDB有數(shù)據(jù),則在這些有數(shù)據(jù)的RepDB中按照1中的規(guī)則來(lái)進(jìn)行master 選 舉。為了減少選舉master的次數(shù),只要正確的選出了 master,而master又沒(méi)有出現(xiàn)異
常的情況下,不再進(jìn)行master的選擇。為了正確的選出master,需要在RepDB之間傳遞一些消息,用于通知?jiǎng)e的 RepDB自己的狀態(tài),這些消息通過(guò)同樣心跳來(lái)傳遞。RepDB與Rep—client之間的通信是通過(guò)Iocalhost進(jìn)行的。它們之間的通信共有
兩條鏈路,一條是控制鏈路,另一條是數(shù)據(jù)鏈路。RepDB只有在穩(wěn)定以后才會(huì)允許Rep— client與它通信,在RepDB準(zhǔn)備好以后,會(huì)給它自己的Rep—client發(fā)送一個(gè)REPDB—IS— READY消息,表示Rep—client可以更新數(shù)據(jù)了。Rep—client還可以訂閱某些感興趣的數(shù)
據(jù),即當(dāng)本機(jī)上的這些數(shù)據(jù)發(fā)生改變時(shí),RepDB會(huì)通知Rep—client這個(gè)改變,同樣Rep— client可以退訂。所有以上的這些消息都是通過(guò)控制鏈路來(lái)傳輸?shù)?;?shù)據(jù)鏈路傳輸?shù)氖菍?duì) 數(shù)據(jù)庫(kù)的更新和刪除操作的數(shù)據(jù)。參見圖1.本方法中的每個(gè)Rep—client都可以更新數(shù)據(jù)。RepDB對(duì)于要更新的數(shù) 據(jù),每次都是先將更新操作連帶數(shù)據(jù)一起發(fā)送給master,先由master給此更新操作分配 一個(gè)版本號(hào),然后master再按照要求更新master自己的數(shù)據(jù);要更新數(shù)據(jù)的RepDB拿到 這個(gè)版本號(hào)之后,把它作為更新數(shù)據(jù)的版本號(hào),再將數(shù)據(jù)發(fā)送給組里的其它RepDB,最 后在RepDB發(fā)送完數(shù)據(jù)之后,還要給master—個(gè)回應(yīng),表示操作完成,數(shù)據(jù)已經(jīng)發(fā)送完 成。具體實(shí)現(xiàn)細(xì)節(jié)如下RepDB收到Rep—client的更新請(qǐng)求以后,先給master發(fā)一 個(gè)版本請(qǐng)求報(bào)文,master收到此報(bào)文后,先給此更新分配一個(gè)版本號(hào),版本號(hào)總是單調(diào) 遞增的,然后用此版本號(hào)先更新自己,最后再將此版本號(hào)發(fā)送給請(qǐng)求進(jìn)程,同時(shí)master 還要保存此更新的相關(guān)信息,等待RepDB回應(yīng)后再刪除。RepDB在收到版本請(qǐng)求應(yīng)答 后,先更新自己,再向其它所有沒(méi)有更新過(guò)的RepDB發(fā)送此更新,RepDB在發(fā)送完此更 新后,在給master—個(gè)回應(yīng)表示發(fā)送已完成,這樣做可以提高一些可靠性當(dāng)RepDB在 發(fā)送更新的過(guò)程中失敗以后,他就不會(huì)給master回應(yīng)發(fā)送完成的消息,這樣,當(dāng)?shù)却?段足夠長(zhǎng)的時(shí)間以后,master就知道發(fā)送已經(jīng)失敗,這時(shí)master自己再將最新值發(fā)送出 去。在圖2給出的是更新發(fā)起主機(jī)在收到某個(gè)主機(jī)的更新某個(gè)記錄的工作流程圖。 對(duì)于刪除操作來(lái)說(shuō),還需要將刪除的記錄存入一個(gè)叫刪除表的數(shù)據(jù)庫(kù)表中。以便在沒(méi)有 完全刪除(組內(nèi)所有RepDB都已經(jīng)刪除完成),而發(fā)起刪除操作的主機(jī)退出又重啟的情 況下,可以繼續(xù)進(jìn)行刪除操作;其它接收刪除命令的RepDB也要將刪除記錄存入刪除 表。刪除表的記錄的存儲(chǔ)格式如下
I key I ver num | 其中ver—num為master為刪除操作分配的版本號(hào)。在所有的更新過(guò)程中,如果在更新時(shí)發(fā)現(xiàn)有新RepDB加入,主動(dòng)發(fā)起更新的 RepDB (可能是master),在更新完自己之后要更新操作保存起來(lái),等新加入RepDB和 系統(tǒng)都穩(wěn)定以后再發(fā)送這些操作。保證數(shù)據(jù)同步時(shí)本發(fā)明的重點(diǎn),數(shù)據(jù)同步的方法
(1).若master中沒(méi)有數(shù)據(jù),根據(jù)master的選舉規(guī)則,則系統(tǒng)中的所有RepDB都沒(méi)有數(shù)據(jù),這樣如果新加入節(jié)點(diǎn)有數(shù)據(jù)的話,將新加入節(jié)點(diǎn)的數(shù)據(jù)全部復(fù)制到以前的系統(tǒng)中。(2).如果master中有數(shù)據(jù),則將master的葉子節(jié)點(diǎn)的hash值與發(fā)起同步節(jié)點(diǎn) 的葉子節(jié)點(diǎn)的hash值比較,若有不同的,再判斷系統(tǒng)中是否有在此葉子節(jié)點(diǎn)上與master hash值相同的RepDB,如果沒(méi)有,再將不同的葉子節(jié)點(diǎn)放入一個(gè)等待處理隊(duì)列中m— mapWaitForDeal ; map<intl6_t, time—t> m mapWaitForDeal ;其中 map 的 first 為 hash 值不同的葉子節(jié)點(diǎn)在merkle樹中的位置,time—t為發(fā)現(xiàn)不同時(shí)的時(shí)間戳。當(dāng)?shù)葔蛞欢?的時(shí)間后才向master發(fā)出同步請(qǐng)求;如果在此葉子節(jié)點(diǎn)上存在與master的hash值相 同的RepDB,則直接向此RepDB發(fā)送同步請(qǐng)求。同步請(qǐng)求的報(bào)文類型為REPDB— VERSION—SYNCH—REQUEST,收到同步請(qǐng)求的RepDB將自己的對(duì)應(yīng)的葉子節(jié)點(diǎn)的hash 取出來(lái)和此hash對(duì)應(yīng)的key及版本號(hào),再發(fā)回給對(duì)方,消息類型為REPDB—VERSION— LIST—RESPONSE。收到回應(yīng)的RepDB再把收到的版本號(hào)與本地的版本號(hào)相比較,若本 地版本大,則發(fā)送刷新報(bào)文,若本地版本小,則發(fā)送請(qǐng)求刷新報(bào)文。
實(shí)施本方法需要注意的是
1.master的選舉必須要在已經(jīng)收到了所有啟動(dòng)了的RepDB的心跳報(bào)文之后才可以進(jìn)行。2.在運(yùn)行過(guò)程中,只有在整個(gè)復(fù)制系統(tǒng)都準(zhǔn)備好以后,才允許client進(jìn)行更新操 作,系統(tǒng)準(zhǔn)備好以后,每個(gè)RepDB都會(huì)給本地的client發(fā)送REPDB—IS—READY消息,
系統(tǒng)準(zhǔn)備好的條件是所有RepDB都已經(jīng)穩(wěn)定,所有RepDB都已經(jīng)知道m(xù)aster是哪一臺(tái)主 機(jī)。3.在發(fā)送數(shù)據(jù)時(shí),如果出現(xiàn)發(fā)送錯(cuò)誤,則說(shuō)明某個(gè)主機(jī)出現(xiàn)了失效問(wèn)題,如果 出錯(cuò)的是master,則需要重新設(shè)置該主機(jī)為失效,同時(shí)修改記錄設(shè)備狀態(tài)的數(shù)據(jù)結(jié)構(gòu), 同時(shí)通知系統(tǒng)其它主機(jī)重新選舉master,如果是其他的非master主機(jī),只需要修改記錄設(shè) 備狀態(tài)的數(shù)據(jù)結(jié)構(gòu)就可以了。
權(quán)利要求
1.一種提供復(fù)制特性的分布式NOSQL數(shù)據(jù)庫(kù),其特征在于在每臺(tái)復(fù)制組的主機(jī)上 運(yùn)行復(fù)制系統(tǒng)軟件RepDB,系統(tǒng)軟件RepDB提供編程開發(fā)接口庫(kù)Rep—client,RepDB與 編程開發(fā)接口庫(kù)Rep—client進(jìn)程間通信通過(guò)環(huán)回地址Iocalhost實(shí)現(xiàn),RepDB在一個(gè)固定的端口上監(jiān)聽,Rep—client使用TCP協(xié)議連接這個(gè)端口 ; RepDB與編程開發(fā)接口庫(kù)Rep— client之間的通信有兩條鏈路,一條是控制鏈路,另一條是數(shù)據(jù)鏈路;數(shù)據(jù)鏈路用于數(shù)據(jù) 庫(kù)的更新或刪除操作,控制鏈路用于RepDB與Rep—client之間的消息傳送;RepDB只 有在穩(wěn)定以后才允許Rep—client與它通信,在RepDB準(zhǔn)備好以后,給使用服務(wù)的客戶端 進(jìn)程通過(guò)接口 Rep—client發(fā)送一個(gè)REPDB—IS—READY消息,表示Rep—client可以進(jìn)行 更新數(shù)據(jù)的操作,當(dāng)本機(jī)數(shù)據(jù)發(fā)生改變時(shí),RepDB通知Rep—client提醒進(jìn)程讀取,每個(gè) RepDB客戶端都可以更新數(shù)據(jù)庫(kù)中的數(shù)據(jù);復(fù)制組中所有主機(jī)使用相同的配置文件,配置文件中指定了包括復(fù)制組主機(jī)間心跳 的時(shí)間間隔、版本比較時(shí)間、監(jiān)聽端口的心跳信息,心跳信息使用UDP或鏈路層協(xié)議進(jìn) 行傳輸,每隔一段時(shí)間發(fā)送一次;主機(jī)之間通過(guò)心跳報(bào)文進(jìn)行信息傳遞,心跳信息在接 收后立即處理;心跳報(bào)文除了在每個(gè)時(shí)間間隔到達(dá)時(shí)發(fā)送心跳包之外,在本機(jī)數(shù)據(jù)庫(kù)有 數(shù)據(jù)時(shí),還將數(shù)據(jù)的相關(guān)信息傳遞給組中的每個(gè)主機(jī);在所有RepDB中選舉唯一一個(gè)協(xié)調(diào)者master,master在擔(dān)當(dāng)?shù)膮f(xié)調(diào)者的同時(shí),同樣 完成普通RepDB能完成的工作;對(duì)于各個(gè)RepDB的數(shù)據(jù)之間的版本的比較通過(guò)哈希樹來(lái)實(shí)現(xiàn);哈希樹葉子節(jié)點(diǎn)的個(gè) 數(shù)預(yù)先確定,計(jì)算某個(gè)葉子節(jié)點(diǎn)的hash值由key值計(jì)算得到;數(shù)據(jù)持久存儲(chǔ)使用Berkely DB創(chuàng)建的Key-Value數(shù)據(jù)庫(kù),在存儲(chǔ)時(shí),Value使用ver— num +value的方式組成,其中ver—num為版本信息,value為數(shù)據(jù)的實(shí)質(zhì)部分;在系統(tǒng)啟 動(dòng)時(shí),將Berkely DB中的除實(shí)質(zhì)數(shù)據(jù)外的Key和ver—num全部載入到RepDB進(jìn)程的內(nèi)存 中,在更新數(shù)據(jù)的時(shí)候既要修改Berkely DB中的數(shù)據(jù),也要修改內(nèi)存中的數(shù)據(jù)。
2.如權(quán)利要求1所述的提供復(fù)制特性的分布式NOSQL數(shù)據(jù)庫(kù),其特征在于所述計(jì) 算某個(gè)葉子節(jié)點(diǎn)的hash值由key值計(jì)算得到,方法如下將key值的每一字節(jié)相加得到 SUM,將SUM對(duì)哈希數(shù)葉子節(jié)點(diǎn)的個(gè)數(shù)取模,得到的一個(gè)整數(shù)Index,將該記錄放入哈希 樹Index節(jié)點(diǎn)下,每個(gè)哈希樹的節(jié)點(diǎn)中會(huì)有很多記錄與之對(duì)應(yīng),這些記錄我們按Key值進(jìn) 行排序,將排序后的Key放入內(nèi)存,對(duì)內(nèi)存中的數(shù)據(jù)使用MD5算法計(jì)算出數(shù)據(jù)摘要值。
3.如權(quán)利要求1所述的提供復(fù)制特性的分布式NOSQL數(shù)據(jù)庫(kù),其特征在于所述在 所有RepDB中選舉唯一一個(gè)協(xié)調(diào)者master,其選舉的規(guī)則A)如所有RepDB的數(shù)據(jù)庫(kù)中都沒(méi)有數(shù)據(jù),則按照大IP優(yōu)先或者大設(shè)備號(hào)優(yōu)先的原 則進(jìn)行選舉;B)如只有一個(gè)RepDB的數(shù)據(jù)庫(kù)有數(shù)據(jù),則選舉有數(shù)據(jù)的RepDB作為master;C)如果有多個(gè)RepDB有數(shù)據(jù),則在這些有數(shù)據(jù)的RepDB中按照A中的規(guī)則來(lái)進(jìn)行 master 選舉;正確的選出了 master,而master沒(méi)有出現(xiàn)異常的情況下,不再進(jìn)行master的選舉; master的選舉消息通過(guò)心跳在RepDB之間傳遞;若選舉的master失效,除修改記錄設(shè)備 狀態(tài)的數(shù)據(jù)結(jié)構(gòu)外,同時(shí)通知系統(tǒng)其它主機(jī)重新選舉master。
4.如權(quán)利要求1所述的提供復(fù)制特性的分布式NOSQL數(shù)據(jù)庫(kù),其特征在于數(shù)據(jù)庫(kù)中的數(shù)據(jù)同步的方法是(1)若master中沒(méi)有數(shù)據(jù),根據(jù)master的選舉規(guī)則,則系統(tǒng)中的所有RepDB都沒(méi)有 數(shù)據(jù),若新加入節(jié)點(diǎn)有數(shù)據(jù),將新加入節(jié)點(diǎn)的數(shù)據(jù)全部復(fù)制到當(dāng)前系統(tǒng)中;(2)若master中有數(shù)據(jù),則將master的葉子節(jié)點(diǎn)的hash值與發(fā)起同步節(jié)點(diǎn)的葉子節(jié) 點(diǎn)的hash值比較,若有不同,判斷系統(tǒng)中是否有在此葉子節(jié)點(diǎn)上與master hash值相同的 RepDB,如果沒(méi)有,將不同的葉子節(jié)點(diǎn)放入一個(gè)等待處理隊(duì)列中m—mapWaitForDeal ; map<intl6_t, time_t> m mapWaitForDeal ;其中map的首項(xiàng)為hash值不同的葉子節(jié)點(diǎn)在 merkle樹中的位置,time—t為發(fā)現(xiàn)差異時(shí)的時(shí)間戳;當(dāng)?shù)葔蛞欢ǖ臅r(shí)間后才向master發(fā) 出同步請(qǐng)求;如果在此葉子節(jié)點(diǎn)上存在與master的hash值相同的RepDB,則直接向此 RepDB發(fā)送同步請(qǐng)求,收到同步請(qǐng)求的RepDB將自己對(duì)應(yīng)的葉子節(jié)點(diǎn)的hash取出來(lái)和此 hash對(duì)應(yīng)的key及版本號(hào),發(fā)回給對(duì)方;收到回應(yīng)的RepDB再把收到的版本號(hào)與本地的 版本號(hào)相比較,若本地版本大,發(fā)送刷新報(bào)文,若本地版本小,則發(fā)送刷新請(qǐng)求報(bào)文。
5.如權(quán)利要求1所述的提供復(fù)制特性的分布式NOSQL數(shù)據(jù)庫(kù),其特征在于數(shù)據(jù)的 更新在每個(gè)Rep—client都可以進(jìn)行,RepDB對(duì)于要更新的數(shù)據(jù),每次都是先將更新操作連 帶數(shù)據(jù)一起發(fā)送給master,先由master給此更新操作分配一個(gè)版本號(hào),然后master再按照 要求更新master自己的數(shù)據(jù);要更新數(shù)據(jù)的RepDB拿到這個(gè)版本號(hào)之后,把它作為更新 數(shù)據(jù)的版本號(hào),再將數(shù)據(jù)發(fā)送給組里的其它RepDB,最后在RepDB發(fā)送完數(shù)據(jù)之后,還 要給master—個(gè)回應(yīng),表示數(shù)據(jù)已經(jīng)發(fā)送完成;在刪除操作中,master為刪除操作分配版本號(hào)后,master和其它接收刪除命令的 RepDB都將刪除的記錄存入數(shù)據(jù)庫(kù)的刪除表中。
全文摘要
本發(fā)明公開了一種提供復(fù)制特性的分布式NOSQL數(shù)據(jù)庫(kù)。在每臺(tái)復(fù)制組的主機(jī)上運(yùn)行復(fù)制系統(tǒng)軟件RepDB并與編程開發(fā)接口庫(kù)Rep_client通過(guò)環(huán)回地址localhost實(shí)現(xiàn)進(jìn)程間通信,RepDB在一個(gè)固定的端口上監(jiān)聽,RepDBclient使用TCP協(xié)議連接這個(gè)端口。RepDB與Rep_client之間有控制和數(shù)據(jù)兩條通信鏈路。復(fù)制組中所有主機(jī)中RepDB的配置文件相同。主機(jī)間通過(guò)心跳報(bào)文進(jìn)行信息傳遞,心跳信息在接收后立即處理。本機(jī)數(shù)據(jù)庫(kù)有數(shù)據(jù)更新時(shí)將數(shù)據(jù)傳遞給組中的每個(gè)主機(jī)。在所有RepDB中選舉一個(gè)協(xié)調(diào)者。用哈希樹實(shí)現(xiàn)對(duì)各個(gè)RepDB的數(shù)據(jù)之間版本比較。本發(fā)明實(shí)現(xiàn)了多機(jī)間數(shù)據(jù)的復(fù)制與數(shù)據(jù)的一致性,具有較強(qiáng)的容錯(cuò)性,用于高可靠、高性能的環(huán)境中。
文檔編號(hào)G06F17/30GK102012944SQ20101059123
公開日2011年4月13日 申請(qǐng)日期2010年12月16日 優(yōu)先權(quán)日2010年12月16日
發(fā)明者劉宇, 劉舒, 李曉峰, 胡術(shù), 莫思特, 邱敦國(guó), 黃戈 申請(qǐng)人:四川川大智勝軟件股份有限公司
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1