国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      主備數(shù)據(jù)庫同步的方法和裝置制造方法

      文檔序號:6493450閱讀:279來源:國知局
      主備數(shù)據(jù)庫同步的方法和裝置制造方法
      【專利摘要】本發(fā)明涉及一種主備數(shù)據(jù)庫同步的方法和裝置,用于主數(shù)據(jù)庫和備數(shù)據(jù)庫間的數(shù)據(jù)同步,該方法包括:事務派發(fā)步驟,將從主數(shù)據(jù)庫讀取的各個事務或各個事務的標識派發(fā)至寫隊列;事務寫入步驟,采用多個寫線程并行將各寫線程對應的寫隊列中的事務或標識對應的事務寫入備數(shù)據(jù)庫。本發(fā)明采用多個寫線程同時并行執(zhí)行寫入操作,減少了時延,可及時實現(xiàn)主備數(shù)據(jù)庫同步,提高了同步效率。
      【專利說明】主備數(shù)據(jù)庫同步的方法和裝置
      【技術領域】
      [0001]本申請涉及數(shù)據(jù)處理領域,尤其是一種數(shù)據(jù)庫主備數(shù)據(jù)庫同步的方法和裝置。
      【背景技術】
      [0002]MySQL是互聯(lián)網(wǎng)行業(yè)廣泛使用的開源數(shù)據(jù)庫軟件。很多大型網(wǎng)站都在使用MySQL數(shù)據(jù)庫,隨著業(yè)務規(guī)模不斷的增長,一臺MySQL數(shù)據(jù)庫會無法支撐龐大的訪問量。
      [0003]有一個有效的解決方案就是建立MySQL主備集群,備數(shù)據(jù)庫是主數(shù)據(jù)庫的完全鏡像。寫請求只落在主數(shù)據(jù)庫上,讀請求會均衡的分布到所有數(shù)據(jù)庫上,這樣整個集群可以提供更大容量的讀寫服務。MySQL主數(shù)據(jù)庫在接收新增變更數(shù)據(jù)后,再通過同步工具,把變更數(shù)據(jù)實時同步到備數(shù)據(jù)庫。
      [0004]Mysql binlog日志是一種二進制日志,包括三種格式,分別為ROW(行)格式、Statement (SQL語句)格式、MIX (混合)格式。其中ROW格式記錄了每次數(shù)據(jù)變更的整行完整的舊值和新值。信息豐富完整,并且擁有重復復制到從庫,得到的最終數(shù)據(jù)還是一致的特性。
      [0005]MySQL官方提供社區(qū)版,主備同步采用的是單線程同步。當主數(shù)據(jù)庫有較高的寫入負載時,主從同步的延時增加,導致從庫不能及時的讀取到最新的數(shù)據(jù),降低了整個集群的可用性。

      【發(fā)明內容】

      [0006]本申請要解決的技術問題是提供一種主備數(shù)據(jù)庫同步的方法和裝置,以解決現(xiàn)有主備數(shù)據(jù)庫同步效率低下的問題。
      [0007]為解決上述技術問題,本申請?zhí)峁┝艘环N主備數(shù)據(jù)庫同步的方法,用于主數(shù)據(jù)庫和備數(shù)據(jù)庫間的數(shù)據(jù)同步,該方法包括:
      [0008]事務派發(fā)步驟,將從主數(shù)據(jù)庫讀取的各個事務或各個事務的標識派發(fā)至寫隊列;
      [0009]事務寫入步驟,采用多個寫線程并行將各寫線程對應的寫隊列中的事務或標識對應的事務寫入備數(shù)據(jù)庫。
      [0010]進一步地,所述派發(fā)步驟前,該方法還包括:
      [0011 ] 預處理步驟,依次提取各個事務的主鍵,為各個事務創(chuàng)建主鍵列表,根據(jù)各個事務的主鍵列表,依次將各個事務的標識放入各個事務的主鍵對應的主鍵事務隊列中,處于主鍵事務隊列的隊首的事務獲得該主鍵對應的虛擬記錄鎖;
      [0012]派發(fā)事務或寫入事務的前提為該事務的虛擬記錄鎖總數(shù)等于該事務的主鍵列表中主鍵的總數(shù)。
      [0013]進一步地,所述預處理步驟中,去除重復的主鍵后創(chuàng)建所述主鍵列表。
      [0014]進一步地,所述派發(fā)步驟還包括:對于已經(jīng)寫入備數(shù)據(jù)庫的事務,刪除位于主鍵事務隊列隊首的該事務的事務標識,將虛擬記錄鎖傳遞給該主鍵事務隊列的下一個節(jié)點。
      [0015]進一步地,所述事務派發(fā)步驟由派發(fā)線程執(zhí)行,預處理步驟中,為各個事務創(chuàng)建虛擬記錄鎖計數(shù)器,該事務每獲得一個虛擬記錄鎖,該虛擬記錄鎖計數(shù)器加1,所述派發(fā)線程或寫線程根據(jù)所述虛擬記錄鎖計數(shù)器判斷當前事務的虛擬記錄鎖總數(shù)等于該事務的主鍵列表中主鍵的總數(shù)。
      [0016]進一步地,事務派發(fā)步驟中,根據(jù)寫隊列最短原則或事務哈希值為當前事務選擇寫隊列。
      [0017]進一步地,述事務的哈希值是將各個事務的第一個主鍵轉換成字符串,再通過哈希計算得到的。
      [0018]進一步地,事務寫入步驟之后,該方法還包括刪除步驟,刪除已寫入備數(shù)據(jù)庫的事務對象。
      [0019]為解決上述技術問題,本發(fā)明還提供了一種主備數(shù)據(jù)庫同步的裝置,該裝置包括:
      [0020]派發(fā)單元,用于依次將從主數(shù)據(jù)庫讀取的各個事務或各個事務的標識派發(fā)至寫隊列;
      [0021]寫入單元,用于采用多個寫線程并行將各寫線程對應的寫隊列中的事務或標識對應的事務寫入備數(shù)據(jù)庫;
      [0022]若干個寫隊列,用于存放派發(fā)單元派發(fā)的事務或事務的標識,一個寫隊列對應一個寫線程。
      [0023]相較于現(xiàn)有技術,本申請技術方案同步的最小單位是事務;在同步過程中確保了事務的原子性;且采用多個寫線程同時并行執(zhí)行寫入操作,減少了時延,可及時實現(xiàn)主備數(shù)據(jù)庫同步,提高了同步效率,增加了集群的可用性。
      【專利附圖】

      【附圖說明】
      [0024]圖1為本申請主備數(shù)據(jù)庫同步的方法實施例1的示意圖;
      [0025]圖2為本申請主備數(shù)據(jù)庫同步的方法實施例2的示意圖;
      [0026]圖3為本申請主備數(shù)據(jù)庫同步的方法實施例3的示意圖;
      [0027]圖4為本申請主備數(shù)據(jù)庫同步的方法實施例4的示意圖;
      [0028]圖5是本申請給出的一個應用實例的示意圖;
      [0029]圖6為本發(fā)明主備數(shù)據(jù)庫同步的裝置的模塊結構示意圖;
      [0030]圖7為本發(fā)明主備數(shù)據(jù)庫同步的裝置的另一模塊結構示意圖。
      【具體實施方式】
      [0031 ] 下面將結合本申請實施例中的附圖,對本申請實施例中的技術方案進行清楚、完整地描述。顯然,所描述的實施例僅僅是本申請一部分實施例,而非全部的實施例?;诒旧暾堉械膶嵤├?,本領域普通技術人員在沒有做出創(chuàng)造性勞動的前提下所獲得的所有其他實施例,都屬于本申請保護的范圍。需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的特征可以相互組合。
      [0032]實施例1
      [0033]本申請實施例主備數(shù)據(jù)庫同步的方法,如圖1所示,用于主數(shù)據(jù)庫和備數(shù)據(jù)庫間的數(shù)據(jù)同步,該方法包括:[0034]步驟101:事務派發(fā)步驟,依次將從主數(shù)據(jù)庫讀取的各個事務或各個事務的標識派發(fā)至寫隊列;
      [0035]本申請實施例從主數(shù)據(jù)庫讀出的事務的讀出的順序為其在主數(shù)據(jù)庫中提交并寫入日志的順序。
      [0036]該事務派發(fā)步驟由一個派發(fā)線程實現(xiàn)。
      [0037]事務派發(fā)步驟中,根據(jù)寫隊列最短原則或事務哈希值為當前事務選擇寫隊列。
      [0038]較佳地,采用寫隊列最短原則,即將當前待派發(fā)的事務派發(fā)至最短的寫隊列(即任務量最少的寫隊列),如此,可以較好地達到負載均衡。
      [0039]本申請對獲得事務的哈希值的方法不做限定,可選地,事務的哈希值可將各個事務的第一個主鍵轉換成字符串,再通過哈希計算得到的。
      [0040]步驟102:事務寫入步驟,采用多個寫線程并行將各寫線程對應的寫隊列中的事務或標識對應的事務寫入備數(shù)據(jù)庫。
      [0041]本申請中,同步的最小單位是事務;寫入備數(shù)據(jù)庫時,可以確保事務不被打散,SP主數(shù)據(jù)庫是一個事務寫入的記錄,從庫中也會在一個事務中寫入,在同步過程中確保了事務的原子性。
      [0042]可理解地,即使利用單線程將事務的標識串行派發(fā)至寫隊列,其速度仍然較快,而在事務寫入備數(shù)據(jù)庫時,采用多個寫線程同時并行執(zhí)行寫入操作,減少了時延,可及時實現(xiàn)主備數(shù)據(jù)庫同步,提高了同步效率,增加了集群的可用性。
      [0043]實施例2
      [0044]本申請主備數(shù)據(jù)庫同步的方法,如圖2所示,用于主數(shù)據(jù)庫和備數(shù)據(jù)庫間的數(shù)據(jù)同步,該方法包括:
      [0045]步驟201:預處理步驟,依次提取從主數(shù)據(jù)庫讀取的各個事務的主鍵,為各個事務創(chuàng)建主鍵列表,根據(jù)各個事務的主鍵列表,依次將各個事務的標識放入各個事務的主鍵對應的主鍵事務隊列中,處于主鍵事務隊列的隊首的事務該主鍵對應的虛擬記錄鎖;
      [0046]本文中,一個主鍵對應一個主鍵事務隊列,不同的主鍵對應不同的主鍵事務隊列。一個事務在寫入備數(shù)據(jù)庫之前,需要獲得該事務每條記錄對應的主鍵所對應的虛擬記錄鎖。
      [0047]例如,事務A的N個行記錄的主鍵均為a,則該主鍵a的主鍵事務隊列中包括該事務A的N個標識,當該主鍵事務隊列的隊首存放事務A的標識時,該事務A依次獲得該主鍵的N個虛擬記錄鎖。
      [0048]每個主鍵對應一個主鍵事務隊列(PK Tran Queue)。各個主鍵的虛擬記錄鎖按如下方式維護:事務標識處于主鍵事務隊列的隊首的事務,獲得該主鍵對應的虛擬記錄鎖;當隊首的事務標識對應的事務已經(jīng)寫入備數(shù)據(jù)庫后,刪除隊首,將虛擬記錄鎖傳遞給該隊列的下一個節(jié)點。
      [0049]步驟202:事務派發(fā)步驟,當事務的虛擬記錄鎖總數(shù)等于該事務的主鍵列表中主鍵的總數(shù)時將該事務派發(fā)至寫隊列;
      [0050]該事務派發(fā)步驟由一個派發(fā)線程實現(xiàn)。
      [0051]事務派發(fā)步驟中,根據(jù)寫隊列最短原則或事務哈希值為當前事務選擇寫隊列。
      [0052]較佳地,采用寫隊列最短原則,即選擇最短的寫隊列派發(fā)事務,可以較好地達到負載均衡。
      [0053]本申請對獲得事務的哈希值方法不做限定,可選地,事務的哈希值可將各個事務的第一個主鍵轉換成字符串,再通過哈希計算得到的。
      [0054]步驟203:事務寫入步驟,采用多個寫線程并行將各寫線程對應的寫隊列中的事務或標識對應的事務寫入備數(shù)據(jù)庫。
      [0055]可理解地,即使利用單線程將事務標識串行派發(fā)至寫隊列,其速度仍然較快,而在寫入備數(shù)據(jù)庫時,采用多個寫線程同時并行執(zhí)行寫入操作,減少了時延,可及時實現(xiàn)主備數(shù)據(jù)庫同步,提高了同步效率,增加了集群的可用性。
      [0056]可優(yōu)化地,以上實施例2中,步驟201預處理步驟中,為各個事務創(chuàng)建虛擬記錄鎖計數(shù)器,該事務每獲得一個虛擬記錄鎖,該虛擬記錄鎖計數(shù)器加1,步驟202事務派發(fā)步驟中,派發(fā)線程根據(jù)所述虛擬記錄鎖計數(shù)器判斷當前事件的虛擬記錄鎖總數(shù)是否等于該事務的主鍵列表中主鍵的總數(shù),進而決定是否將該事務派發(fā)至寫隊列。
      [0057]可選地,以上實施例2的步驟201預處理步驟中,創(chuàng)建的主鍵列表前,可刪除其中重復的主鍵,例如,事務A的N個行記錄的主鍵均為a,則刪除重復的主鍵后,此時主鍵a仍然對應事務A的N個行記錄。該主鍵a的主鍵事務隊列中包括該事務A的一個標識(比如指針),相應的,當事務A的標識排在主鍵a對應的主鍵事務隊列的隊首時,該事務A獲得該主鍵的I個虛擬記錄鎖。步驟202事務派發(fā)步驟中,派發(fā)線程仍然通過判斷該事件獲得的虛擬記錄鎖總數(shù)是否等于該事務的主鍵列表中主鍵的總數(shù)來觸發(fā)事務派發(fā)。
      [0058]實施例3
      [0059]本申請主備數(shù)據(jù)庫同步的方法,如圖3所示,用于主數(shù)據(jù)庫和備數(shù)據(jù)庫間的數(shù)據(jù)同步,該方法包括:
      [0060]步驟301:預處理步驟,依次提取各個從主數(shù)據(jù)庫讀取的事務的主鍵,并去除重復的主鍵,為各個事務創(chuàng)建主鍵列表;根據(jù)各個事務的主鍵列表,依次將各個事務的標識(比如指針)放入該事務各個主鍵對應的主鍵事務隊列中,事務標識處于主鍵事務隊列的隊首的事務獲得該主鍵對應的虛擬記錄鎖;
      [0061]步驟301中,依次從事務的各個行記錄中提取主鍵,去除重復的主鍵后,一個主鍵對應一個或若干個行記錄。
      [0062]各個主鍵的虛擬記錄鎖按如下方式維護:處于主鍵事務隊列隊首的事務標識對應事務,獲得該主鍵對應的虛擬記錄鎖;當隊首的的事務標識對應事務已經(jīng)寫入備數(shù)據(jù)庫后,刪除隊首,將虛擬記錄鎖傳遞給該隊列的下一個節(jié)點。
      [0063]步驟302:事務派發(fā)步驟,依次將各個事務或各個事務的標識派發(fā)至寫隊列;
      [0064]該事務派發(fā)步驟由一個派發(fā)線程實現(xiàn)。
      [0065]事務派發(fā)步驟中,根據(jù)寫隊列最短原則或事務哈希值為當前事務選擇寫隊列。
      [0066]較佳地,采用寫隊列最短原則,即選擇最短的寫隊列派發(fā)事務,可以較好地達到負載均衡。
      [0067]本申請對獲得事務的哈希值方法不做限定,可選地,事務的哈希值可將各個事務的第一個主鍵轉換成字符串,再通過哈希計算得到的。
      [0068]步驟303:事務寫入步驟,采用多個寫線程并行實現(xiàn),寫線程判斷位于寫隊列隊首的事務的虛擬記錄鎖總數(shù)等于該事務的主鍵列表中主鍵的總數(shù)時,將該事務寫入備數(shù)據(jù)庫。
      [0069]可理解地,即使利用單線程將事務標識串行派發(fā)至寫隊列,其速度仍然較快,而在寫入備數(shù)據(jù)庫時,采用多個寫線程同時并行執(zhí)行寫入操作,減少了時延,可及時實現(xiàn)主備數(shù)據(jù)庫同步,提高了同步效率,增加了集群的可用性。
      [0070]可優(yōu)化地,以上實施例3中,步驟301預處理步驟中,為各個事務創(chuàng)建虛擬記錄鎖計數(shù)器,該事務每獲得一個虛擬記錄鎖,該虛擬記錄鎖計數(shù)器加1,步驟303事務寫入步驟中,寫線程根據(jù)所述虛擬記錄鎖計數(shù)器判斷當前事務的虛擬記錄鎖總數(shù)等于該事務的主鍵列表中主鍵的總數(shù)。
      [0071]實施例4
      [0072]如圖4,本實施例中大量使用了隊列(Queue)和哈希(Hash)計算,所以本文也稱本申請為哈希隊列算法。
      [0073]本實施例中包括輸入隊列(Input Queue),源隊列(Source Queue)、主鍵事務隊列(PK Tran Queue)、寫隊列(Wrtier Queue)、待釋放隊列(Free Queue)、預處理線程(Preprocess Thread),派發(fā)線程(Dispatcherd Thread),寫線程(WrtierThread);其中只有寫線程(Writer Thread)和寫隊列(Writer Queue)根據(jù)配置創(chuàng)建多個,其他均為單個實例;一個寫線程對應一個寫隊列。
      [0074]如圖各個關鍵模塊中維護和管理了一些隊列,接下來按照數(shù)據(jù)流轉的過程,介紹本方案的實施過程和關鍵模塊:
      [0075]步驟401,對輸入隊列(Input Queue)中的事務進行預處理;
      [0076]輸入隊列(Input Queue)中存放著本申請的輸入數(shù)據(jù),即一個個事務的指針,按照主數(shù)據(jù)庫中讀出事務的順序,先讀出,先存入其事務指針,先消費。
      [0077]預處理線程(Preprocess Thread),把輸入隊列中的事務指針對應的事務做如下處理:
      [0078]創(chuàng)建事務隊列節(jié)點(BinlogItem),包括如下屬性:輸入的事務,該事務的主鍵列表(PK List),事務的Hash值,虛擬記錄鎖計數(shù)器。
      [0079]提取事務的主鍵,去除重復主鍵,對每個事務創(chuàng)建一個主鍵列表,包括事務中的每行記錄對應的主鍵;
      [0080]計算事務哈希(Hash)值,提取事務隊列中的第一個主鍵,把他轉換成字符串,例如“庫名.表名.列名.值”,再通過Hash計算,把主鍵字符串映射為64位的長整形Hash值,作為事務派發(fā)到寫隊列中使用的Hash值。
      [0081]初始化虛擬記錄鎖計算器的值為零。
      [0082]源隊列(Source Queue),事務預處理完成后,就放入到源隊列(SourceQueue)。源隊列只是用來暫存做完預處理的事務隊列節(jié)點(BinlogItem);
      [0083]主鍵事務隊列(PK Tran Queue),即一個主鍵對應一個隊列,這個隊列中按先進先出的模式存放著預處理完的事務隊列節(jié)點(BinlogItem)的指針;事務隊列節(jié)點的指針位于主鍵事務隊列的隊首,即標志著對應的事務取得了該主鍵對應的虛擬記錄鎖;
      [0084]一個事務有多少個不同主鍵,就進入多少個不同的主鍵事務隊列;進入的對象直接是事務隊列節(jié)點(BinlogItem)的指針,這個對象指向整個事務,事務由是由所有記錄組成。[0085]根據(jù)各個事務的主鍵列表,依次將各個事務的事務隊列節(jié)點的指針放入該事務各個主鍵對應的主鍵事務隊列中,處于主鍵事務隊列隊首的事務隊列節(jié)點的指針對應的事務即獲得該主鍵對應的虛擬記錄鎖。
      [0086]回收事務的記錄占有的虛擬記錄鎖,當事務已經(jīng)寫入備數(shù)據(jù)庫后,釋放主鍵事務隊列(PK Tran Queue)中的事務隊列節(jié)點指針對應的事務。從該事務的事務主鍵列表中,逐個獲得每個主鍵,再獲得該主鍵對應的主鍵事務隊列(PK Tran Queue),并刪除隊首,然后把虛擬記錄鎖傳遞給該主鍵事務隊列(PKTran Queue)中的下一個節(jié)點(BinlogItem),即下一個節(jié)點對應的事務的虛擬記錄鎖計數(shù)器加I ;如果該隊列已經(jīng)是空的,即可刪除釋放該隊列,完成本步驟后再釋放隊列節(jié)點對象。
      [0087]待釋放隊列(Free Queue),先進先出隊列,用來存放已經(jīng)寫入到備數(shù)據(jù)庫的事務隊列節(jié)點的指針;
      [0088]派發(fā)線程根據(jù)待釋放隊列中的事務隊列節(jié)點的指針,釋放內存中對應的事務對象,此時寫線程已將對應事務寫入了備數(shù)據(jù)庫,完成了同步。
      [0089]虛擬記錄鎖,每條記錄對應一個虛擬記錄鎖,虛擬記錄鎖有兩種狀態(tài),鎖定、未鎖定;鎖定狀態(tài)是表示這條記錄在本系統(tǒng)中已經(jīng)鎖定,把該記錄寫入備數(shù)據(jù)庫,不會產(chǎn)生數(shù)據(jù)沖突;未鎖定狀態(tài),表示該記錄還不具備寫入備數(shù)據(jù)庫的先決條件。本申請中,一個事務在寫入備數(shù)據(jù)庫之前,需要獲得該事務每條記錄對應的主鍵所對應的虛擬記錄鎖;一個事務中所有不同記錄的虛擬記錄鎖,采用事務隊列節(jié)點(BinlogItem)的虛擬記錄鎖計數(shù)器屬性來描述。獲得一條記錄的虛擬記錄鎖,即表示鎖定該記錄,或者說該記錄的虛擬記錄鎖狀態(tài)被設置為鎖定。
      [0090]虛擬記錄鎖計數(shù)器,是一個整形計數(shù)器,初始值為0,最大值等于步驟I預處理后事務的主鍵列表的大小(即主鍵列表中主鍵的總數(shù));對應的事務每次獲得一個虛擬記錄鎖,對應的數(shù)值就加1,當一個事務獲得的所有虛擬記錄鎖的總數(shù)等于主鍵列表的大小時,表示該事務可以寫入備數(shù)據(jù)庫,而不會產(chǎn)生任何數(shù)據(jù)沖突了。
      [0091]虛擬記錄鎖計算器是對單個事務而言,是否已經(jīng)具寫到從庫的條件的標志。因為一個事務可能排在部分主鍵事務隊列的隊首,同時排在部分主鍵事務隊列的隊中,此種情況下,根據(jù)本申請,該事務就不具備執(zhí)行派發(fā)或寫入的前置條件,除非該事務獲得所有虛擬記錄鎖。
      [0092]步驟402:派發(fā)事務到寫隊列;
      [0093]派發(fā)事務有兩種方式:
      [0094]a.先獲得所有虛擬記錄鎖,再派發(fā):先把事務隊列節(jié)點的指針放到該事務隊列節(jié)點所有主鍵對應的主鍵事務隊列(PK Tran Queue)的隊尾中,如果事務隊列節(jié)點的指針已經(jīng)排在隊首,那么對應的事務隊列節(jié)點即獲得該主鍵對應的虛擬記錄鎖,該事務隊列節(jié)點的虛擬記錄鎖計數(shù)器屬性加I ;否則主鍵事務隊列中事務隊列節(jié)點就等待獲取虛擬記錄鎖,當一個事務隊列節(jié)點獲得了所有的虛擬記錄鎖之后,即可被派發(fā)到寫隊列,派發(fā)的算法可以是,遍歷寫隊列,把事務隊列節(jié)點的指針或事務指針放入最短的寫隊列;也可以根據(jù)步驟I生成的事務哈希值,通過哈希算法派發(fā),例如Tran Hash Value % WriteQueue Size即用事務哈希值取模隊列數(shù),得到的數(shù)值作為寫隊列數(shù)組的下標;
      [0095]b.直接派發(fā):先把事務隊列節(jié)點的指針放到其所有主鍵對應的主鍵事務隊列(PKTran Queue)中,如果事務隊列節(jié)點的指針已經(jīng)排在隊首,那么對應的事務隊列節(jié)點即獲得該主鍵對應的虛擬記錄鎖;無論事務隊列節(jié)點是否獲得所有虛擬記錄鎖,都派發(fā)事務隊列節(jié)點的指針到寫隊列。派發(fā)的算法可以據(jù)步驟I生成的事務哈希值,通過哈希算法派發(fā)。采用這種派發(fā)方式,寫線程在把每個事務寫入備數(shù)據(jù)庫前需要檢查該事務是否獲得所有虛擬記錄鎖,如果沒有則等待事務獲得所有虛擬記錄鎖后再寫入。
      [0096]步驟403,并行寫入事務,
      [0097]寫隊列(Wrtier Queue)也是一個先進先出(FIFO)隊列,存放由步驟402派發(fā)來的事務隊列節(jié)點的指針;每個寫線程對應一個寫隊列;
      [0098]如果步驟403中采用a方式,則每個寫線程根據(jù)自己的寫隊列中的事務隊列節(jié)點的指針去內存取事務,按照數(shù)據(jù)庫事務的標準寫入事務(即開始事務,逐條寫入記錄,提交事務),寫入完成后,把事務隊列節(jié)點的指針的從寫隊列中移除,并放回到待釋放隊列(FreeQueue)。
      [0099]如果步驟403中采用b方式,則寫入之前,寫線程先檢查該事務隊列節(jié)點是否獲得所有虛擬記錄鎖,如果是那么寫入;如果否那么等待該事務隊列節(jié)點獲得所有虛擬記錄鎖再執(zhí)行寫入操作
      [0100]本申請采用C/C++會有較好的性能,但是也可以采用其他高級語言編寫。在本申請的實施實驗中,確定本申請可以使得備數(shù)據(jù)庫寫入達到極限;
      [0101]本申請中預處理和派發(fā)事務到寫隊列是串行執(zhí)行的,而寫入步驟是并行執(zhí)行,如此,對修改了相同記錄的事務依次串行寫入備數(shù)據(jù)庫,對于不相關的事務即修改的是完全不同記錄的事務,并行處理。
      [0102]如圖5所示,輸入數(shù)據(jù)為三個有序的事務,事務I (Tran I)和事務2(Tran 2)都更新了同一條記錄B,那么事務I和事務2應該串行,并且順序必須是先寫入事務1,再寫入事務2。事務3和事務1、事務2都沒關系,所以也可以并行寫入。采用本申請機制,可以同時執(zhí)行事務I和事務3的寫入操作。而事務2,因為沒有獲得足夠的虛擬記錄鎖,只好等待,直到它獲得足夠的虛擬記錄鎖,即可寫入備數(shù)據(jù)庫。從而對事務的并行和串行進行了有效控制,達到可以并行的并行,應該串行的串行。
      [0103]在事務I和事務2的事務隊列節(jié)點不寫入同一個寫隊列時,在事務I寫入前,如果是403a,則執(zhí)行事務2的寫線程會被掛起,直到事務I寫完,并釋放完虛擬記錄鎖;如果是403b,那么事務2在事務I寫入之前都不會被派發(fā)至寫隊列。
      [0104]以上實施例中,輸入隊列主要是為了保證其中的節(jié)點對應的事務是按照主數(shù)據(jù)庫中事務讀出的順序,具體的輸入隊列的節(jié)點是事務、事務的指針對本發(fā)明實質不會產(chǎn)生影響。
      [0105]源隊列中的節(jié)點是根據(jù)輸入隊列中的順序生成的事務隊列節(jié)點,各事務隊列節(jié)點包括事務的各個屬性參數(shù)及本發(fā)明特有的事務的虛擬記錄鎖計數(shù)器。
      [0106]每個主鍵事務隊列對應一個特定的主鍵,其中存放的節(jié)點是該主鍵對應的、根據(jù)輸入隊列或源隊列(即能保證事務時序)中的事務時序存放的事務指針或事務隊列節(jié)點的指針,其主要用于對事務的虛擬記錄鎖進行計數(shù)以及事務獲得虛擬記錄鎖的時序進行控制。
      [0107]寫隊列和待釋放隊列中的節(jié)點是事務的指針或事務隊列節(jié)點的指針,主要用于指示寫線程對哪個事務進行寫入操作或完成了寫入操作。
      [0108]綜上可以看出,事務的指針或事務隊列節(jié)點的指針均具有標識事務的作用,可統(tǒng)稱事務標識。從主數(shù)據(jù)庫輸出的事務僅需要緩存一次,待寫隊列中事務標識對應的事務寫入備數(shù)據(jù)庫后,刪除待釋放隊列中事務標識對應的事務即可。
      [0109]采用事務的標識可減少緩存資源的占用,提高處理效率。
      [0110]為實現(xiàn)上述方法,本發(fā)明還提供了一種主備數(shù)據(jù)庫同步的裝置,如圖6所示,該裝置包括:
      [0111]派發(fā)單元,用于依次將從主數(shù)據(jù)庫讀取的各個事務或各個事務的標識派發(fā)至寫隊列;
      [0112]派發(fā)單元根據(jù)寫隊列最短原則或事務哈希值為當前事務選擇寫隊列。
      [0113]所述事務哈希值是將各個事務的第一個主鍵轉換成字符串,再通過哈希計算得到的。
      [0114]寫入單元,用于采用多個寫線程并行將各寫線程對應的寫隊列中的事務或標識對應的事務寫入備數(shù)據(jù)庫;
      [0115]若干個寫隊列,用于存放派發(fā)單元派發(fā)的事務或事務的標識,一個寫隊列對應一個寫線程。
      [0116]如圖7所示,與圖6不同的是,所述裝置還包括:
      [0117]預處理單元,用于依次提取各個事務的主鍵,為各個事務創(chuàng)建主鍵列表;還用于根據(jù)各個事務的主鍵列表,依次將各個事務的指針放入該事務各個主鍵對應的主鍵事務隊列中,事務的指針處于隊首的事務即獲得該主鍵對應的虛擬記錄鎖;
      [0118]若干個主鍵事務隊列,用于存儲各個事務的標識;
      [0119]所述派發(fā)單元或寫入單元,當事務獲得的虛擬記錄鎖總數(shù)等于該事務的主鍵列表中主鍵的總數(shù)時,派發(fā)事務或寫入事務。
      [0120]優(yōu)選地,所述預處理單元去除重復的主鍵后創(chuàng)建事務的主鍵列表。
      [0121]優(yōu)選地,所述派發(fā)單元,還用于刪除各個主鍵事務隊列隊首的已經(jīng)寫入備數(shù)據(jù)庫的事務的事務標識,將虛擬記錄鎖傳遞給該隊列的下一個節(jié)點。
      [0122]優(yōu)選地,所述派發(fā)單元由派發(fā)線程實現(xiàn),預處理單元還用于為各個事務創(chuàng)建虛擬記錄鎖計數(shù)器,該事務每獲得一個虛擬記錄鎖,該虛擬記錄鎖計數(shù)器加1,所述派發(fā)單元或寫入單元根據(jù)所述虛擬記錄鎖計數(shù)器判斷當前事件的虛擬記錄鎖總數(shù)等于該事務的主鍵列表中主鍵的總數(shù)。
      [0123]本申請技術方案具有以下優(yōu)點:
      [0124]同步的最小單位是事務;寫入備數(shù)據(jù)庫時,可以確保事務不被打散,即主數(shù)據(jù)庫是一個事務寫入的記錄,從庫中也會在一個事務中寫入,在同步過程中確保了事務的原子性;
      [0125]采用多個寫線程同時并行執(zhí)行寫入操作,減少了時延,可及時實現(xiàn)主備數(shù)據(jù)庫同步,提高了同步效率,增加了集群的可用性;
      [0126]通過虛擬記錄鎖,使得不同事務間可以并行寫入備數(shù)據(jù)庫而又可以確保時序和不產(chǎn)生死鎖;
      [0127]在同一個派發(fā)線程(Dispatcher Thread)中處理虛擬記錄鎖的回收、分配,避免了多線程爭用記錄鎖,提升了性能,降低了程序復雜度;
      [0128]可以先派發(fā)事務到寫隊列,讓寫線程去校驗是否獲得所有記錄鎖;也可以獲得所有記錄鎖后再派發(fā)事務入寫隊列,而后直接寫入備數(shù)據(jù)庫;事務寫到備數(shù)據(jù)庫后,都要放回到待釋放隊列;
      [0129]采用本申請,可以對數(shù)據(jù)庫同步,進行并行同步,提高數(shù)據(jù)寫入速度超過500%的同時、控制最大延時在I秒以內,即提高了吞吐量,減少了時延,并且還能確保同步的過程中事務不被打散,具有事務強一致性的優(yōu)點。
      【權利要求】
      1.一種主備數(shù)據(jù)庫同步的方法,用于主數(shù)據(jù)庫和備數(shù)據(jù)庫間的數(shù)據(jù)同步,其特征在于,該方法包括: 事務派發(fā)步驟,將從主數(shù)據(jù)庫讀取的各個事務或各個事務的標識派發(fā)至寫隊列; 事務寫入步驟,采用多個寫線程并行將各寫線程對應的寫隊列中的事務或標識對應的事務寫入備數(shù)據(jù)庫。
      2.如權利要求1所述的方法,其特征在于:所述派發(fā)步驟前,該方法還包括: 預處理步驟,依次提取各個事務的主鍵,為各個事務創(chuàng)建主鍵列表,根據(jù)各個事務的主鍵列表,依次將各個事務的標識放入各個事務的主鍵對應的主鍵事務隊列中,處于主鍵事務隊列的隊首的事務獲得該主鍵對應的虛擬記錄鎖; 派發(fā)事務或寫入事務的前提為該事務的虛擬記錄鎖總數(shù)等于該事務的主鍵列表中主鍵的總數(shù)。
      3.如權利要求2所述的方法,其特征在于:所述預處理步驟中,去除重復的主鍵后創(chuàng)建所述主鍵列表。
      4.如權利要求2所述的方法,其特征在于,所述派發(fā)步驟還包括:對于已經(jīng)寫入備數(shù)據(jù)庫的事務,刪除位于主鍵事務隊列隊首的該事務的事務標識,將虛擬記錄鎖傳遞給該主鍵事務隊列的下一個節(jié)點。
      5.如權利要求4所述的方法,其特征在于:所述事務派發(fā)步驟由派發(fā)線程執(zhí)行,預處理步驟中,為各個事務創(chuàng)建虛擬記錄鎖計數(shù)器,該事務每獲得一個虛擬記錄鎖,該虛擬記錄鎖計數(shù)器加1,所述派發(fā)線程或 寫線程根據(jù)所述虛擬記錄鎖計數(shù)器判斷當前事務的虛擬記錄鎖總數(shù)等于該事務的主鍵列表中主鍵的總數(shù)。
      6.如權利要求1所述的方法,其特征在于:事務派發(fā)步驟中,根據(jù)寫隊列最短原則或事務哈希值為當前事務選擇寫隊列。
      7.如權利要求6所述的方法,其特征在于:所述事務的哈希值是將各個事務的第一個主鍵轉換成字符串,再通過哈希計算得到的。
      8.如權利要求1所述的方法,其特征在于:事務寫入步驟之后,該方法還包括刪除步驟,刪除已寫入備數(shù)據(jù)庫的事務對象。
      9.一種主備數(shù)據(jù)庫同步的裝置,其特征在于,該裝置包括: 派發(fā)單元,用于依次將從主數(shù)據(jù)庫讀取的各個事務或各個事務的標識派發(fā)至寫隊列; 寫入單元,用于采用多個寫線程并行將各寫線程對應的寫隊列中的事務或標識對應的事務寫入備數(shù)據(jù)庫; 若干個寫隊列,用于存放派發(fā)單元派發(fā)的事務或事務的標識,一個寫隊列對應一個寫線程。
      10.如權利要求9所述的裝置,其特征在于:所述裝置還包括: 預處理單元,用于依次提取各個事務的主鍵,為各個事務創(chuàng)建主鍵列表;還用于根據(jù)各個事務的主鍵列表,依次將各個事務的指針放入該事務各個主鍵對應的主鍵事務隊列中,事務的指針處于隊首的事務即獲得該主鍵對應的虛擬記錄鎖; 若干個主鍵事務隊列,用于存儲各個事務的標識; 所述派發(fā)單元或寫入單元,當 事務獲得的虛擬記錄鎖總數(shù)等于該事務的主鍵列表中主鍵的總數(shù)時,派發(fā)事務或寫入事務。
      11.如權利要求10所述的裝置,其特征在于,所述派發(fā)單元,還用于刪除已經(jīng)寫入備數(shù)據(jù)庫的事務對應的主鍵事務隊列隊首的事務標識,將虛擬記錄鎖傳遞給該隊列的下一個節(jié)點。
      12.如權利要求10所述的裝置,其特征在于:所述派發(fā)單元由派發(fā)線程實現(xiàn),預處理單元還用于為各個事務創(chuàng)建虛擬記錄鎖計數(shù)器,該事務每獲得一個虛擬記錄鎖,該虛擬記錄鎖計數(shù)器加1,所述派發(fā)單元或寫入單元根據(jù)所述虛擬記錄鎖計數(shù)器判斷當前事件的虛擬記錄鎖總數(shù)等于該事務的主鍵列表中主鍵的總數(shù)。
      13.如權利要求9所述的裝置,其特征在于:派發(fā)單元根據(jù)寫隊列最短原則或事務哈希值為當前事務選擇寫隊列。
      14.如權利要求10所述的裝置,其特征在于:所述事務哈希值是將各個事務的第一個主鍵轉換成字 符串,再通過哈希計算得到的。
      【文檔編號】G06F17/30GK103885986SQ201210564590
      【公開日】2014年6月25日 申請日期:2012年12月21日 優(yōu)先權日:2012年12月21日
      【發(fā)明者】葉暉俊 申請人:阿里巴巴集團控股有限公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1