基于關(guān)聯(lián)型數(shù)據(jù)庫的歸檔日志同步方法及系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)安全技術(shù)領(lǐng)域,尤其涉及一種基于關(guān)聯(lián)型數(shù)據(jù)庫的歸檔日志同步方法及系統(tǒng)。
【背景技術(shù)】
[0002]MySQL是一種關(guān)聯(lián)型數(shù)據(jù)庫管理系統(tǒng),關(guān)聯(lián)型數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一大倉庫內(nèi),可增加速度并提高靈活性。MySQL主備通常采用的是異步備份機制,即主庫的事務(wù)完成后就返回給用戶。備庫獲取主庫的歸檔日志(Binlog)執(zhí)行,來實現(xiàn)主備一致。但異步備份機制在主庫提交事務(wù)后,如果發(fā)生主庫的機器操作系統(tǒng)崩潰后無法正常重啟,或磁盤壞道,而在崩潰之前最后的幾個事務(wù)的歸檔日志來不及發(fā)送給備庫,則會導(dǎo)致這幾個事務(wù)永久丟失。
[0003]對上述技術(shù)問題,現(xiàn)有的解決方案是半同步機制(Sem1-Sync),即等待歸檔日志傳給備庫并收到備庫的確認(rèn)信息后才返回給用戶。半同步機制有幾個權(quán)衡的變種,其總體的解決思路均為:如果主庫、備庫收到歸檔日志,并返回確認(rèn)后再提交事務(wù),那么在主庫返回用戶“事務(wù)已提交”時,能保證歸檔日志已經(jīng)發(fā)送給備庫,之后即使主庫崩潰無法恢復(fù),備庫仍能利用已經(jīng)傳到本地的歸檔日志恢復(fù)出事務(wù)。此后只需作一備庫已經(jīng)收到這個事務(wù)的主備切換,新主庫便能繼續(xù)提供服務(wù),對用戶來說數(shù)據(jù)沒有丟失。
[0004]但所述半同步機制存在的問題是,如果網(wǎng)絡(luò)出現(xiàn)抖動等網(wǎng)絡(luò)異常情況,則會由于主庫遲遲收不到備庫的確認(rèn)信息導(dǎo)致事務(wù)無法提交。從整個系統(tǒng)角度來看會降低系統(tǒng)可用性:原來只需保證主庫正常即可,現(xiàn)在網(wǎng)絡(luò)問題可能影響事務(wù)提交。一般的解決方法是,設(shè)定一時間閾值(例如I秒),如果超過所述時間閾值,則認(rèn)為網(wǎng)絡(luò)狀況已經(jīng)很差,退化成原生的異步備份機制,這降低了整個主備架構(gòu)對外的可用性。
[0005]綜上可知,現(xiàn)有技術(shù)在實際使用上顯然存在不便與缺陷,所以有必要加以改進。
【發(fā)明內(nèi)容】
[0006]針對上述的缺陷,本發(fā)明的目的在于提供一種基于關(guān)聯(lián)型數(shù)據(jù)庫的歸檔日志同步方法及系統(tǒng),通過采用歸檔日志雙寫機制來保證數(shù)據(jù)安全性,同時可提升系統(tǒng)可用性。
[0007]為了實現(xiàn)上述目的,本發(fā)明提供一種基于關(guān)聯(lián)型數(shù)據(jù)庫的歸檔日志同步方法,包括有:
[0008]第一日志寫步驟,主庫在正常服務(wù)時,所述主庫將第一歸檔日志寫入備庫,所述第一歸檔日志由所述主庫的本地歸檔日志提供;
[0009]第二日志寫步驟,所述主庫同時將第二歸檔日志寫入備庫機器的第一本地磁盤,所述第二歸檔日志由所述主庫的本地歸檔日志提供;
[0010]第一事務(wù)遞交步驟,當(dāng)所述第一歸檔日志和所述第二歸檔日志寫完后,所述主庫遞交事務(wù)。
[0011]根據(jù)本發(fā)明所述的歸檔日志同步方法,所述主庫與所述備庫之間以異步備份機制互為主備關(guān)系;
[0012]所述第一日志寫步驟包括:
[0013]所述主庫將所述第一歸檔日志異步寫入所述備庫;
[0014]所述第二日志寫步驟包括:
[0015]所述主庫同時將所述第二歸檔日志同步寫入所述備庫機器的所述第一本地磁盤。
[0016]根據(jù)本發(fā)明所述的歸檔日志同步方法,還包括主備切換步驟,所述主備切換步驟進一步包括:
[0017]獲取子步驟,所述備庫分別獲取所述第一歸檔日志和所述第二歸檔日志;
[0018]判斷子步驟,判斷所述第一歸檔日志和所述第二歸檔日志是否相同;
[0019]第一切換子步驟,若所述兩份歸檔日志相同,所述備庫執(zhí)行所述第一歸檔日志并直接作為新主庫提供服務(wù),所述主庫作為新備庫;
[0020]第二切換子步驟,若所述兩份歸檔日志不同,所述備庫執(zhí)行所述兩份歸檔日志中內(nèi)容最全的一個歸檔日志并作為新主庫提供服務(wù),所述主庫作為新備庫。
[0021]根據(jù)本發(fā)明所述的歸檔日志同步方法,所述獲取子步驟包括:
[0022]所述備庫從本地獲取所述第一歸檔日志,所述第一歸檔日志的最后位置為位置P ;
[0023]所述備庫登錄所述備庫機器的所述第一本地磁盤獲取所述第二歸檔日志,所述第二歸檔日志的最后位置為位置Q ;
[0024]所述判斷子步驟包括:
[0025]判斷所述位置P和所述位置Q是否相同;
[0026]所述第一切換子步驟包括:
[0027]若所述位置P和所述位置Q相同,所述備庫執(zhí)行所述第一歸檔日志并直接作為新主庫提供服務(wù),所述主庫作為新備庫;
[0028]所述第二切換子步驟包括:
[0029]若所述位置P和所述位置Q不同,且所述位置Q大于所述位置P,則所述備庫從所述位置P開始,將所述位置P之后的所述第二歸檔日志解析并在本地執(zhí)行以實現(xiàn)位置補償,所述備庫執(zhí)行完成后作為新主庫提供服務(wù),所述主庫作為新備庫。
[0030]根據(jù)本發(fā)明所述的歸檔日志同步方法,所述第二日志寫步驟還包括:
[0031]檢測網(wǎng)絡(luò)是否處于正常狀態(tài);
[0032]若網(wǎng)絡(luò)處于正常狀態(tài),則所述主庫同時將所述第二歸檔日志寫入所述備庫機器的所述第一本地磁盤;
[0033]若網(wǎng)絡(luò)處于異常狀態(tài),則所述主庫放棄寫入所述第二歸檔日志到所述第一本地磁盤;
[0034]若網(wǎng)絡(luò)從異常狀態(tài)恢復(fù)到正常狀態(tài),所述主庫將新的第二歸檔日志追加寫入所述第一本地磁盤;
[0035]所述第一事務(wù)遞交步驟包括:
[0036]若網(wǎng)絡(luò)正常,且當(dāng)所述第一歸檔日志和所述第二歸檔日志寫完后,所述主庫遞交事務(wù);
[0037]若網(wǎng)絡(luò)異常,且當(dāng)所述第一歸檔日志寫完后,所述主庫遞交事務(wù)。
[0038]根據(jù)本發(fā)明所述的歸檔日志同步方法,所述主備切換步驟進一步包括:
[0039]第三切換子步驟,若所述第二歸檔日志被放棄寫入,則所述備庫執(zhí)行所述第一歸檔日志并直接作為新主庫提供服務(wù),所述主庫作為新備庫。
[0040]根據(jù)本發(fā)明所述的歸檔日志同步方法,所述主備切換步驟之后還包括:
[0041]第三日志寫步驟,所述新主庫在正常服務(wù)時,所述新主庫將第三歸檔日志異步寫入所述新備庫,所述第三歸檔日志由所述新主庫的本地歸檔日志提供;
[0042]第四日志寫步驟,所述新主庫同時將第四歸檔日志同步寫入新備庫機器的第二本地磁盤,所述第四歸檔日志由所述新主庫的本地歸檔日志提供;
[0043]第二事務(wù)遞交步驟,當(dāng)所述第三歸檔日志和所述第四歸檔日志寫完后,所述新主庫遞交事務(wù)。
[0044]根據(jù)本發(fā)明所述的歸檔日志同步方法,還包括:
[0045]啟動步驟,所述主庫啟動后,所述主庫以發(fā)起者身份登錄所述備庫機器的所述第一本地磁盤;
[0046]所述第二日志寫步驟包括:
[0047]所述主庫以發(fā)起者身份通過ISCSI協(xié)議將所述第二歸檔日志寫入所述備庫機器的所述第一本地磁盤;
[0048]所述備庫獲取所述第二歸檔日志的步驟包括:
[0049]所述備庫以發(fā)起者身份登錄所述備庫機器的所述第一本地磁盤,并從所述第一本地磁盤中獲取所述第二歸檔日志。
[0050]根據(jù)本發(fā)明所述的歸檔日志同步方法,所述主備切換步驟的所述獲取子步驟之前還包括:
[0051]切換啟動子步驟,當(dāng)接收到用戶的主動切換指令或者檢測到所述主庫崩潰時,啟動主備切換。
[0052]根據(jù)本發(fā)明所述的歸檔日志同步方法,所述關(guān)聯(lián)型數(shù)據(jù)庫為MySQL,并在所述MySQL的源碼中增加double_f ile_dst_dir參數(shù),所述double_f ile_dst_dir參數(shù)映射所述備庫機器的所述第一本地磁盤的磁盤路徑,所述第一本地磁盤可供所述主庫和所述備庫訪問和讀與;
[0053]所述第二日志寫步驟包括:
[0054]所述主庫同時將所述第二歸檔日志寫入所述double_file_dst_dir參數(shù)中。
[0055]本發(fā)明還提供一種基于關(guān)聯(lián)型數(shù)據(jù)庫的歸檔日志同步系統(tǒng),所述歸檔日志同步系統(tǒng)包括主庫和備庫,所述主庫設(shè)于主庫機器中,所述備庫設(shè)于備庫機器中,所述備庫機器設(shè)有第一本地磁盤,所述主庫還包括有:
[0056]第一日志寫模塊,用于所述主庫在正常服務(wù)時,將第一歸檔日志寫入所述備庫,所述第一歸檔日志由所述主庫的本地歸檔日志提供;
[0057]第二日志寫模塊,用于同時將第二歸檔日志寫入所述備庫機器的所述第一本地磁盤,所述第二歸檔日志由所述主庫的本地歸檔日志提供;
[0058]第一事務(wù)遞交模塊,當(dāng)所述第一歸檔日志和所述第二歸檔日志寫完后,遞交事務(wù)。
[0059]根據(jù)本發(fā)明所述的歸檔日志同步系統(tǒng),所述主庫與所述備庫之間以異步備份機制互為主備關(guān)系;
[0060]所述第一日志寫模塊用于將所述第一歸檔日志異步寫入所述備庫;
[0061]所述第二日志寫模塊用于同時將所述第二歸檔日志同步寫入所述備庫機器的所述第一本地磁盤。
[0062]根據(jù)本發(fā)明所述的歸檔日志同步系統(tǒng),所述歸檔日志同步系統(tǒng)還包括主備切換模塊,所述主備切換模塊可設(shè)于所述主庫和/或所述備庫中,進一步包括:
[0063]獲取子模塊,用于控制所述備庫分別獲取第一歸檔日志和第二歸檔日志;
[0064]判斷子模塊,用于判斷所述第一歸檔日志和所述第二歸檔日志是否相同;
[0065]第一切換子模塊,用于若所述兩份歸檔日志相同,控制所述備庫執(zhí)行所述第一歸檔日志并直接作為新主庫提供服務(wù),所述主庫作為新備庫;
[0066]第二切換子模塊,用于若所述兩份歸檔日志不同,控制所述備庫執(zhí)行所述兩份歸檔日志中內(nèi)容最全的一個歸檔日志并作為新主庫提供服務(wù),所述主庫作為新備庫。
[0067]根據(jù)本發(fā)明所述的歸檔日志同步系統(tǒng),所述獲取子模塊用于控制所述備庫從本地獲取所述第一歸檔日志,所述第一歸檔日志的最后位置為位置P ;以及控制所述備庫登錄所述備庫機器的所述第一本地磁盤獲取所述第二歸檔日志,所述第二歸檔日志的最后位置為位置Q ;
[0068]所述判斷子模塊用于判斷所述位置P和所述位置Q是否相同;
[0069]所述第一切換子模塊用于若所述位置P和所述位置Q相同時,控制所述備庫執(zhí)行所述第一歸檔日志并直接作為新主庫提供服務(wù),所述主庫作為新備庫;
[0070]所述第二切換子模塊用于若所述位置P和所述位置Q不同時,且所述位置Q大于所述位置P,則控制所述備庫從所述位置P開始,將所述位置P之后的所述第二歸檔日志解析并在本地執(zhí)行以實現(xiàn)位置補償,所述備庫執(zhí)行完成后作為新主庫提供服務(wù),所述主庫作為新備庫。
[0