本發(fā)明涉及數(shù)據(jù)處理領(lǐng)域,更具體地涉及一種主備數(shù)據(jù)庫的同步方法及裝置。
背景技術(shù):
mysql是互聯(lián)網(wǎng)行業(yè)廣泛使用的開源數(shù)據(jù)庫軟件,不過由于甲骨文存在將mysql閉源的風(fēng)險,許多基于mysql的應(yīng)用都面臨需要使用替代性的開源數(shù)據(jù)庫軟件,而mariadb是對mysql兼容性最好的替代方案。但針對大型網(wǎng)站,使用mariadb數(shù)據(jù)庫存在一臺mariadb數(shù)據(jù)庫無法支持龐大訪問量的問題。
對此有效的解決方案是建立mariadb數(shù)據(jù)庫集群,其中備數(shù)據(jù)庫是主數(shù)據(jù)庫的完整鏡像,寫請求首先在主數(shù)據(jù)庫上執(zhí)行,而讀請求會分布到所有數(shù)據(jù)庫上,主數(shù)據(jù)庫在接收寫數(shù)據(jù)完成后通過同步工具將寫請求按照單線程順序執(zhí)行的方式同步到備數(shù)據(jù)庫上,從而提供更加強大的數(shù)據(jù)庫讀寫服務(wù)。
目前官方提供的主備同步的版本中,主備同步采用的是單線程同步,當(dāng)主數(shù)據(jù)庫負(fù)載較高時,會導(dǎo)致同步延時增大,備數(shù)據(jù)庫不能及時讀取最新數(shù)據(jù),降低了數(shù)據(jù)庫集群的可用性。
技術(shù)實現(xiàn)要素:
有鑒于此,本發(fā)明的主要目的在于提供一種主備數(shù)據(jù)庫同步方法及裝置,以便解決現(xiàn)有主備數(shù)據(jù)庫在備數(shù)據(jù)庫較多的情況下,同步效率低下的問題。
為了實現(xiàn)上述目的,作為本發(fā)明的一個方面,本發(fā)明提供了一種主備數(shù)據(jù)庫同步裝置,包括:
同步事務(wù)獲取單元,用于通過對主數(shù)據(jù)庫中的數(shù)據(jù)庫事務(wù)進(jìn)行讀取,獲得需要同步的數(shù)據(jù)庫事務(wù)信息,將其添加到數(shù)據(jù)庫事務(wù)寫隊列中,并將數(shù)據(jù)庫事務(wù)主鍵數(shù)量作為主鍵處理進(jìn)度值;以及
同步事務(wù)執(zhí)行單元,用于采用并行寫入方式將所述數(shù)據(jù)庫事務(wù)寫隊列中的所述數(shù)據(jù)庫事務(wù)寫入到備數(shù)據(jù)庫中,并刪除位于所述數(shù)據(jù)庫事務(wù)寫隊列頂端的所述數(shù)據(jù)庫事務(wù)。
其中,所述同步事務(wù)執(zhí)行單元包括同步事務(wù)處理組件、同步事務(wù)寫入組件和同步事務(wù)完成組件,其中所述同步事務(wù)處理組件輪詢各個待處理的數(shù)據(jù)庫事務(wù)主鍵處理進(jìn)度值,當(dāng)主鍵事務(wù)處理進(jìn)度值為0時進(jìn)入所述同步事務(wù)執(zhí)行組件;所述同步事務(wù)執(zhí)行組件將主鍵處理進(jìn)度值為0的數(shù)據(jù)庫事務(wù)派發(fā)到寫線程執(zhí)行,采用并行寫入方式將寫隊列的事務(wù)寫入備數(shù)據(jù)庫中;所述同步事務(wù)完成組件在寫入備數(shù)據(jù)庫的數(shù)據(jù)庫事務(wù)完成后,刪除已經(jīng)完成的數(shù)據(jù)庫事務(wù),刪除位于主鍵寫隊列頂端的該數(shù)據(jù)庫事務(wù),主鍵寫隊列的第二條數(shù)據(jù)庫事務(wù)自動成為主鍵寫隊列的待處理事務(wù),并通知所述數(shù)據(jù)庫事務(wù)主鍵處理進(jìn)度值減一。
作為本發(fā)明的另一個方面,本發(fā)明還提供了一種主備數(shù)據(jù)庫同步方法,包括以下步驟:
通過對主數(shù)據(jù)庫中的數(shù)據(jù)庫事務(wù)進(jìn)行讀取,獲得需要同步的數(shù)據(jù)庫事務(wù)信息,取得數(shù)據(jù)庫事務(wù)的主鍵,記錄同步數(shù)據(jù)庫事務(wù)的主鍵,并將數(shù)據(jù)庫事務(wù)主鍵數(shù)量作為主鍵處理進(jìn)度值;
按照數(shù)據(jù)庫事務(wù)主鍵信息,將獲取到的數(shù)據(jù)庫事務(wù)按照主數(shù)據(jù)庫中的順序增加到數(shù)據(jù)庫事務(wù)主鍵對應(yīng)主鍵寫隊列中;其中,對于沒有寫隊列的主鍵需要創(chuàng)建新的主鍵寫隊列,并將該事務(wù)置為寫隊列頂端,通知該主鍵處理進(jìn)度值減一;
輪詢各個待處理的數(shù)據(jù)庫事務(wù)主鍵處理進(jìn)度值,當(dāng)主鍵事務(wù)處理進(jìn)度值為0時進(jìn)入同步事務(wù)執(zhí)行組件;
將主鍵處理進(jìn)度值為0的數(shù)據(jù)庫事務(wù)派發(fā)寫線程執(zhí)行,采用并行寫入方式將寫隊列的事務(wù)寫入備數(shù)據(jù)庫中;
寫入備數(shù)據(jù)庫的數(shù)據(jù)庫事務(wù)完成后,刪除已經(jīng)完成的數(shù)據(jù)庫事務(wù),刪除位于主鍵寫隊列頂端的該數(shù)據(jù)庫事務(wù),主鍵寫隊列的第二條數(shù)據(jù)庫事務(wù)自動成為主鍵寫隊列的待處理事務(wù);通知該數(shù)據(jù)庫事務(wù)主鍵處理進(jìn)度值減一。
基于上述技術(shù)方案可知,本發(fā)明的同步裝置和方法相對于現(xiàn)有技術(shù),能夠?qū)ariadb的集群性能大大提升,有效擴展了mariadb的試用范圍,能夠支持更高的數(shù)據(jù)庫訪問量;此外,以事務(wù)作為同步的最小單位,事務(wù)本身具有原子性,同時多線程并行寫入的方式減少了同步的執(zhí)行時間,大大提升了mariadb的執(zhí)行效率。
附圖說明
圖1是本發(fā)明的基于mariadb主備數(shù)據(jù)庫的同步裝置的結(jié)構(gòu)框圖;
圖2是作為本發(fā)明一個優(yōu)選實施例的基于mariadb主備數(shù)據(jù)庫的同步方法的流程框圖。
具體實施方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚明白,以下結(jié)合具體實施例,并參照附圖,對本發(fā)明作進(jìn)一步的詳細(xì)說明。
mysql是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典mysqlab公司開發(fā),目前屬于oracle旗下公司。mysql是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在web應(yīng)用方面mysql是最好的rdbms(relationaldatabasemanagementsystem,關(guān)系數(shù)據(jù)庫管理系統(tǒng))應(yīng)用軟件之一。在mysql中,關(guān)聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。并且,mysql所使用的sql語言是用于訪問數(shù)據(jù)庫的最常用標(biāo)準(zhǔn)化語言。mysql軟件采用了雙授權(quán)政策,它分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網(wǎng)站的開發(fā)都選擇mysql作為網(wǎng)站數(shù)據(jù)庫,對于一般的個人使用者和中小型企業(yè)來說,mysql提供的功能已經(jīng)綽綽有余,但對于大型網(wǎng)站,面對的問題更加復(fù)雜,仍然需要更強有力的工具。
mariadb(瑪莉亞數(shù)據(jù)庫)是一個采用maria存儲引擎的mysql分支版本,是由原來mysql的作者michaelwidenius創(chuàng)辦的公司所開發(fā)的免費開源的數(shù)據(jù)庫服務(wù)器。mysql創(chuàng)始人michaelwidenius不滿sun開發(fā)團(tuán)隊腳步過慢,憤而離職成立開源數(shù)據(jù)庫聯(lián)盟,另外從現(xiàn)有mysql程序代碼中,開發(fā)出另一個延伸分支版本,也就是名為瑪莉亞數(shù)據(jù)庫的企業(yè)級開源數(shù)據(jù)庫。瑪莉亞數(shù)據(jù)庫是mysql的一個分支版本(branch),而不是衍生版本(folk),提供的功能可和mysql完全兼容。
mariadb基于事務(wù)的maria存儲引擎,替換了mysql的myisam存儲引擎,它使用了percona的xtradb,innodb的變體,分支的開發(fā)者希望提供訪問即將到來的mysql5.4innodb性能。這個版本還包括了primebasext(pbxt)和federatedx存儲引擎。由于mariadb的強大功能,一些大型企業(yè)也從mysql轉(zhuǎn)向mariadb,其中代表廠家包括:谷歌(2013年9月)、redhat(2013年6月)和維基百科(2013年4月)。
mariadb雖然被視為mysql數(shù)據(jù)庫的替代品,但它在擴展功能、存儲引擎以及一些新的功能改進(jìn)方面都強過mysql。而且從mysql遷移到mariadb也是非常簡單的:
1、數(shù)據(jù)和表定義文件(.frm)是二進(jìn)制兼容的;
2、所有客戶端api、協(xié)議和結(jié)構(gòu)都是完全一致的;
3、所有文件名、二進(jìn)制、路徑、端口等都是一致的;
4、所有的mysql連接器,比如php、perl、python、java、.net、myodbc、ruby以及mysqlcconnector等在mariadb中都保持不變;
5、mysql-client包在mariadb服務(wù)器中也能夠正常運行;
6、共享的客戶端庫與mysql也是二進(jìn)制兼容的。
數(shù)據(jù)庫事務(wù)(databasetransaction),是指作為單個邏輯工作單元執(zhí)行的一系列操作,要么完全地執(zhí)行,要么完全地不執(zhí)行。事務(wù)處理可以確保除非事務(wù)性單元內(nèi)的所有操作都成功完成,否則不會永久更新面向數(shù)據(jù)的資源。通過將一組相關(guān)操作組合為一個要么全部成功要么全部失敗的單元,可以簡化錯誤恢復(fù)并使應(yīng)用程序更加可靠。
本發(fā)明就是在基于mariadb數(shù)據(jù)庫的管理系統(tǒng)上開發(fā)出來的,在采取mariadb數(shù)據(jù)庫的管理系統(tǒng)中,經(jīng)常出現(xiàn)需要對數(shù)據(jù)庫內(nèi)容進(jìn)行備份的情況,而為了增加冗余,通常采用主備數(shù)據(jù)庫兩套重復(fù)的系統(tǒng),而這樣的系統(tǒng)在進(jìn)行同步時,由于需要面對復(fù)雜的事務(wù)處理,且采用的是單線程同步,所以同步效率比較低下,嚴(yán)重影響了整個mariadb數(shù)據(jù)庫管理系統(tǒng)的工作效率,當(dāng)主數(shù)據(jù)庫負(fù)載較高時,會導(dǎo)致同步延時增大,備數(shù)據(jù)庫不能及時讀取最新數(shù)據(jù),降低了數(shù)據(jù)庫集群的可用性。為了解決上述現(xiàn)有主備數(shù)據(jù)庫同步效率低下的問題,本發(fā)明公開了一種基于mariadb數(shù)據(jù)庫的主備數(shù)據(jù)庫同步裝置,如圖1所示,該主備數(shù)據(jù)庫同步裝置由兩個部分組成,分別是同步事務(wù)獲取單元和同步事務(wù)執(zhí)行單元。
同步事務(wù)執(zhí)行單元又由三個組件組成,分別是同步事務(wù)處理組件、同步事務(wù)寫入組件、同步事務(wù)完成組件。
由于同步工作是持續(xù)進(jìn)行的,因此在實際過程中,同步事務(wù)獲取單元不斷將新的需要同步的事務(wù)交給同步事務(wù)執(zhí)行單元進(jìn)行處理。同時,同步事務(wù)執(zhí)行單元也會由于同步事務(wù)的不斷增加而在重復(fù)按照同步事務(wù)處理組件、同步事務(wù)寫入組件、同步事務(wù)完成組件進(jìn)行事務(wù)處理。
下面具體對本發(fā)明的主備數(shù)據(jù)庫同步裝置的各個組成部分進(jìn)行詳細(xì)說明和闡述。
同步事務(wù)獲取單元
通過對主數(shù)據(jù)庫中的數(shù)據(jù)庫事務(wù)進(jìn)行讀取,獲得需要同步的數(shù)據(jù)庫事務(wù)信息。
針對獲取到的數(shù)據(jù)庫事務(wù),需要取得數(shù)據(jù)庫事務(wù)的主鍵,記錄同步數(shù)據(jù)庫事務(wù)的主鍵,并將數(shù)據(jù)庫事務(wù)主鍵數(shù)量作為主鍵處理進(jìn)度值。
獲取到的數(shù)據(jù)庫事務(wù),按照數(shù)據(jù)庫事務(wù)主鍵信息,按照主數(shù)據(jù)庫中的順序增加到數(shù)據(jù)庫事務(wù)主鍵對應(yīng)主鍵寫隊列中,主鍵寫隊列按照先進(jìn)先出的順序方式執(zhí)行。對于沒有寫隊列的主鍵需要創(chuàng)建新的主鍵寫隊列,并將該事務(wù)置為寫隊列頂端,通知該主鍵處理進(jìn)度值減一。
同步事務(wù)執(zhí)行單元
同步事務(wù)執(zhí)行單元由三個組件組成,分別是同步事務(wù)處理組件、同步事務(wù)寫入組件和同步事務(wù)完成組件。
同步事務(wù)處理組件
輪詢各個待處理的數(shù)據(jù)庫事務(wù)主鍵處理進(jìn)度值,當(dāng)主鍵事務(wù)處理進(jìn)度值為0時進(jìn)入同步事務(wù)執(zhí)行組件。
其中,在主鍵寫隊列里面存在若干個待處理的數(shù)據(jù)庫事務(wù)主鍵等待執(zhí)行,且這些事務(wù)主鍵是有序的,只有該事務(wù)主鍵之前的事務(wù)主鍵執(zhí)行完成后才能輪到新的事務(wù)主鍵執(zhí)行,當(dāng)輪到該事務(wù)主鍵處理的時候,該事務(wù)主鍵處理進(jìn)度值為0,執(zhí)行完成后將該事務(wù)主鍵的處理進(jìn)度值設(shè)為-1,然后去輪詢所有事務(wù)主鍵,尋找事務(wù)主鍵進(jìn)度值為0的待處理的事務(wù)主鍵。
同步事務(wù)執(zhí)行組件
將主鍵處理進(jìn)度值為0的數(shù)據(jù)庫事務(wù)派發(fā)寫線程執(zhí)行,采用并行寫入方式將寫隊列的事務(wù)寫入備數(shù)據(jù)庫中。
同步事務(wù)完成組件
寫入備數(shù)據(jù)庫的數(shù)據(jù)庫事務(wù)完成后,刪除已經(jīng)完成的數(shù)據(jù)庫事務(wù),刪除位于主鍵寫隊列頂端的該數(shù)據(jù)庫事務(wù),主鍵寫隊列的第二條數(shù)據(jù)庫事務(wù)自動成為主鍵寫隊列的待處理事務(wù)。通知該數(shù)據(jù)庫所有事務(wù)主鍵處理進(jìn)度值減一。
作為本發(fā)明的另一個方面,本發(fā)明還公開了一個主備數(shù)據(jù)庫同步方法,包括以下步驟:
通過對主數(shù)據(jù)庫中的數(shù)據(jù)庫事務(wù)進(jìn)行讀取,獲得需要同步的數(shù)據(jù)庫事務(wù)信息,取得數(shù)據(jù)庫事務(wù)的主鍵,記錄同步數(shù)據(jù)庫事務(wù)的主鍵,并將數(shù)據(jù)庫事務(wù)主鍵數(shù)量作為主鍵處理進(jìn)度值;
按照數(shù)據(jù)庫事務(wù)主鍵信息,將獲取到的數(shù)據(jù)庫事務(wù)按照主數(shù)據(jù)庫中的順序增加到數(shù)據(jù)庫事務(wù)主鍵對應(yīng)主鍵寫隊列中,主鍵寫隊列按照先進(jìn)先出的順序方式執(zhí)行;其中,對于沒有寫隊列的主鍵需要創(chuàng)建新的主鍵寫隊列,并將該事務(wù)置為寫隊列頂端,通知該主鍵處理進(jìn)度值減一;
輪詢各個待處理的數(shù)據(jù)庫事務(wù)主鍵處理進(jìn)度值,當(dāng)主鍵事務(wù)處理進(jìn)度值為0時進(jìn)入同步事務(wù)執(zhí)行組件;
將主鍵處理進(jìn)度值為0的數(shù)據(jù)庫事務(wù)派發(fā)寫線程執(zhí)行,采用并行寫入方式將寫隊列的事務(wù)寫入備數(shù)據(jù)庫中;
寫入備數(shù)據(jù)庫的數(shù)據(jù)庫事務(wù)完成后,刪除已經(jīng)完成的數(shù)據(jù)庫事務(wù),刪除位于主鍵寫隊列頂端的該數(shù)據(jù)庫事務(wù),主鍵寫隊列的第二條數(shù)據(jù)庫事務(wù)自動成為主鍵寫隊列的待處理事務(wù);通知該數(shù)據(jù)庫事務(wù)主鍵處理進(jìn)度值減一。
作為本發(fā)明的一個優(yōu)選實施例,如圖2所示,本發(fā)明的主備數(shù)據(jù)庫同步方法,包括以下步驟:
讀取主數(shù)據(jù)庫中需要同步的數(shù)據(jù)庫事務(wù)信息,取得數(shù)據(jù)庫事務(wù)的主鍵,記錄同步數(shù)據(jù)庫事務(wù)的主鍵,并將數(shù)據(jù)庫事務(wù)主鍵數(shù)量作為主鍵處理進(jìn)度值;
判斷一數(shù)據(jù)庫事務(wù)是否已經(jīng)寫入主鍵寫隊列中,如果已經(jīng)寫入,則按照數(shù)據(jù)庫事務(wù)主鍵信息,將獲取到的數(shù)據(jù)庫事務(wù)按照主數(shù)據(jù)庫中的順序增加到數(shù)據(jù)庫事務(wù)主鍵對應(yīng)主鍵寫隊列中,主鍵寫隊列按照先進(jìn)先出的順序方式執(zhí)行;否則,創(chuàng)建新的主鍵寫隊列,并將該事務(wù)置為寫隊列頂端,通知該主鍵處理進(jìn)度值減一;
輪詢各個待處理的數(shù)據(jù)庫事務(wù)主鍵處理進(jìn)度值是否為0,如果主鍵事務(wù)處理進(jìn)度值為0,則進(jìn)入同步事務(wù)執(zhí)行組件;否則,將所有數(shù)據(jù)庫事務(wù)主鍵處理進(jìn)度值減一。
將主鍵處理進(jìn)度值為0的數(shù)據(jù)庫事務(wù)派發(fā)到寫線程執(zhí)行,并采用并行寫入方式將寫隊列的事務(wù)寫入備數(shù)據(jù)庫中;
寫入備數(shù)據(jù)庫的數(shù)據(jù)庫事務(wù)完成后,刪除已經(jīng)完成的數(shù)據(jù)庫事務(wù),刪除位于主鍵寫隊列頂端的該數(shù)據(jù)庫事務(wù),主鍵寫隊列的第二條數(shù)據(jù)庫事務(wù)自動成為主鍵寫隊列的待處理事務(wù);通知該數(shù)據(jù)庫事務(wù)主鍵處理進(jìn)度值減一。
重復(fù)上述輪詢步驟,直到主鍵寫隊列中所有數(shù)據(jù)庫事務(wù)均寫入備數(shù)據(jù)庫中,同步執(zhí)行完畢。
本發(fā)明的各個部件實施例可以以硬件實現(xiàn),或者以在一個或者多個處理器上運行的軟件模塊實現(xiàn),或者以它們的組合實現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實踐中使用微處理器或者數(shù)字信號處理器(dsp)來實現(xiàn)根據(jù)本發(fā)明實施例的相關(guān)設(shè)備中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計算機程序和計算機程序產(chǎn)品)。這樣的實現(xiàn)本發(fā)明的程序可以存儲在計算機可讀介質(zhì)上,或者可以具有一個或者多個信號的形式。這樣的信號可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號上提供,或者以任何其他形式提供。
應(yīng)該注意的是上述實施例對本發(fā)明進(jìn)行說明而不是對本發(fā)明進(jìn)行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計出替換實施例。在權(quán)利要求中,不應(yīng)將位于括號之間的任何參考符號構(gòu)造成對權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個”不排除存在多個這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計算機來實現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個可以是通過同一個硬件項來具體體現(xiàn)。
以上所述的具體實施例,對本發(fā)明的目的、技術(shù)方案和有益效果進(jìn)行了進(jìn)一步詳細(xì)說明,應(yīng)理解的是,以上所述僅為本發(fā)明的具體實施例而已,并不用于限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。