本申請(qǐng)涉及通信技術(shù)領(lǐng)域,尤其涉及一種解決數(shù)據(jù)沖突的方法和系統(tǒng)。
背景技術(shù):
當(dāng)前雙活或者多活系統(tǒng),允許數(shù)據(jù)從兩個(gè)或者多個(gè)節(jié)點(diǎn)寫入,同時(shí)需要將寫入的數(shù)據(jù)復(fù)制到其它節(jié)點(diǎn)中,使得多個(gè)節(jié)點(diǎn)上的數(shù)據(jù)達(dá)到一致。
當(dāng)多個(gè)節(jié)點(diǎn)同時(shí)對(duì)一份數(shù)據(jù)進(jìn)行修改時(shí),由于寫入時(shí)序和網(wǎng)絡(luò)、磁盤等原因造成寫入先后順序的不一致,出現(xiàn)數(shù)據(jù)沖突,從而多節(jié)點(diǎn)都寫入成功的情況下,數(shù)據(jù)在多個(gè)節(jié)點(diǎn)上處于不一致的狀態(tài),導(dǎo)致從不同節(jié)點(diǎn)讀取出來(lái)的數(shù)據(jù)不一樣。例如,三個(gè)節(jié)點(diǎn)分別對(duì)C進(jìn)行修改,由于寫入順序不一致,導(dǎo)致三個(gè)節(jié)點(diǎn)最終的數(shù)據(jù)不相同。
現(xiàn)有技術(shù)為了處理這種從多個(gè)節(jié)點(diǎn)同時(shí)寫入數(shù)據(jù)導(dǎo)致數(shù)據(jù)沖突,造成多節(jié)點(diǎn)間數(shù)據(jù)不一致的場(chǎng)景,提出了兩種比較通用的解決方法。
第一種解決方法是利用分布式鎖來(lái)解決多個(gè)節(jié)點(diǎn)之間數(shù)據(jù)沖突的問(wèn)題。向節(jié)點(diǎn)寫入數(shù)據(jù)時(shí)先向分布式鎖服務(wù)器申請(qǐng)鎖,寫完數(shù)據(jù)后再釋放鎖。這種方式能夠保證同一份數(shù)據(jù)的修改在不同節(jié)點(diǎn)操作串行進(jìn)行,從而保證了不會(huì)出現(xiàn)多節(jié)點(diǎn)數(shù)據(jù)不一致的情況。例如Node1、Node2和Node3上都存儲(chǔ)有數(shù)據(jù)C,現(xiàn)在三個(gè)節(jié)點(diǎn)需要分別對(duì)數(shù)據(jù)C進(jìn)行修改時(shí),Node1先向分布式鎖服務(wù)器申請(qǐng)到數(shù)據(jù)C的鎖,則三個(gè)節(jié)點(diǎn)都修改為C1,然后Node2向分布式鎖服務(wù)器申請(qǐng)到數(shù)據(jù)C的鎖,則三個(gè)節(jié)點(diǎn)都修改為C2,最后Node3向分布式鎖服務(wù)器申請(qǐng)到C的鎖,則三個(gè)節(jié)點(diǎn)都修改為C3。最后三個(gè)節(jié)點(diǎn)中的數(shù)據(jù)一致,都為C3。不過(guò)此方法在沒(méi)有寫沖突時(shí)會(huì)產(chǎn)生無(wú)效的鎖申請(qǐng),導(dǎo)致系統(tǒng)整體性能下降。
第二種解決方法是采用優(yōu)先級(jí)鎖來(lái)解決多個(gè)節(jié)點(diǎn)之間數(shù)據(jù)沖突的問(wèn)題。在配置系統(tǒng)中各個(gè)節(jié)點(diǎn)的多活關(guān)系時(shí),確定各個(gè)節(jié)點(diǎn)的優(yōu)先級(jí),當(dāng)往節(jié)點(diǎn)中寫入數(shù)據(jù)時(shí)首先向分布式鎖服務(wù)器嘗試去申請(qǐng)鎖(try lock),試鎖申請(qǐng)成功后,各個(gè)節(jié)點(diǎn)并發(fā)寫入數(shù)據(jù)。當(dāng)有寫入沖突出現(xiàn)死鎖時(shí)根據(jù)各個(gè)節(jié)點(diǎn)的優(yōu)先級(jí)強(qiáng)制解除優(yōu)先級(jí)低的節(jié)點(diǎn)的鎖,待優(yōu)先級(jí)高的節(jié)點(diǎn)寫完數(shù)據(jù)之后優(yōu)先級(jí)較低的節(jié)點(diǎn)對(duì)應(yīng)的數(shù)據(jù)進(jìn)行重寫。當(dāng)系統(tǒng)中的節(jié)點(diǎn)數(shù)量較多形成集群時(shí),鎖申請(qǐng)成為一個(gè)集群內(nèi)的分布式鎖,導(dǎo)致系統(tǒng)的性能下降,通用性不好。
技術(shù)實(shí)現(xiàn)要素:
本申請(qǐng)?zhí)峁┮环N解決數(shù)據(jù)沖突的方法系統(tǒng),。
第一方面,提供一種多活系統(tǒng)中解決數(shù)據(jù)沖突的方法,多活系統(tǒng)包含接入節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn),方法包括:接入節(jié)點(diǎn)接收客戶端發(fā)送的第一數(shù)據(jù)更新請(qǐng)求,并對(duì)第一數(shù)據(jù)更新請(qǐng)求生成一個(gè)全球唯一的版本號(hào);接入節(jié)點(diǎn)向存儲(chǔ)節(jié)點(diǎn)發(fā)送第二數(shù)據(jù)更新請(qǐng)求,第二數(shù)據(jù)更新請(qǐng)求中攜帶所述版本號(hào);存儲(chǔ)節(jié)點(diǎn)根據(jù)第二數(shù)據(jù)更新請(qǐng)求更新對(duì)應(yīng)的數(shù)據(jù),更新偏序關(guān)系,并向接入節(jié)點(diǎn)返回所述偏序關(guān)系;其中,偏序關(guān)系用于記錄存儲(chǔ)節(jié)點(diǎn)接收到的數(shù)據(jù)更新請(qǐng)求的版本號(hào)的先后順序;接入節(jié)點(diǎn)獲取所述存儲(chǔ)節(jié)點(diǎn)返回的偏序關(guān)系,判斷存儲(chǔ)節(jié)點(diǎn)中的所述數(shù)據(jù)是否存在沖突;當(dāng)存儲(chǔ)節(jié)點(diǎn)中的所述數(shù)據(jù)存在沖突時(shí),接入節(jié)點(diǎn)調(diào)整所述沖突。
這樣,只有當(dāng)存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)存在沖突時(shí),接收節(jié)點(diǎn)才調(diào)整數(shù)據(jù)存在的沖突,當(dāng)存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)不存在沖突時(shí),接收節(jié)點(diǎn)正常執(zhí)行數(shù)據(jù)更新操作,大大提高了了數(shù)據(jù)的更新效率。
在一種可能的設(shè)計(jì)中,接入節(jié)點(diǎn)判斷存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)是否存在沖突具體為:當(dāng)獲取到的存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系不一致時(shí),接入節(jié)點(diǎn)判斷所述存儲(chǔ)節(jié)點(diǎn)中的所述數(shù)據(jù)存在沖突。
通過(guò)增加數(shù)據(jù)操作請(qǐng)求的版本號(hào)的偏序關(guān)系,接入節(jié)點(diǎn)可以根據(jù)偏序關(guān)系來(lái)判斷存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)是否一致,能夠快速的識(shí)別出存儲(chǔ)節(jié)點(diǎn)中存在的數(shù)據(jù)沖突,提高系統(tǒng)的性能。
在一種可能的設(shè)計(jì)中,接入節(jié)點(diǎn)判斷存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)是否存在沖突具體為:當(dāng)接收到的存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系不一致時(shí),在預(yù)定的時(shí)間周期內(nèi)接入節(jié)點(diǎn)重新獲取所述存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系,當(dāng)重新獲取的所述存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系不一致時(shí),接入節(jié)點(diǎn)判斷存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)存在沖突。
由于各個(gè)存儲(chǔ)節(jié)點(diǎn)接收數(shù)據(jù)更新請(qǐng)求的順序和時(shí)間不完全一致,因此不同時(shí)間獲取的偏序關(guān)系可能會(huì)不同。并且當(dāng)不同存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系不相同時(shí),可能有接收節(jié)點(diǎn)會(huì)調(diào)整數(shù)據(jù)沖突,因此可以設(shè)定一個(gè)時(shí)間周期,在設(shè)定的時(shí)間周期內(nèi),接收節(jié)點(diǎn)可以多次獲取存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系進(jìn)行比較,而不是一發(fā)現(xiàn)偏序關(guān)系不一致就馬上進(jìn)行調(diào)整,以提高解決數(shù)據(jù)沖突的效率。
在一種可能的設(shè)計(jì)中,接入節(jié)點(diǎn)調(diào)整所述沖突具體為:接入節(jié)點(diǎn)根據(jù)沖突調(diào)整策略向存儲(chǔ)節(jié)點(diǎn)發(fā)送第三數(shù)據(jù)更新請(qǐng)求,第三數(shù)據(jù)更新請(qǐng)求中包含需要調(diào)整的偏序關(guān)系;存儲(chǔ)節(jié)點(diǎn)接收到第三數(shù)據(jù)更新請(qǐng)求之后,根據(jù)需要調(diào)整的偏序關(guān)系更新存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)。
在一可能的設(shè)計(jì)中,沖突調(diào)整策略包括存儲(chǔ)節(jié)點(diǎn)優(yōu)先級(jí)策略和偏序關(guān)系優(yōu)先級(jí)策略。存儲(chǔ)節(jié)點(diǎn)優(yōu)先級(jí)策略為以優(yōu)先級(jí)高的存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系來(lái)調(diào)整優(yōu)先級(jí)低的存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)。偏序關(guān)系優(yōu)先級(jí)策略為按所述偏序關(guān)系中的版本號(hào)的大小順序調(diào)整所述存儲(chǔ)節(jié)點(diǎn)中的所述數(shù)據(jù)。
存儲(chǔ)節(jié)點(diǎn)中數(shù)據(jù)沖突的解決需要有一致的策略,這樣能夠在確定存在沖突以后快速的解決。沖突調(diào)整策略的具體內(nèi)容和實(shí)現(xiàn)在上文實(shí)施例中已有詳細(xì)的說(shuō)明和舉例,在本實(shí)施例中不再另行說(shuō)明。
第二方面,提供一種多活系統(tǒng),所述多活系統(tǒng)中包含多個(gè)接入節(jié)點(diǎn)和多個(gè)存儲(chǔ)節(jié)點(diǎn),接入節(jié)點(diǎn)與客戶端連接,接入節(jié)點(diǎn)用于接收客戶端發(fā)送的第一數(shù)據(jù)更新請(qǐng)求,并對(duì)第一數(shù)據(jù)更新請(qǐng)求生成一個(gè)全球唯一的版本號(hào);向存儲(chǔ)節(jié)點(diǎn)發(fā)送第二數(shù)據(jù)更新請(qǐng)求,第二數(shù)據(jù)更新請(qǐng)求中攜帶所述版本號(hào);存儲(chǔ)節(jié)點(diǎn)用于根據(jù)第二數(shù)據(jù)更新請(qǐng)求更新對(duì)應(yīng)的數(shù)據(jù),更新偏序關(guān)系,并向接入節(jié)點(diǎn)返回所述偏序關(guān)系;其中,偏序關(guān)系用于記錄存儲(chǔ)節(jié)點(diǎn)接收到的數(shù)據(jù)更新請(qǐng)求的版本號(hào)的先后順序;接入節(jié)點(diǎn)還用于獲取存儲(chǔ)節(jié)點(diǎn)返回的偏序關(guān)系,判斷存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)是否存在沖突;當(dāng)存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)存在沖突時(shí),調(diào)整所述沖突。
在一種可能的設(shè)計(jì)中,接入節(jié)點(diǎn)用于判斷所述存儲(chǔ)節(jié)點(diǎn)中的述數(shù)據(jù)是否存在沖突具體為:當(dāng)獲取到的存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系不一致時(shí),判斷所述存儲(chǔ)節(jié)點(diǎn)中的所述數(shù)據(jù)存在沖突。
在一種可能的設(shè)計(jì)中,接入節(jié)點(diǎn)用于判斷存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)是否存在沖突具體為:當(dāng)接收到的存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系不一致時(shí),在預(yù)定的時(shí)間周期內(nèi)接入節(jié)點(diǎn)重新獲取存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系,當(dāng)重新獲取的所述存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系不一致時(shí),判斷存儲(chǔ)節(jié)點(diǎn)中的所述數(shù)據(jù)存在沖突。
在一種可能的設(shè)計(jì)中,接入節(jié)點(diǎn)用于調(diào)整所述沖突具體為:
根據(jù)沖突調(diào)整策略向存儲(chǔ)節(jié)點(diǎn)發(fā)送第三數(shù)據(jù)更新請(qǐng)求,第三數(shù)據(jù)更新請(qǐng)求中包含需要調(diào)整的偏序關(guān)系;其中,沖突調(diào)整策略包括存儲(chǔ)節(jié)點(diǎn)優(yōu)先級(jí)策略和偏序關(guān)系優(yōu)先級(jí)策略;存儲(chǔ)節(jié)點(diǎn)還用于接收到第三數(shù)據(jù)更新請(qǐng)求之后,根據(jù)需要調(diào)整的偏序關(guān)系更新存儲(chǔ)節(jié)點(diǎn)中的所述數(shù)據(jù)。
在一種可能的設(shè)計(jì)中,接入節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)位于同一物理設(shè)備中。
第三方面,提供一種解決數(shù)據(jù)沖突的裝置,包括處理器,通信總線、存儲(chǔ)器和通信接口,處理器用于執(zhí)行上述的解決數(shù)據(jù)沖突的方法,在此不再另行說(shuō)明。
另外,第二方面和第三方面中任一種設(shè)計(jì)方式所帶來(lái)的技術(shù)效果可參見(jiàn)第一方面中不同設(shè)計(jì)方式所帶來(lái)的技術(shù)效果,此處不再贅述。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)單地介紹。
圖1為本申請(qǐng)實(shí)施例提供的多活系統(tǒng)的結(jié)構(gòu)示意圖;
圖2為本申請(qǐng)實(shí)施例提供的解決數(shù)據(jù)沖突的方法流程示意圖;
圖3為本申請(qǐng)實(shí)施例提供的的解決數(shù)據(jù)沖突的裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
本發(fā)明實(shí)施例提供一種解決數(shù)據(jù)沖突的方法和系統(tǒng),可以快速識(shí)別數(shù)據(jù)沖突并解決數(shù)據(jù)沖突,系統(tǒng)的寫入性能更高。
本發(fā)明實(shí)施例涉及雙活或者多活系統(tǒng),在本發(fā)明實(shí)施例中,以多活系統(tǒng)為例來(lái)進(jìn)行說(shuō)明。如附圖1所示,多活系統(tǒng)10分為三個(gè)邏輯層:客戶端層11,接入節(jié)點(diǎn)層12和存儲(chǔ)節(jié)點(diǎn)層13。
客戶端層11:用戶通過(guò)客戶端輸入數(shù)據(jù),客戶端把數(shù)據(jù)發(fā)送給接收節(jié)點(diǎn)。
接收節(jié)點(diǎn)層12:接收客戶端發(fā)送的數(shù)據(jù),并把接收的數(shù)據(jù)寫入存儲(chǔ)節(jié)點(diǎn)中。
存儲(chǔ)節(jié)點(diǎn)層13:存儲(chǔ)數(shù)據(jù)。
在物理上客戶端、接入節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)可以在同一個(gè)物理設(shè)備(例如節(jié)點(diǎn)設(shè)備)上,也可以在不同的物理設(shè)備上,在本發(fā)明實(shí)施例中不做限定。
發(fā)明人在發(fā)明過(guò)程中發(fā)現(xiàn):在雙活和多活場(chǎng)景下雖然允許從多個(gè)節(jié)點(diǎn)同時(shí)寫入數(shù)據(jù),但是多個(gè)節(jié)點(diǎn)同時(shí)對(duì)同一份數(shù)據(jù)進(jìn)行更新操作的概率不大?,F(xiàn)有技術(shù)中為了防止多個(gè)節(jié)點(diǎn)同時(shí)對(duì)同一份數(shù)據(jù)進(jìn)行更新的操作,對(duì)每一次的數(shù)據(jù)操作都假設(shè)有其他節(jié)點(diǎn)在對(duì)同一份數(shù)據(jù)進(jìn)行更新操作,造成正常場(chǎng)景下多個(gè)節(jié)點(diǎn)不對(duì)同一份數(shù)據(jù)進(jìn)行更新的操作的寫性能低。
因此,在本發(fā)明中,首先認(rèn)為節(jié)點(diǎn)對(duì)數(shù)據(jù)進(jìn)行更新操作時(shí)絕大多數(shù)是沒(méi)有沖突的,多個(gè)節(jié)點(diǎn)對(duì)同一份數(shù)據(jù)同時(shí)進(jìn)行更新操作的概率小。因此,多活系統(tǒng)中對(duì)數(shù)據(jù)進(jìn)行更新操作時(shí)先將數(shù)據(jù)寫入存儲(chǔ)節(jié)點(diǎn),數(shù)據(jù)寫入后發(fā)現(xiàn)有沖突再解決數(shù)據(jù)沖突。
以附圖1所示的系統(tǒng)架構(gòu)示意圖為例,多活系統(tǒng)中接收節(jié)點(diǎn)層包括接收節(jié)點(diǎn)1和接收節(jié)點(diǎn)2,存儲(chǔ)節(jié)點(diǎn)層包括存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2。接收節(jié)點(diǎn)1可以更新存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2中的數(shù)據(jù);接收節(jié)點(diǎn)2可以更新存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2中的數(shù)據(jù)。本發(fā)明實(shí)施例中的接收節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)的數(shù)量?jī)H為示例性說(shuō)明,接收節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)的數(shù)量可以根據(jù)業(yè)務(wù)或者用戶的需求來(lái)設(shè)定。
下文將描述在附圖1所示的多活系統(tǒng)中本發(fā)明實(shí)施例提出的解決數(shù)據(jù)沖突的方法。
為了便于說(shuō)明,存儲(chǔ)節(jié)點(diǎn)1上已經(jīng)存儲(chǔ)有數(shù)據(jù),為了與存儲(chǔ)節(jié)點(diǎn)1中其他的數(shù)據(jù)區(qū)分,將存儲(chǔ)節(jié)點(diǎn)中已經(jīng)存儲(chǔ)的數(shù)據(jù)稱為V1,數(shù)據(jù)V1的鍵值(key)為K1,版本號(hào)為Ver1,為了和后續(xù)更新的數(shù)據(jù)區(qū)別,將存儲(chǔ)節(jié)點(diǎn)1中的該數(shù)據(jù)記錄為K1(V1,[Ver1])。存儲(chǔ)節(jié)點(diǎn)2中存儲(chǔ)的數(shù)據(jù)V1與存儲(chǔ)節(jié)點(diǎn)1中的數(shù)據(jù)V1相同,也記錄為K1(V1,[Ver1])。存儲(chǔ)節(jié)點(diǎn)3中存儲(chǔ)的數(shù)據(jù)V1與存儲(chǔ)節(jié)點(diǎn)1中的數(shù)據(jù)V1相同,也記錄為K1(V1,[Ver1])。
其中,版本號(hào)是接收節(jié)點(diǎn)接收到數(shù)據(jù)操作指令時(shí)為數(shù)據(jù)分配的全球唯一的版本號(hào),并且和數(shù)據(jù)一起存儲(chǔ)到存儲(chǔ)節(jié)點(diǎn)中。版本號(hào)可以用于區(qū)不同的數(shù)據(jù)更新操作。在本發(fā)明實(shí)施例中,為了便于識(shí)別,將版本號(hào)記錄為Ver1,實(shí)際應(yīng)用中,版本號(hào)可以是多個(gè)字母和/或數(shù)字的組合。版本號(hào)的計(jì)算可以利用現(xiàn)有的算法實(shí)現(xiàn),在本發(fā)明實(shí)施例中不再另行描述。
現(xiàn)在,有多個(gè)系統(tǒng)對(duì)數(shù)據(jù)K1進(jìn)行更新操作。例如客戶端1對(duì)數(shù)據(jù)K1對(duì)更新,更新的數(shù)據(jù)為V2??蛻舳?對(duì)數(shù)據(jù)K1對(duì)應(yīng)的數(shù)據(jù)進(jìn)行更新,更新的數(shù)據(jù)為V3。本發(fā)明實(shí)施例提供的解決數(shù)據(jù)沖突的方法如下文所述,如附圖2所示。
步驟201:接入節(jié)點(diǎn)接收客戶端發(fā)送的數(shù)據(jù)更新請(qǐng)求,并對(duì)所述數(shù)據(jù)更新操作生成一個(gè)全球唯一的版本號(hào)。
將客戶端發(fā)送給接入節(jié)點(diǎn)的數(shù)據(jù)更新請(qǐng)求稱為第一數(shù)據(jù)更新請(qǐng)求,以和下文的其他數(shù)據(jù)更新請(qǐng)求相區(qū)分
該版本號(hào)用于識(shí)別數(shù)據(jù)更新請(qǐng)求,由于版本號(hào)是全球唯一的版本號(hào),因此每一次數(shù)據(jù)更新請(qǐng)求都可以與其他的數(shù)據(jù)更新請(qǐng)求相區(qū)別。
例如,接入節(jié)點(diǎn)1接收到客戶端1的數(shù)據(jù)更新請(qǐng)求put(k1,V2),即對(duì)數(shù)據(jù)K1數(shù)據(jù)進(jìn)行更新,更新的數(shù)據(jù)內(nèi)容為V2,接入節(jié)點(diǎn)1為此次數(shù)據(jù)更新請(qǐng)求生成全局唯一的版本號(hào)Ver2。接入節(jié)點(diǎn)2接收到客戶端2的數(shù)據(jù)更新請(qǐng)求put(k1,V3),即對(duì)數(shù)據(jù)K1進(jìn)行更新,更新的數(shù)據(jù)內(nèi)容為V3,接入節(jié)點(diǎn)為此次數(shù)據(jù)更新請(qǐng)求接入生成全局唯一的版本號(hào)Ver3。
步驟203:接入節(jié)點(diǎn)向存儲(chǔ)節(jié)點(diǎn)發(fā)送數(shù)據(jù)更新請(qǐng)求,數(shù)據(jù)更新請(qǐng)求中包含所述版本號(hào)。
接入節(jié)點(diǎn)向存儲(chǔ)節(jié)點(diǎn)發(fā)送的數(shù)據(jù)更新請(qǐng)求中包含的內(nèi)容不相同,為了以示區(qū)別,將這里的數(shù)據(jù)更新請(qǐng)求稱為第二數(shù)據(jù)更新請(qǐng)求。第二數(shù)據(jù)更新請(qǐng)求中包含了接入節(jié)點(diǎn)為第一數(shù)據(jù)更新請(qǐng)求生成的版本號(hào)。
接入節(jié)點(diǎn)接收到客戶端發(fā)送的第一數(shù)據(jù)更新請(qǐng)求后,為第一數(shù)據(jù)更新請(qǐng)求生成一個(gè)全球唯一的版本號(hào),向存儲(chǔ)節(jié)點(diǎn)發(fā)送包含了該版本號(hào)的第二數(shù)據(jù)更新請(qǐng)求。多活系統(tǒng)中會(huì)包含多個(gè)接入節(jié)點(diǎn)和多個(gè)存儲(chǔ)節(jié)點(diǎn),因此接入節(jié)點(diǎn)會(huì)把第二數(shù)據(jù)更新請(qǐng)求發(fā)送給多活系統(tǒng)中的所有的存儲(chǔ)節(jié)點(diǎn),以此保證這些存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)保持一致。
例如,接入節(jié)點(diǎn)1分別向存儲(chǔ)節(jié)點(diǎn)1、存儲(chǔ)節(jié)點(diǎn)2和存儲(chǔ)節(jié)點(diǎn)3發(fā)送包含了版本號(hào)的數(shù)據(jù)更新請(qǐng)求put(K1,V2,Ver2)。接入節(jié)點(diǎn)2分別向存儲(chǔ)節(jié)點(diǎn)1、存儲(chǔ)節(jié)點(diǎn)2和存儲(chǔ)節(jié)點(diǎn)3發(fā)送包含了數(shù)據(jù)和數(shù)據(jù)版本號(hào)數(shù)據(jù)更新請(qǐng)求put(K1,V3,Ver3)。
步驟205:存儲(chǔ)節(jié)點(diǎn)根據(jù)第二數(shù)據(jù)更新請(qǐng)求對(duì)對(duì)應(yīng)的數(shù)據(jù)進(jìn)行更新,記錄偏序關(guān)系,并向接入節(jié)點(diǎn)返回該偏序關(guān)系。偏序關(guān)系用于記錄該存儲(chǔ)節(jié)點(diǎn)接收到的數(shù)據(jù)更新請(qǐng)求的版本號(hào)的先后順序。
存儲(chǔ)節(jié)點(diǎn)接收到接入節(jié)點(diǎn)發(fā)送的包含了版本號(hào)的數(shù)據(jù)更新請(qǐng)求之后,根據(jù)數(shù)據(jù)更新請(qǐng)求中的key值找到對(duì)應(yīng)的數(shù)據(jù),并按接收到數(shù)據(jù)更新請(qǐng)求的順序?qū)?shù)據(jù)進(jìn)行更新操作,記錄數(shù)據(jù)更新請(qǐng)求的版本號(hào)的先后順序,即偏序關(guān)系,將偏序關(guān)系返回給接入節(jié)點(diǎn)。
偏序關(guān)系用于記錄存儲(chǔ)節(jié)點(diǎn)接收到的數(shù)據(jù)更新請(qǐng)求的版本號(hào)的先后順序。存儲(chǔ)節(jié)點(diǎn)接收到數(shù)據(jù)更新請(qǐng)求之后更新一次數(shù)據(jù)即相應(yīng)的更新一次偏序關(guān)系。因此在不同的時(shí)間獲取到的偏序關(guān)系有可能不同。
另外,偏序關(guān)系中的版本號(hào)信息可以按一定的規(guī)則老化,比如當(dāng)偏序關(guān)系中的版本號(hào)信息達(dá)到一定數(shù)量時(shí),將最早的版本號(hào)信息從偏序關(guān)系中刪除;或者當(dāng)系統(tǒng)中所有存儲(chǔ)節(jié)點(diǎn)中同一數(shù)據(jù)的偏序關(guān)系中的某些版本號(hào)信息的順序完全一致時(shí),可以將這部份順序完全相同的版本號(hào)信息從偏序關(guān)系中刪除。在本申請(qǐng)實(shí)施例中,不涉及偏序關(guān)系的老化,因此不再詳細(xì)描述。
在本申請(qǐng)實(shí)施例中,由于接入節(jié)點(diǎn)1和接入節(jié)點(diǎn)2是并發(fā)向存儲(chǔ)節(jié)點(diǎn)寫入數(shù)據(jù)的,因此各個(gè)存儲(chǔ)節(jié)點(diǎn)接收到的對(duì)同一數(shù)據(jù)的數(shù)據(jù)更新請(qǐng)求的順序可能是一樣的,也可以是不一樣的。因此存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系可能相同也可能不相同。
例如:存儲(chǔ)節(jié)點(diǎn)1先接收到接入節(jié)點(diǎn)1發(fā)送的對(duì)數(shù)據(jù)K1的數(shù)據(jù)更新請(qǐng)求put(K1,V2,Ver2),即需要對(duì)數(shù)據(jù)K1進(jìn)行更新操作,更新的數(shù)據(jù)內(nèi)容為V2,數(shù)據(jù)更新請(qǐng)求的版本號(hào)為Ver2。如上文所述,存儲(chǔ)節(jié)點(diǎn)1中已經(jīng)有數(shù)據(jù)K1的版本號(hào)為Ver1,存儲(chǔ)節(jié)點(diǎn)1根據(jù)V2對(duì)數(shù)據(jù)K1進(jìn)行更新之后,更新偏序關(guān)系為[Ver2<-Ver1],返回給接入節(jié)點(diǎn)1的偏序關(guān)系為[Ver2,Ver1]。存儲(chǔ)節(jié)點(diǎn)1接收到接入節(jié)點(diǎn)2發(fā)送的對(duì)數(shù)據(jù)K1的數(shù)據(jù)更新請(qǐng)求put(K1,V3,Ver3),即存儲(chǔ)節(jié)點(diǎn)1對(duì)數(shù)據(jù)K1進(jìn)行更新操作數(shù)據(jù)內(nèi)容為V3,數(shù)據(jù)更新請(qǐng)求的版本號(hào)為Ver3;存儲(chǔ)節(jié)點(diǎn)1對(duì)數(shù)據(jù)K1根據(jù)V3更新之后,更新偏序關(guān)系為[Ver3<-Ver2<-Ver1],返回給接入節(jié)點(diǎn)2的偏序關(guān)系為[Ver3,Ver2,Ver1]。
存儲(chǔ)節(jié)點(diǎn)2先接收到接入節(jié)點(diǎn)2發(fā)送的對(duì)數(shù)據(jù)K1的數(shù)據(jù)更新請(qǐng)求put(K1,V3,Ver3),即存儲(chǔ)節(jié)點(diǎn)2對(duì)數(shù)據(jù)K1進(jìn)行更新操作數(shù)據(jù)內(nèi)容為V3,數(shù)據(jù)更新請(qǐng)求版本號(hào)為Ver3;存儲(chǔ)節(jié)點(diǎn)2對(duì)數(shù)據(jù)K1根據(jù)V3更新之后,更新偏序關(guān)系為[Ver3<-Ver1],返回給接入節(jié)點(diǎn)2的偏序關(guān)系為[Ver3,Ver1]。存儲(chǔ)節(jié)點(diǎn)2接收到接入節(jié)點(diǎn)1發(fā)送的對(duì)數(shù)據(jù)K1的數(shù)據(jù)更新請(qǐng)求put(K1,V2,Ver2),即需要對(duì)數(shù)據(jù)K1進(jìn)行更新操作,更新的數(shù)據(jù)內(nèi)容為V2,數(shù)據(jù)更新請(qǐng)求的版本號(hào)為Ver2。存儲(chǔ)節(jié)點(diǎn)2對(duì)數(shù)據(jù)K1根據(jù)V3更新之后,更新偏序關(guān)系為[Ver2<-Ver3<-Ver1],返回給接入節(jié)點(diǎn)1的偏序關(guān)系為[Ver2,Ver3,Ver1]。
步驟207:接入節(jié)點(diǎn)獲取存儲(chǔ)節(jié)點(diǎn)返回的偏序關(guān)系,判斷存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)是否存在沖突。
在本申請(qǐng)實(shí)施例中,存儲(chǔ)節(jié)點(diǎn)在對(duì)數(shù)據(jù)進(jìn)行更新操作后更新了偏序關(guān)系,因此偏序關(guān)系可以體現(xiàn)存儲(chǔ)節(jié)點(diǎn)中對(duì)同一數(shù)據(jù)的更新順序。因此接收節(jié)點(diǎn)可以根據(jù)系統(tǒng)中的多個(gè)存儲(chǔ)節(jié)點(diǎn)返回的同一數(shù)據(jù)的偏序關(guān)系是否一致來(lái)判斷系統(tǒng)中的多個(gè)存儲(chǔ)節(jié)點(diǎn)中的同一數(shù)據(jù)是否有沖突。
判斷存儲(chǔ)節(jié)點(diǎn)返回的偏序關(guān)系是否一致的方法如下:
1)系統(tǒng)中存儲(chǔ)節(jié)點(diǎn)返回的偏序關(guān)系相同,也就是說(shuō)這些存儲(chǔ)節(jié)點(diǎn)對(duì)同一數(shù)據(jù)的更新的順序是相同的,此時(shí)這些存儲(chǔ)節(jié)點(diǎn)中存儲(chǔ)的同一數(shù)據(jù)的內(nèi)容相同,沒(méi)有沖突。
b)系統(tǒng)中存儲(chǔ)節(jié)點(diǎn)返回的偏序關(guān)系不相同,則說(shuō)明各個(gè)存儲(chǔ)節(jié)點(diǎn)對(duì)同一數(shù)據(jù)的更新的順序不相同,此時(shí)這些存儲(chǔ)節(jié)點(diǎn)中存儲(chǔ)的同一數(shù)據(jù)的內(nèi)容不相同,有沖突。
可選的,當(dāng)存儲(chǔ)節(jié)點(diǎn)返回的偏序關(guān)系不相同時(shí),考慮到各個(gè)存儲(chǔ)節(jié)點(diǎn)接收到的數(shù)據(jù)更新請(qǐng)求的順序不完全一樣,因此可以設(shè)定一個(gè)時(shí)間周期,在設(shè)定的時(shí)間周期內(nèi)接入節(jié)點(diǎn)多次獲取存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系,以最后獲取的偏序關(guān)系來(lái)來(lái)確定存儲(chǔ)節(jié)點(diǎn)中存儲(chǔ)的同一數(shù)據(jù)是否存在沖突。
可選的,當(dāng)多個(gè)存儲(chǔ)節(jié)點(diǎn)返回的偏序關(guān)系不相同時(shí),還可以進(jìn)一步判斷偏序關(guān)系中的第一個(gè)版本號(hào)是否相同,當(dāng)偏序關(guān)系中的第一個(gè)版本號(hào)相同時(shí),還可以選擇偏序關(guān)系中版本號(hào)少的存儲(chǔ)節(jié)點(diǎn)再次獲取偏序關(guān)系進(jìn)行比較。
以上述例子中存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2的偏序關(guān)系為例進(jìn)行說(shuō)明。
接入節(jié)點(diǎn)1接收到的存儲(chǔ)節(jié)點(diǎn)1返回的數(shù)據(jù)K1的偏序關(guān)系為[Ver2,Ver1],接入節(jié)點(diǎn)1接收到的存儲(chǔ)節(jié)點(diǎn)2返回的數(shù)據(jù)K1的偏序關(guān)系為[Ver3,Ver1]。接入節(jié)點(diǎn)1判斷存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2返回的偏序關(guān)系不相同。此時(shí)可以確定存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2中存儲(chǔ)的數(shù)據(jù)K1不一致,有沖突??蛇x的,如果設(shè)定有偏序關(guān)系的獲取時(shí)間,若還在偏序關(guān)系獲取時(shí)間的時(shí)間范圍內(nèi),接入節(jié)點(diǎn)1可以再次從存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2獲取數(shù)據(jù)K1的偏序關(guān)系。在本申請(qǐng)實(shí)施例中,接入節(jié)點(diǎn)1再次從存儲(chǔ)節(jié)點(diǎn)1獲取的偏序關(guān)系為[Ver3,Ver2,Ver1],此時(shí)如存儲(chǔ)節(jié)點(diǎn)2返回的偏序關(guān)系還沒(méi)更新,還是[Ver3,Ver1]。接入節(jié)點(diǎn)1確認(rèn)存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2返回的偏序關(guān)系不相同,此時(shí)可以確定存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2中存儲(chǔ)的數(shù)據(jù)K1不一致,有沖突。
可選的,接入節(jié)點(diǎn)1判斷存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2的偏序關(guān)系不相同,但是此時(shí)兩個(gè)偏序關(guān)系的第一個(gè)版本號(hào)相同,都是Ver3;而存儲(chǔ)節(jié)點(diǎn)2的偏序關(guān)系中的版本號(hào)的數(shù)量較少,接入節(jié)點(diǎn)1再?gòu)拇鎯?chǔ)節(jié)點(diǎn)2獲取偏序關(guān)系,此時(shí)存儲(chǔ)節(jié)點(diǎn)2的偏序關(guān)系為[Ver2<-Ver3<-Ver1],接入節(jié)點(diǎn)1確認(rèn)存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2返回的偏序關(guān)系不相同,此時(shí)可以確定存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2中存儲(chǔ)的數(shù)據(jù)K1不一致,有沖突。
可選的,接入節(jié)點(diǎn)1判斷存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2的偏序關(guān)系不相同,若設(shè)定有偏序關(guān)系的獲取時(shí)間,且還在偏序關(guān)系獲取時(shí)間的時(shí)間段內(nèi),接入節(jié)點(diǎn)1可以再?gòu)拇鎯?chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2讀取數(shù)據(jù)K1的偏序關(guān)系。當(dāng)接入節(jié)點(diǎn)1從存儲(chǔ)節(jié)點(diǎn)1獲取的數(shù)據(jù)K1的偏序關(guān)系為[Ver3,Ver2,Ver1],從存儲(chǔ)節(jié)點(diǎn)2獲取的數(shù)據(jù)K1的偏序關(guān)系為[Ver2,Ver3,Ver1]。此時(shí)接入節(jié)點(diǎn)1判斷存儲(chǔ)節(jié)點(diǎn)1上存儲(chǔ)的數(shù)據(jù)K1與存儲(chǔ)節(jié)點(diǎn)2上存儲(chǔ)的數(shù)據(jù)K1不一致,有沖突。
類似的,接入節(jié)點(diǎn)2從存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2接收到的偏序關(guān)系的判斷與上述接入節(jié)點(diǎn)1的判斷方法相同,在此不再另行說(shuō)明。
步驟209:當(dāng)存儲(chǔ)節(jié)點(diǎn)中的所述數(shù)據(jù)存在沖突時(shí),接入節(jié)點(diǎn)調(diào)整所述數(shù)據(jù)存在的沖突。
當(dāng)接入節(jié)點(diǎn)確定系統(tǒng)的存儲(chǔ)節(jié)點(diǎn)上存儲(chǔ)的同一數(shù)據(jù)存在沖突時(shí),需要調(diào)整沖突。
本申請(qǐng)實(shí)施例提供兩種調(diào)整數(shù)據(jù)沖突的策略作為示例性說(shuō)明。在實(shí)際應(yīng)用中,也可以采用其他的策略,只要系統(tǒng)中的接入節(jié)點(diǎn)共同遵守即可。
第一種按照存儲(chǔ)節(jié)點(diǎn)優(yōu)先級(jí)策略。設(shè)定系統(tǒng)中的存儲(chǔ)節(jié)點(diǎn)的優(yōu)先級(jí),當(dāng)存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)存在沖突時(shí),以優(yōu)先級(jí)高的存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù)為準(zhǔn)來(lái)調(diào)整數(shù)據(jù)沖突。例如上文所述,接入節(jié)點(diǎn)1從存儲(chǔ)節(jié)點(diǎn)1獲取的數(shù)據(jù)K1的偏序關(guān)系為[Ver2,Ver1],從存儲(chǔ)節(jié)點(diǎn)2獲取的數(shù)據(jù)K1的偏序關(guān)系為[Ver2,Ver3,Ver1]。根據(jù)上文所述的方法,接入節(jié)點(diǎn)1從存儲(chǔ)節(jié)點(diǎn)1獲取的數(shù)據(jù)K1的偏序關(guān)系與從存儲(chǔ)節(jié)點(diǎn)2獲取的數(shù)據(jù)K1的偏序關(guān)系不相同,并且偏序關(guān)系中的第一個(gè)版本號(hào)都是Ver2,接入節(jié)點(diǎn)1再獲取存儲(chǔ)節(jié)點(diǎn)1的偏序關(guān)系,得到新的偏序關(guān)系[Ver3,Ver2,Ver1];接入節(jié)點(diǎn)確定存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2中的數(shù)據(jù)K1有沖突。根據(jù)存儲(chǔ)節(jié)點(diǎn)的優(yōu)先級(jí)來(lái)調(diào)整的策略,存儲(chǔ)節(jié)點(diǎn)1的優(yōu)先級(jí)高于存儲(chǔ)節(jié)點(diǎn)2的優(yōu)先級(jí),接入節(jié)點(diǎn)1以存儲(chǔ)節(jié)點(diǎn)1中的數(shù)據(jù)來(lái)調(diào)整存儲(chǔ)節(jié)點(diǎn)2中的數(shù)據(jù)。接入節(jié)點(diǎn)1向存儲(chǔ)節(jié)點(diǎn)2發(fā)送數(shù)據(jù)更新請(qǐng)求put(K1,V3,Ver3<-Ver2),請(qǐng)求中攜帶需要調(diào)整的偏序關(guān)系。存儲(chǔ)節(jié)點(diǎn)2接收到數(shù)據(jù)更新請(qǐng)求之后,對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行調(diào)整,并更新偏序關(guān)系。接入節(jié)點(diǎn)2也會(huì)從存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2獲取數(shù)據(jù)K1的偏序關(guān)系,處理方法與接入節(jié)點(diǎn)1的處理方法相同。接入節(jié)點(diǎn)2從存儲(chǔ)節(jié)點(diǎn)2獲取的偏序關(guān)系可能是接入節(jié)點(diǎn)1調(diào)整后的偏序關(guān)系,這時(shí)接入節(jié)點(diǎn)2獲取的存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2的偏序關(guān)系就是相同的,即存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2中的數(shù)據(jù)K1不存在沖突。接入節(jié)點(diǎn)2的的處理方法與接入節(jié)點(diǎn)1的處理方法相同,不再另行說(shuō)明。
第二種是偏序關(guān)系優(yōu)先級(jí)策略,就是按偏序關(guān)系中版本號(hào)的大小順序調(diào)整存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)的沖突。由于偏序關(guān)系表示了數(shù)據(jù)更新請(qǐng)求的版本號(hào)的先后順序,因此存儲(chǔ)節(jié)點(diǎn)先寫入的版本號(hào)可能會(huì)比后寫入的版本大號(hào)。在此策略下,以偏序關(guān)系中版本號(hào)按從大到小排列的偏序關(guān)系為準(zhǔn)來(lái)調(diào)整數(shù)據(jù)沖突。例如上文所述,接入節(jié)點(diǎn)1從存儲(chǔ)節(jié)點(diǎn)1獲取的數(shù)據(jù)K1的偏序關(guān)系為[Ver3,Ver2,Ver1],從存儲(chǔ)節(jié)點(diǎn)2獲取的數(shù)據(jù)K1的偏序關(guān)系為[Ver2,Ver3,Ver1]。接入節(jié)點(diǎn)1從存儲(chǔ)節(jié)點(diǎn)1返回的數(shù)據(jù)K1的偏序關(guān)系中版本號(hào)是從大到小排列的,因此以存儲(chǔ)節(jié)點(diǎn)1中的數(shù)據(jù)不變,并且根據(jù)存儲(chǔ)節(jié)點(diǎn)1中數(shù)據(jù)K1的偏序關(guān)系來(lái)調(diào)整存儲(chǔ)節(jié)點(diǎn)2中的數(shù)據(jù)K1,使得存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2中的數(shù)據(jù)一致。接入節(jié)點(diǎn)1向存儲(chǔ)節(jié)點(diǎn)2發(fā)送數(shù)據(jù)更新請(qǐng)求,請(qǐng)求中攜帶需要調(diào)整的偏序關(guān)系。存儲(chǔ)節(jié)點(diǎn)2接收到數(shù)據(jù)更新請(qǐng)求之后,并根據(jù)需要調(diào)整的偏序關(guān)系對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行調(diào)整。接入節(jié)點(diǎn)2的處理方法與接入節(jié)點(diǎn)1的處理方法相同,不再另行說(shuō)明。
當(dāng)存儲(chǔ)節(jié)點(diǎn)中的所述數(shù)據(jù)沒(méi)有沖突,接入節(jié)點(diǎn)則不做處理,繼續(xù)正常處理業(yè)務(wù)。
本發(fā)明實(shí)施例還提供一種解決數(shù)據(jù)沖突的多活系統(tǒng),多活系統(tǒng)的架構(gòu)如附圖1所示。
多活系統(tǒng)分為三個(gè)邏輯層:客戶端層11,接入節(jié)點(diǎn)層12和存儲(chǔ)節(jié)點(diǎn)層13。
客戶端層11:包括多個(gè)客戶端。附圖1中示例性給出兩個(gè)客戶端,客戶端1和客戶端2??蛻舳擞糜谙蚪邮展?jié)點(diǎn)發(fā)送第一數(shù)據(jù)更新請(qǐng)求。
接收節(jié)點(diǎn)層12:包括多個(gè)接收節(jié)點(diǎn)。附圖1中示例性的給出兩個(gè)接收節(jié)點(diǎn),接收節(jié)點(diǎn)1和接收節(jié)點(diǎn)2。
存儲(chǔ)節(jié)點(diǎn)層13:包括多個(gè)存儲(chǔ)節(jié)點(diǎn),附圖1中示例性的給出兩個(gè)存儲(chǔ)節(jié)點(diǎn),存儲(chǔ)節(jié)點(diǎn)1和存儲(chǔ)節(jié)點(diǎn)2。
接收節(jié)點(diǎn)用于接收客戶端發(fā)送的第一數(shù)據(jù)更新請(qǐng)求,對(duì)所述第一數(shù)據(jù)更新請(qǐng)求生成一個(gè)全球唯一的版本號(hào);并向存儲(chǔ)節(jié)點(diǎn)發(fā)送第二數(shù)據(jù)更新請(qǐng)求,第二數(shù)據(jù)更新請(qǐng)求中攜帶有該版本號(hào)。
存儲(chǔ)節(jié)點(diǎn)用于根據(jù)第二數(shù)據(jù)更新請(qǐng)求更新對(duì)應(yīng)的數(shù)據(jù),并更新偏序關(guān)系,并向接收節(jié)點(diǎn)返回該偏序關(guān)系;其中,偏序關(guān)系用于記錄所述存儲(chǔ)節(jié)點(diǎn)接收到的數(shù)據(jù)更新請(qǐng)求的版本號(hào)的先后順序。
接收節(jié)點(diǎn)還用于獲取所述存儲(chǔ)節(jié)點(diǎn)返回的偏序關(guān)系,判斷存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)是否存在沖突;當(dāng)存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)存在沖突時(shí),調(diào)整數(shù)據(jù)存在的沖突。
接收節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)的具體實(shí)現(xiàn)過(guò)程以及偏序關(guān)系的產(chǎn)生和更新已在上文方法實(shí)施例中進(jìn)行了詳細(xì)的解釋和說(shuō)明,在此不再另行說(shuō)明。
這樣,只有當(dāng)存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)存在沖突時(shí),接收節(jié)點(diǎn)才調(diào)整數(shù)據(jù)存在的沖突,當(dāng)存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)不存在沖突時(shí),接收節(jié)點(diǎn)正常執(zhí)行數(shù)據(jù)更新操作,大大提高了了數(shù)據(jù)的更新效率。
接入節(jié)點(diǎn)用于判斷存儲(chǔ)節(jié)點(diǎn)中的所述數(shù)據(jù)是否存在沖突具體可以為:當(dāng)獲取到的存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系不一致時(shí),接入節(jié)點(diǎn)判斷所述存儲(chǔ)節(jié)點(diǎn)中的所述數(shù)據(jù)存在沖突。
通過(guò)增加數(shù)據(jù)操作請(qǐng)求的版本號(hào)的偏序關(guān)系,接入節(jié)點(diǎn)可以根據(jù)偏序關(guān)系來(lái)判斷存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)是否一致,能夠快速的識(shí)別出存儲(chǔ)節(jié)點(diǎn)中存在的數(shù)據(jù)沖突,提高系統(tǒng)的性能。
可選的,接入節(jié)點(diǎn)用于判斷存儲(chǔ)節(jié)點(diǎn)中的所述數(shù)據(jù)是否存在沖突具體還可以為:當(dāng)接收到的存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系不一致時(shí),在預(yù)定的時(shí)間周期內(nèi)所述接入節(jié)點(diǎn)重新獲取存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系,當(dāng)所述重新獲取的所述存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系不一致時(shí),所述接入節(jié)點(diǎn)判斷所述存儲(chǔ)節(jié)點(diǎn)中的所述數(shù)據(jù)存在沖突。
由于各個(gè)存儲(chǔ)節(jié)點(diǎn)接收數(shù)據(jù)更新請(qǐng)求的順序和時(shí)間不完全一致,因此不同時(shí)間獲取的偏序關(guān)系可能會(huì)不同。并且當(dāng)不同存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系不相同時(shí),可能有接收節(jié)點(diǎn)會(huì)調(diào)整數(shù)據(jù)沖突,因此可以設(shè)定一個(gè)時(shí)間周期,在設(shè)定的時(shí)間周期內(nèi),接收節(jié)點(diǎn)可以多次獲取存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系進(jìn)行比較,而不是一發(fā)現(xiàn)偏序關(guān)系不一致就馬上進(jìn)行調(diào)整,以提高解決數(shù)據(jù)沖突的效率。具體設(shè)定時(shí)間周期的長(zhǎng)短,可以根據(jù)業(yè)務(wù)的類型、系統(tǒng)的負(fù)載或者用戶的需求來(lái)設(shè)定。
接收節(jié)點(diǎn)判斷存儲(chǔ)節(jié)點(diǎn)中的同一是否存在沖突在上文方法實(shí)施例中已經(jīng)進(jìn)行了詳細(xì)的舉例和說(shuō)明,在本發(fā)明實(shí)施例中不再另行說(shuō)明。
接入節(jié)點(diǎn)用于調(diào)整所述沖突具體為:接入節(jié)點(diǎn)用于根據(jù)沖突調(diào)整策略向存儲(chǔ)節(jié)點(diǎn)發(fā)送第三數(shù)據(jù)更新請(qǐng)求,第三數(shù)據(jù)更新請(qǐng)求中包含需要調(diào)整的偏序關(guān)系;
存儲(chǔ)節(jié)點(diǎn)還用于接收到第三數(shù)據(jù)更新請(qǐng)求之后,根據(jù)需要調(diào)整的偏序關(guān)系更新存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)。
沖突調(diào)整策略包括存儲(chǔ)節(jié)點(diǎn)優(yōu)先級(jí)策略和偏序關(guān)系優(yōu)先級(jí)策略。存儲(chǔ)節(jié)點(diǎn)優(yōu)先級(jí)策略為以優(yōu)先級(jí)高的存儲(chǔ)節(jié)點(diǎn)的偏序關(guān)系來(lái)調(diào)整優(yōu)先級(jí)低的存儲(chǔ)節(jié)點(diǎn)中的數(shù)據(jù)。所述偏序關(guān)系優(yōu)先級(jí)策略為按所述偏序關(guān)系中的版本號(hào)的大小順序調(diào)整所述存儲(chǔ)節(jié)點(diǎn)中的所述數(shù)據(jù)。
存儲(chǔ)節(jié)點(diǎn)中數(shù)據(jù)沖突的解決需要有一致的策略,這樣能夠在確定存在沖突以后快速的解決。沖突調(diào)整策略的具體內(nèi)容和實(shí)現(xiàn)在上文實(shí)施例中已有詳細(xì)的說(shuō)明和舉例,在本實(shí)施例中不再另行說(shuō)明。
接入節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)可以在同一個(gè)物理設(shè)備(例如節(jié)點(diǎn)設(shè)備)上,也可以在不同的物理設(shè)備上,在本發(fā)明實(shí)施例中不做限定。
結(jié)合本文中所公開的實(shí)施例描述的各示例的單元及方法步驟,本申請(qǐng)能夠以硬件或硬件和計(jì)算機(jī)軟件的結(jié)合形式來(lái)實(shí)現(xiàn)。某個(gè)功能究竟以硬件還是計(jì)算機(jī)軟件驅(qū)動(dòng)硬件的方式來(lái)執(zhí)行,取決于技術(shù)方案的特定應(yīng)用和設(shè)計(jì)約束條件。專業(yè)技術(shù)人員可以對(duì)每個(gè)特定的應(yīng)用來(lái)使用不同方法來(lái)實(shí)現(xiàn)所描述的功能,但是這種實(shí)現(xiàn)不應(yīng)認(rèn)為超出本申請(qǐng)的范圍。
如圖3所示,為本申請(qǐng)實(shí)施例提供的一種解決數(shù)據(jù)沖突的裝置的硬件結(jié)構(gòu)示意圖,該解決數(shù)據(jù)沖突的裝置300包括至少一個(gè)處理器301,通信總線302,存儲(chǔ)器303以及至少一個(gè)通信接口304。
處理器301可以是一個(gè)通用中央處理器(Central Processing Unit,CPU),微處理器,特定應(yīng)用集成電路(Application-Specific Integrated Circuit,ASIC),或一個(gè)或多個(gè)用于控制本申請(qǐng)方案程序執(zhí)行的集成電路。
通信總線302可包括一通路,在上述組件之間傳送信息。
通信接口304,使用任何收發(fā)器一類的裝置,用于與其他設(shè)備或通信網(wǎng)絡(luò)通信,如以太網(wǎng),無(wú)線接入網(wǎng)(Radio Access Network,RAN),無(wú)線局域網(wǎng)(Wireless Local Area Networks,WLAN)等。
存儲(chǔ)器303可以是只讀存儲(chǔ)器(Read-Only Memory,ROM)或可存儲(chǔ)靜態(tài)信息和指令的其他類型的靜態(tài)存儲(chǔ)設(shè)備,隨機(jī)存取存儲(chǔ)器(Random Access Memory,RAM)或者可存儲(chǔ)信息和指令的其他類型的動(dòng)態(tài)存儲(chǔ)設(shè)備,也可以是電可擦可編程只讀存儲(chǔ)器(Electrically Erasable Programmable Read-Only Memory,EEPROM)、只讀光盤(Compact Disc Read-Only Memory,CD-ROM)或其他光盤存儲(chǔ)、光碟存儲(chǔ)(包括壓縮光碟、激光碟、光碟、數(shù)字通用光碟、藍(lán)光光碟等)、磁盤存儲(chǔ)介質(zhì)或者其他磁存儲(chǔ)設(shè)備、或者能夠用于攜帶或存儲(chǔ)具有指令或數(shù)據(jù)結(jié)構(gòu)形式的期望的程序代碼并能夠由計(jì)算機(jī)存取的任何其他介質(zhì),但不限于此。存儲(chǔ)器可以是獨(dú)立存在,通過(guò)總線與處理器相連接。存儲(chǔ)器也可以和處理器集成在一起。
其中,存儲(chǔ)器303用于存儲(chǔ)執(zhí)行本申請(qǐng)方案的應(yīng)用程序代碼,并由處理器301來(lái)控制執(zhí)行。處理器301用于執(zhí)行存儲(chǔ)器33中存儲(chǔ)的應(yīng)用程序代碼,從而實(shí)現(xiàn)上述實(shí)施例中所述的在多CPU系統(tǒng)中分配資源的方法。
在具體實(shí)現(xiàn)中,作為一種實(shí)施例,處理器301可以包括一個(gè)或多個(gè)CPU,例如圖3中的CPU0和CPU1。
在具體實(shí)現(xiàn)中,作為一種實(shí)施例,解決數(shù)據(jù)沖突的裝置300可以包括多個(gè)處理器,例如圖3中的處理器301和處理器308。這些處理器中的每一個(gè)可以是一個(gè)單核(single-CPU)處理器,也可以是一個(gè)多核(multi-CPU)處理器。這里的處理器可以指一個(gè)或多個(gè)設(shè)備、電路、和/或用于處理數(shù)據(jù)(例如計(jì)算機(jī)程序指令)的處理核。
在具體實(shí)現(xiàn)中,作為一種實(shí)施例,解決數(shù)據(jù)沖突的裝置300還可以包括輸出設(shè)備305和輸入設(shè)備306。輸出設(shè)備305和處理器301通信,可以以多種方式來(lái)顯示信息。例如,輸出設(shè)備305可以是液晶顯示器(Liquid Crystal Display,LCD),發(fā)光二級(jí)管(Light Emitting Diode,LED)顯示設(shè)備,陰極射線管(Cathode Ray Tube,CRT)顯示設(shè)備,或投影儀(projector)等。輸入設(shè)備306和處理器301通信,可以以多種方式接受用戶的輸入。例如,輸入設(shè)備806可以是鼠標(biāo)、鍵盤、觸摸屏設(shè)備或傳感設(shè)備等。
上述的解決數(shù)據(jù)沖突的裝置300可以是一個(gè)通用服務(wù)器或者是一個(gè)專用服務(wù)器。在具體實(shí)現(xiàn)中,解決數(shù)據(jù)沖突的裝置300可以是臺(tái)式機(jī)、便攜式電腦、網(wǎng)絡(luò)服務(wù)器、掌上電腦(Personal Digital Assistant,PDA)、移動(dòng)手機(jī)、平板電腦、無(wú)線終端設(shè)備、通信設(shè)備、嵌入式設(shè)備或有圖3中類似結(jié)構(gòu)的設(shè)備。本申請(qǐng)實(shí)施例不限定解決數(shù)據(jù)沖突的裝置300的類型。
由于本申請(qǐng)實(shí)施例提供的解決數(shù)據(jù)沖突的裝置可用于執(zhí)行上述在多CPU系統(tǒng)中分配資源的方法,因此其所能獲得的技術(shù)效果可參考上述方法實(shí)施例,本申請(qǐng)實(shí)施例在此不再贅述。
本申請(qǐng)實(shí)施例還提供了一種計(jì)算機(jī)存儲(chǔ)介質(zhì),用于儲(chǔ)存為上述解決數(shù)據(jù)沖突的裝置所用的計(jì)算機(jī)軟件指令,其包含用于執(zhí)行上述方法實(shí)施例所設(shè)計(jì)的程序。通過(guò)執(zhí)行存儲(chǔ)的程序,可以在多CPU系統(tǒng)中實(shí)現(xiàn)資源分配的方法。
本申請(qǐng)實(shí)施例還提供了一種計(jì)算機(jī)程序,該計(jì)算機(jī)程序包括指令,當(dāng)該計(jì)算機(jī)程序被計(jì)算機(jī)執(zhí)行時(shí),使得計(jì)算機(jī)可以執(zhí)行上述方法實(shí)施例的流程。
盡管在此結(jié)合各實(shí)施例對(duì)本申請(qǐng)進(jìn)行了描述,然而,在實(shí)施所要求保護(hù)的本申請(qǐng)過(guò)程中,本領(lǐng)域技術(shù)人員通過(guò)查看所述附圖、公開內(nèi)容、以及所附權(quán)利要求書,可理解并實(shí)現(xiàn)所述公開實(shí)施例的其他變化。在權(quán)利要求中,“包括”(comprising)一詞不排除其他組成部分或步驟,“一”或“一個(gè)”不排除多個(gè)的情況。單個(gè)處理器或其他單元可以實(shí)現(xiàn)權(quán)利要求中列舉的若干項(xiàng)功能。相互不同的從屬權(quán)利要求中記載了某些措施,但這并不表示這些措施不能組合起來(lái)產(chǎn)生良好的效果。
本領(lǐng)域技術(shù)人員應(yīng)明白,本申請(qǐng)的實(shí)施例可提供為方法、裝置(設(shè)備)、或計(jì)算機(jī)程序產(chǎn)品。因此,本申請(qǐng)可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本申請(qǐng)可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、CD-ROM、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。計(jì)算機(jī)程序存儲(chǔ)/分布在合適的介質(zhì)中,與其它硬件一起提供或作為硬件的一部分,也可以采用其他分布形式,如通過(guò)Internet或其它有線或無(wú)線電信系統(tǒng)。
本申請(qǐng)是參照本申請(qǐng)實(shí)施例的方法、裝置(設(shè)備)和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來(lái)描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過(guò)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的裝置。
這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。
這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。
盡管結(jié)合具體特征及其實(shí)施例對(duì)本申請(qǐng)進(jìn)行了描述,顯而易見(jiàn)的,在不脫離本申請(qǐng)的精神和范圍的情況下,可對(duì)其進(jìn)行各種修改和組合。相應(yīng)地,本說(shuō)明書和附圖僅僅是所附權(quán)利要求所界定的本申請(qǐng)的示例性說(shuō)明,且視為已覆蓋本申請(qǐng)范圍內(nèi)的任意和所有修改、變化、組合或等同物。顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本申請(qǐng)進(jìn)行各種改動(dòng)和變型而不脫離本申請(qǐng)的精神和范圍。這樣,倘若本申請(qǐng)的這些修改和變型屬于本申請(qǐng)權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本申請(qǐng)也意圖包含這些改動(dòng)和變型在內(nèi)。