本發(fā)明涉及大數(shù)據(jù),特別地,涉及數(shù)據(jù)同步;具體而言,涉及一種基于邏輯時鐘的mongodb雙向數(shù)據(jù)同步方法及系統(tǒng)。
背景技術(shù):
1、隨著企業(yè)業(yè)務發(fā)展,對于服務高可用以及高可靠性的要求越來越高,對數(shù)據(jù)庫系統(tǒng)跨地域、跨數(shù)據(jù)中心的數(shù)據(jù)同步需求也會越來越多。
2、mongodb是目前使用最廣泛的開源nosql數(shù)據(jù)庫之一,它以文檔的形式存儲數(shù)據(jù),與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫相比,mongodb具有更高的可擴展性和靈活性。然而,mongodb對數(shù)據(jù)同步的支持還不夠完善,僅支持將源數(shù)據(jù)庫數(shù)據(jù)同步到目標數(shù)據(jù)庫的單向數(shù)據(jù)同步,現(xiàn)階段還沒有一個可靠的開箱即用的mongodb雙向數(shù)據(jù)同步工具。
3、現(xiàn)有的mongodb的數(shù)據(jù)同步工具主要有以下兩種:
4、1.mongoshake,是最常用的mongodb數(shù)據(jù)同步工具,但是mongoshake只支持阿里的深度定制版本mongodb的雙向同步,對于開源版本的mongodb只能支持單向的數(shù)據(jù)同步;
5、2.flink?cdc,全稱為?flink?change?data?capture,是利用apache?flink流處理框架實現(xiàn)的一種實時數(shù)據(jù)同步技術(shù),它能夠?qū)崟r捕獲并同步源數(shù)據(jù)庫的增量變動,將變動數(shù)據(jù)實時傳輸?shù)侥繕讼到y(tǒng),從而實現(xiàn)數(shù)據(jù)同步;但是,flink?cdc同樣只能支持單向同步,并且組件依賴多,部署更繁重。
技術(shù)實現(xiàn)思路
1、鑒于此,本發(fā)明的目的在于開發(fā)一種基于邏輯時鐘的mongodb雙向數(shù)據(jù)同步方法及系統(tǒng),能夠支持mongodb集群的雙向數(shù)據(jù)同步,實現(xiàn)異地雙活的能力;數(shù)據(jù)同步平臺自動解決雙寫沖突問題,同時數(shù)據(jù)源數(shù)據(jù)的一致性以及同步平臺的高可用性和可靠性。
2、本發(fā)明提供基于邏輯時鐘的mongodb雙向數(shù)據(jù)同步方法,包括:
3、s1、通過mongo同步服務mongo-sync-service從mongodb的變更數(shù)據(jù)流(changestream)中接收數(shù)據(jù),將<database>.<collection>作為kafka集群(卡夫卡消息隊列)消息的key,通過key對消息進行分區(qū),使得相同庫表的變更數(shù)據(jù)都寫入到kafka相同的topic(主題)分區(qū)下,保證消息的有序傳遞;
4、具體地,因為通過mongo同步服務mongo-sync-service從mongodb的變更數(shù)據(jù)流中接收到的數(shù)據(jù)本身是有序的,所以只要保證消息寫入kafka,和從kafka消費消息的有序性,只需要控制相同庫表的變更數(shù)據(jù)是有序的,就可以實現(xiàn)消息的有序傳遞。
5、s2、源端mongo同步服務的內(nèi)部維護一個自動遞增id,監(jiān)聽變更數(shù)據(jù)流時,每監(jiān)聽到一條數(shù)據(jù),所述自動遞增id就加1(+1),并將自動遞增id賦值給變更數(shù)據(jù),將所述變更數(shù)據(jù)發(fā)送至kafka;源端mongo同步服務定期執(zhí)行checkpoint(檢查點),將最新的自動遞增id和變更數(shù)據(jù)流的resumetoken發(fā)送到kafka的指定的topic分區(qū)下;目標端mongo同步服務消費所述源端mongo同步服務同步過來的kafka數(shù)據(jù),并按照所述自動遞增id進行去重;目標端mongo同步服務完成一批數(shù)據(jù)的寫入后,提交偏移量;
6、s3、mongo表新增dc列,將所述dc列交由應用端維護;mongo同步服務通過所述dc列的值判斷變更數(shù)據(jù)是通過客戶端寫入的,還是外部環(huán)境同步過來的;
7、s4、通過邏輯時鐘探測寫沖突,mongo表中設(shè)置createtime列,使用所述createtime列表示某個消息的寫入時間,所述createtime列的列值的趨勢遞增;通過對比createtime列的列值判斷是否可能存在沖突,并按照沖突解決策略進行處理;
8、具體地,存在寫入沖突需要滿足兩個條件:
9、1.兩端寫入的key值相同;
10、2.兩端同時寫入,即dc1寫入一條數(shù)據(jù)a還未同步到dc2時,dc2也寫入數(shù)據(jù)b。
11、第一個條件很好判斷,第二個條件比較難判斷,只要能判斷b是在a同步到dc2之前、還是之后寫入的,就能判斷是否存在寫沖突。
12、因此在進行數(shù)據(jù)同步時,讓目標端同步消息攜帶這條消息寫入源端時,源端能夠接收到最新的目標端的createtime。這樣這條消息同步到目標端時,通過對比createtime判斷是否可能存在沖突;
13、s5、采用akka集群構(gòu)建mongo同步服務,使用akka?cluster?singleton(akka集群單例)從akka集群中選擇一個實例作為主節(jié)點,所述主節(jié)點監(jiān)聽mongo的變更數(shù)據(jù)流,并推送到kafka,同時主節(jié)點還定期執(zhí)行checkpoint(檢查點),將自動遞增id、resumetoken以及最新接收時間戳的信息發(fā)送至kafka的一個指定的topic中;所述主節(jié)點外的其它所有實例都持續(xù)地消費該指定的topic,獲取主節(jié)點實例的最新狀態(tài)。
14、具體地,在源端和目標端,同樣都是采用主節(jié)點實例消費數(shù)據(jù),并定期執(zhí)行checkpoint,將接收到的各分區(qū)的自動遞增id值發(fā)送給kafka的指定的topic,主節(jié)點實例外的其它實例則持續(xù)消費該指定的topic,獲取主節(jié)點實例的最新狀態(tài)。
15、mongo同步服務支持高可用,在單一節(jié)點故障時依然能夠保證運行。
16、進一步地,所述s4步驟的通過邏輯時鐘探測寫沖突的方法包括:
17、設(shè)源端的mongodb集群dc1寫入一條數(shù)據(jù)a,該數(shù)據(jù)a的createtime值記為ta,當這條數(shù)據(jù)ta同步到目標端的mongodb集群dc2之后,dc2寫入數(shù)據(jù)b,并同步到dc1覆蓋數(shù)據(jù)c;如果tc?>?ta,則說明不存在沖突;如果tc?≤?ta,則說明可能有沖突。
18、進一步地,所述s2步驟的源端mongo同步服務定期執(zhí)行checkpoint,將最新的自動遞增id和變更數(shù)據(jù)流的resumetoken發(fā)送到kafka的指定的topic分區(qū)下包括:
19、如果源端mongo同步服務重啟,則獲取重啟前的狀態(tài),從所述指定的topic分區(qū)下獲取最新的自動遞增id和變更數(shù)據(jù)流的resumetoken,發(fā)送到kafka的指定的topic分區(qū)下。
20、進一步地,所述s2步驟的按照所述自動遞增id進行去重包括:
21、如果id沒有遞增,則說明是重復數(shù)據(jù),直接忽略該沒有遞增的id。
22、進一步地,所述s3步驟的將所述dc列交由應用端維護包括:
23、應用端寫入dc列數(shù)據(jù)時,寫入一個按應用端的排列順序號所作的固定值。比如,dc1環(huán)境該值就是1,dc2環(huán)境該值就是2。
24、進一步地,所述s5步驟的所述主節(jié)點外的其它所有實例都持續(xù)地消費該指定的topic,獲取主節(jié)點實例的最新狀態(tài)包括:
25、當主節(jié)點實例掛掉時,從主節(jié)點實例外的其它實例中推選一個作為新的主節(jié)點實例,按照最新的checkpoint繼續(xù)提供服務。
26、本發(fā)明還提供基于邏輯時鐘的mongodb雙向數(shù)據(jù)同步系統(tǒng),用于實現(xiàn)如上述所述的基于邏輯時鐘的mongodb雙向數(shù)據(jù)同步方法,包括:
27、消息傳遞有序性模塊:用于通過mongo同步服務mongo-sync-service從mongodb的變更數(shù)據(jù)流中接收數(shù)據(jù),將<database>.<collection>作為kafka集群消息的key,通過key對消息進行分區(qū),使得相同庫表的變更數(shù)據(jù)都寫入到kafka相同的topic分區(qū)下,保證消息的有序傳遞;
28、消息傳遞可靠性模塊:用于源端mongo同步服務的內(nèi)部維護一個自動遞增id,監(jiān)聽變更數(shù)據(jù)流時,每監(jiān)聽到一條數(shù)據(jù),所述自動遞增id就加1,并將自動遞增id賦值給變更數(shù)據(jù),將所述變更數(shù)據(jù)發(fā)送至kafka;源端mongo同步服務定期執(zhí)行checkpoint,將最新的自動遞增id和變更數(shù)據(jù)流的resumetoken發(fā)送到kafka的指定的topic分區(qū)下;目標端mongo同步服務消費所述源端mongo同步服務同步過來的kafka數(shù)據(jù),并按照所述自動遞增id進行去重;目標端mongo同步服務完成一批數(shù)據(jù)的寫入后,提交偏移量;
29、服務風暴處理模塊:用于mongo表新增dc列,將所述dc列交由應用端維護;mongo同步服務通過所述dc列的值判斷變更數(shù)據(jù)是通過客戶端寫入的,還是外部環(huán)境同步過來的;
30、寫沖突處理模塊:用于通過邏輯時鐘探測寫沖突,mongo表中設(shè)置createtime列,使用所述createtime列表示某個消息的寫入時間,所述createtime列的列值的趨勢遞增;通過對比createtime列的列值判斷是否可能存在沖突,并按照沖突解決策略進行處理;
31、高可用模塊:用于采用akka集群構(gòu)建mongo同步服務,使用akka?clustersingleton從akka集群中選擇一個實例作為主節(jié)點,所述主節(jié)點監(jiān)聽mongo的變更數(shù)據(jù)流,并推送到kafka,同時主節(jié)點還定期執(zhí)行checkpoint,將自動遞增id、resumetoken以及最新接收時間戳的信息發(fā)送至kafka的一個指定的topic中;所述主節(jié)點外的其它所有實例都持續(xù)地消費該指定的topic,獲取主節(jié)點實例的最新狀態(tài)。
32、本發(fā)明還提供一種計算機可讀存儲介質(zhì),其上存儲有計算機程序,所述程序被處理器執(zhí)行時實現(xiàn)如上述所述的基于邏輯時鐘的mongodb雙向數(shù)據(jù)同步方法的步驟。
33、本發(fā)明還提供一種計算機設(shè)備,所述計算機設(shè)備包括存儲器、處理器及存儲在存儲器上并可在處理器上運行的計算機程序,所述處理器執(zhí)行所述程序時實現(xiàn)如上述所述的基于邏輯時鐘的mongodb雙向數(shù)據(jù)同步方法的步驟。
34、與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果在于:
35、本發(fā)明提供的基于邏輯時鐘的mongodb雙向數(shù)據(jù)同步方法及系統(tǒng)實現(xiàn)了mongodb集群的雙向數(shù)據(jù)同步,能夠保證數(shù)據(jù)同步的一致性,有效解決了雙寫沖突問題;能夠保證數(shù)據(jù)同步的可靠性,無論出現(xiàn)網(wǎng)絡問題還是節(jié)點故障重啟,都能夠保證數(shù)據(jù)不丟失;能夠保證數(shù)據(jù)同步的實時性,同步延遲在秒級別;能夠保證高可用性,單一或者少數(shù)節(jié)點實例故障不會影響數(shù)據(jù)的正常同步,為業(yè)務服務異地雙活、高可用建設(shè)提供了有力支撐。