两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

主備數(shù)據(jù)庫切換方法和裝置與流程

文檔序號:12034676閱讀:632來源:國知局
主備數(shù)據(jù)庫切換方法和裝置與流程

本發(fā)明涉及數(shù)據(jù)庫技術(shù)領(lǐng)域,尤其涉及一種主備數(shù)據(jù)庫切換方法和裝置。



背景技術(shù):

在現(xiàn)今數(shù)據(jù)庫應(yīng)用中,數(shù)據(jù)庫并發(fā)度高、數(shù)據(jù)增長速度快是當(dāng)今數(shù)據(jù)庫業(yè)務(wù)兩大特點(diǎn)。在短時(shí)間內(nèi),可能存在大量數(shù)據(jù)新增或修改。隨著數(shù)據(jù)數(shù)量級遞增,從字節(jié)、千字節(jié)、兆字節(jié)到現(xiàn)在的萬兆字節(jié),結(jié)合mariadb/mysql數(shù)據(jù)庫良好橫向擴(kuò)展特性,基于mariadb/mysql數(shù)據(jù)庫的分布式數(shù)據(jù)庫得到廣泛的應(yīng)用。

同時(shí)為了提高數(shù)據(jù)庫容災(zāi)性,各數(shù)據(jù)庫提供商均提出了相應(yīng)策略,其中mariadb/mysql數(shù)據(jù)庫使用的是主從復(fù)制策略,其核心理念是主數(shù)據(jù)庫對外提供服務(wù),當(dāng)主庫有更新的時(shí)候,主庫會把更新操作的sql寫入二進(jìn)制日志(binlog),并維護(hù)一個二進(jìn)制日志文件的索引,以便于日志文件輪回(rotate)。從數(shù)據(jù)庫讀取主數(shù)據(jù)庫運(yùn)行所生成binlog日志,并執(zhí)行binlog日志中相關(guān)動作,從而保證主從數(shù)據(jù)庫數(shù)據(jù)一致。當(dāng)數(shù)據(jù)庫主機(jī)出現(xiàn)宕機(jī),需要在較短時(shí)間內(nèi)恢復(fù)應(yīng)用,就需要使用從機(jī)來充當(dāng)主數(shù)據(jù)庫(即主備切換),如何判斷從機(jī)數(shù)據(jù)庫和主機(jī)數(shù)據(jù)庫數(shù)據(jù)是否一致,如何在較短時(shí)間內(nèi)將主從機(jī)數(shù)據(jù)庫數(shù)據(jù)恢復(fù)成一致,成為一個技術(shù)難題。

主從復(fù)制是備機(jī)復(fù)制主機(jī)binlog日志,由于存在主機(jī)寫日志時(shí)延和網(wǎng)絡(luò)通訊時(shí)延以及備機(jī)回放日志時(shí)延等因素,因此必然存在主備日志不同步現(xiàn)象。當(dāng)前業(yè)界識別主備數(shù)據(jù)是否一致的通常做法大致有兩種:一種業(yè)務(wù)應(yīng)用層用戶自行在主數(shù)據(jù)庫新增監(jiān)控表,定期更新該表中的時(shí)間戳,管理模塊監(jiān)控主備機(jī)監(jiān)控表中時(shí)間戳差值判斷主備數(shù)據(jù)同步差距情況。另外一種是在數(shù)據(jù)庫主備機(jī)分別增加dbagent代理模塊,定時(shí)查詢數(shù)據(jù)庫的當(dāng)前binlog位置,上報(bào)給管理模塊,由管理模塊判斷主備機(jī)數(shù)據(jù)同步差距情況。

以上兩種方式存在如下弊端:

1、均引入了第三方的管理模塊,增加了交互復(fù)雜度,同時(shí)當(dāng)?shù)谌焦芾砟K出現(xiàn)故障情況下,整個監(jiān)控系統(tǒng)癱瘓,發(fā)生故障時(shí)無法實(shí)現(xiàn)切換。

2、由于引入第三方管理模塊并且是定時(shí)上報(bào),因此存在周期內(nèi)的時(shí)間差問題,眾所周知數(shù)據(jù)庫應(yīng)用每秒鐘的tps都是成千上萬的,而這種定時(shí)上報(bào)機(jī)制至少也是秒級,因此大大降低了判斷精度,無法保證在切換的時(shí)候主備機(jī)是強(qiáng)一致的,對數(shù)據(jù)安全要求極高的保險(xiǎn)類、證券類、銀行類等行業(yè)是無法接受這種方案的。

3、上述方式二當(dāng)數(shù)據(jù)庫服務(wù)正常,而監(jiān)控?cái)?shù)據(jù)庫運(yùn)行情況的主dbagent代理模塊異常,也可能會引起異常的數(shù)據(jù)庫的主備切換。



技術(shù)實(shí)現(xiàn)要素:

本發(fā)明的主要目的在于提出一種主備數(shù)據(jù)庫切換方法和裝置,旨在解決現(xiàn)有技術(shù)中主備數(shù)據(jù)庫進(jìn)行切換時(shí),數(shù)據(jù)精度差,操作復(fù)雜,穩(wěn)定性低的問題。

為實(shí)現(xiàn)上述目的,本發(fā)明提出一種主備數(shù)據(jù)庫切換方法,包括:

執(zhí)行連接本機(jī)數(shù)據(jù)庫服務(wù)操作;

接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置;

若所述連接本機(jī)數(shù)據(jù)庫服務(wù)操作的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則判定所述本機(jī)數(shù)據(jù)庫異常,并執(zhí)行告警操作或在所述本機(jī)數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進(jìn)行主備切換操作,或者,若所述接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則執(zhí)行告警操作或在所述本機(jī)數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進(jìn)行主備切換操作。

優(yōu)選地,所述執(zhí)行連接本機(jī)數(shù)據(jù)庫服務(wù)操作的步驟包括:

執(zhí)行連接數(shù)據(jù)庫服務(wù)操作,定時(shí)獲取本機(jī)數(shù)據(jù)庫當(dāng)前位置;

所述接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置的步驟包括:

接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置,將所述本機(jī)數(shù)據(jù)庫當(dāng)前位置與所述對端數(shù)據(jù)庫當(dāng)前位置進(jìn)行比對;

所述接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置,將所述本機(jī)數(shù)據(jù)庫當(dāng)前位置與所述對端數(shù)據(jù)庫當(dāng)前位置進(jìn)行比對的步驟之后,還包括:

當(dāng)所述本機(jī)數(shù)據(jù)庫當(dāng)前位置與所述對端數(shù)據(jù)庫當(dāng)前位置的差值大于預(yù)設(shè)的閾值時(shí),執(zhí)行告警操作。

優(yōu)選地,所述若所述連接本機(jī)數(shù)據(jù)庫服務(wù)操作的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則判定所述本機(jī)數(shù)據(jù)庫異常,并執(zhí)行告警操作或在所述本機(jī)數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進(jìn)行主備切換操作的步驟包括:

若所述本機(jī)數(shù)據(jù)庫為備數(shù)據(jù)庫,所述對端數(shù)據(jù)庫為主數(shù)據(jù)庫,則執(zhí)行告警操作,并繼續(xù)執(zhí)行連接檢測操作;

若所述本機(jī)數(shù)據(jù)庫為主數(shù)據(jù)庫,所述對端數(shù)據(jù)庫為備數(shù)據(jù)庫,則解析所述本機(jī)數(shù)據(jù)庫的日志文件,獲取所述本機(jī)數(shù)據(jù)庫的最后位置,并根據(jù)所述最后位置執(zhí)行主備切換操作。

優(yōu)選地,所述執(zhí)行主備切換操作的步驟包括:

若所述主數(shù)據(jù)庫的最后位置不為空,則對比所述主數(shù)據(jù)庫的最后位置與所述備數(shù)據(jù)庫當(dāng)前位置,其中,若所述備數(shù)據(jù)庫當(dāng)前位置等于所述主數(shù)據(jù)庫的最后位置,則執(zhí)行自動切換操作,若所述備數(shù)據(jù)庫當(dāng)前位置小于所述主數(shù)據(jù)庫的最后位置,則根據(jù)業(yè)務(wù)要求決策是否執(zhí)行所述自動切換操作;

若所述主數(shù)據(jù)庫的最后位置為空,則對比所述主數(shù)據(jù)庫的當(dāng)前位置與所述備數(shù)據(jù)庫當(dāng)前位置,其中,若所述備數(shù)據(jù)庫當(dāng)前位置大于或等于所述主數(shù)據(jù)庫的當(dāng)前位置,則執(zhí)行所述自動切換操作,否則,則根據(jù)業(yè)務(wù)要求決策是否執(zhí)行所述自動切換操作。

優(yōu)選地,所述自動切換操作包括:

切換所述備數(shù)據(jù)庫為主數(shù)據(jù)庫,并在所述備數(shù)據(jù)庫服務(wù)恢復(fù)后,重新恢復(fù)主備復(fù)制關(guān)系。

優(yōu)選地,所述獲取所述本機(jī)數(shù)據(jù)庫的最后位置的步驟包括:

獲取所述本機(jī)數(shù)據(jù)庫的當(dāng)前日志文件列表;

從所述當(dāng)前日志文件列表中的最后一個日志文件開始掃描,并從所述最后一個日志文件的最后一個事件中獲取所述本機(jī)數(shù)據(jù)庫的最后位置;

若無法從所述最后一個日志文件找到所述最后一個事件,則掃描所述最后一個日志文件的上一個日志文件,直到找到所述最后一個事件。

為實(shí)現(xiàn)上述目的,本發(fā)明還提出一種主備數(shù)據(jù)庫切換裝置,包括:

連接模塊,用于執(zhí)行連接本機(jī)數(shù)據(jù)庫服務(wù)操作;

位置模塊,用于接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置;

執(zhí)行模塊,用于若所述連接本機(jī)數(shù)據(jù)庫服務(wù)操作的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則判定所述本機(jī)數(shù)據(jù)庫異常,并執(zhí)行告警操作或在所述本機(jī)數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進(jìn)行主備切換操作,或者,若所述接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng) 前位置的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則執(zhí)行告警操作或在所述本機(jī)數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進(jìn)行主備切換操作。

優(yōu)選地,所述連接模塊,還用于執(zhí)行連接本機(jī)數(shù)據(jù)庫服務(wù)操作,定時(shí)獲取本機(jī)數(shù)據(jù)庫當(dāng)前位置;

所述位置模塊,還用于接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置,將所述本機(jī)數(shù)據(jù)庫當(dāng)前位置與所述對端數(shù)據(jù)庫當(dāng)前位置進(jìn)行比對;

所述裝置還包括:

告警模塊,用于當(dāng)所述本機(jī)數(shù)據(jù)庫當(dāng)前位置與所述對端數(shù)據(jù)庫當(dāng)前位置的差值大于預(yù)設(shè)的閾值時(shí),執(zhí)行告警操作。

優(yōu)選地,所述執(zhí)行模塊,還用于若所述本機(jī)數(shù)據(jù)庫為備數(shù)據(jù)庫,所述對端數(shù)據(jù)庫為主數(shù)據(jù)庫,則執(zhí)行告警操作,并繼續(xù)執(zhí)行連接檢測操作;若所述本機(jī)數(shù)據(jù)庫為主數(shù)據(jù)庫,所述對端數(shù)據(jù)庫為備數(shù)據(jù)庫,則解析所述本機(jī)數(shù)據(jù)庫的日志文件,獲取所述本機(jī)數(shù)據(jù)庫的最后位置,并根據(jù)所述最后位置執(zhí)行主備切換操作。

優(yōu)選地,所述執(zhí)行模塊,還用于若所述主數(shù)據(jù)庫的最后位置不為空,則對比所述主數(shù)據(jù)庫的最后位置與所述備數(shù)據(jù)庫當(dāng)前位置,其中,若所述備數(shù)據(jù)庫當(dāng)前位置等于所述主數(shù)據(jù)庫的最后位置,則執(zhí)行自動切換操作,若所述備數(shù)據(jù)庫當(dāng)前位置小于所述主數(shù)據(jù)庫的最后位置,則根據(jù)業(yè)務(wù)要求決策是否執(zhí)行所述自動切換操作;若所述主數(shù)據(jù)庫的最后位置為空,則對比所述主數(shù)據(jù)庫的當(dāng)前位置與所述備數(shù)據(jù)庫當(dāng)前位置,其中,若所述備數(shù)據(jù)庫當(dāng)前位置大于或等于所述主數(shù)據(jù)庫的當(dāng)前位置,則執(zhí)行所述自動切換操作,否則,則根據(jù)業(yè)務(wù)要求決策是否執(zhí)行所述自動切換操作。

優(yōu)選地,所述執(zhí)行模塊,還用于若所述用戶為非指定用戶,則執(zhí)行指定定向信息綁卡操作。

優(yōu)選地,所述執(zhí)行模塊,還用于獲取所述本機(jī)數(shù)據(jù)庫的當(dāng)前日志文件列表;從所述當(dāng)前日志文件列表中的最后一個日志文件開始掃描,并從所述最后一個日志文件的最后一個事件中獲取所述本機(jī)數(shù)據(jù)庫的最后位置;若無法從所述最后一個日志文件找到所述最后一個事件,則掃描所述最后一個日志文件的上一個日志文件,直到找到所述最后一個事件。

本發(fā)明公開了一種主備數(shù)據(jù)庫切換方法和裝置,通過執(zhí)行連接本機(jī)數(shù)據(jù)庫服 務(wù)操作;接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置;若連接數(shù)據(jù)庫服務(wù)操作的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則判定本機(jī)數(shù)據(jù)庫異常,并執(zhí)行告警操作或在本機(jī)數(shù)據(jù)庫和對端數(shù)據(jù)庫之間進(jìn)行主備切換操作,或者,若接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則執(zhí)行告警操作或在本機(jī)數(shù)據(jù)庫和對端數(shù)據(jù)庫之間進(jìn)行主備切換操作,解決了現(xiàn)有技術(shù)中主備數(shù)據(jù)庫進(jìn)行切換時(shí),數(shù)據(jù)精度差,操作復(fù)雜,穩(wěn)定性低的問題。實(shí)現(xiàn)了實(shí)時(shí)監(jiān)控掌握主備數(shù)據(jù)庫同步差距情況,簡化操作,保證數(shù)據(jù)一致性,同時(shí)避免誤切換。

附圖說明

圖1是本發(fā)明主備數(shù)據(jù)庫切換方法第一實(shí)施例的流程示意圖;

圖2是本發(fā)明實(shí)施例中主備數(shù)據(jù)庫復(fù)制監(jiān)控管理架構(gòu)圖;

圖3是本發(fā)明主備數(shù)據(jù)庫切換方法第二實(shí)施例的流程示意圖;

圖4是本發(fā)明實(shí)施例中若所述連接本機(jī)數(shù)據(jù)庫服務(wù)操作的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則判定所述本機(jī)數(shù)據(jù)庫異常,并執(zhí)行告警操作或在所述本機(jī)數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進(jìn)行主備切換操作的步驟的一種流程示意圖;

圖5是本發(fā)明實(shí)施例中執(zhí)行主備切換操作的步驟的一種流程示意圖;

圖6是本發(fā)明實(shí)施例中自動切換操作的步驟的一種流程示意圖;

圖7是本發(fā)明實(shí)施例中獲取所述本機(jī)數(shù)據(jù)庫的最后位置的步驟的一種流程示意圖;

圖8是本發(fā)明實(shí)施例中主備切換前后binlog日志位置變化關(guān)系圖;

圖9是本發(fā)明主備數(shù)據(jù)庫切換裝置第一實(shí)施例的功能模塊示意圖;

圖10是本發(fā)明主備數(shù)據(jù)庫切換裝置第二實(shí)施例的功能模塊示意圖。

本發(fā)明目的的實(shí)現(xiàn)、功能特點(diǎn)及優(yōu)點(diǎn)將結(jié)合實(shí)施例,參照附圖做進(jìn)一步說明。

具體實(shí)施方式

應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。

如圖1所示,本發(fā)明第一實(shí)施例提出一種主備數(shù)據(jù)庫切換方法,包括:

步驟s10,執(zhí)行連接本機(jī)數(shù)據(jù)庫服務(wù)操作。

本發(fā)明方法的執(zhí)行主體可以為一種數(shù)據(jù)庫管理平臺或數(shù)據(jù)庫服務(wù)器,具體應(yīng)用于主數(shù)據(jù)庫或備數(shù)據(jù)庫將在下述說明書進(jìn)行具體說明,當(dāng)然也不限定于其他能夠?qū)崿F(xiàn)主備數(shù)據(jù)庫切換的設(shè)備或服務(wù)器。

其中,本發(fā)明主要通過利用mariadb和binlog日志保障數(shù)據(jù)庫主備數(shù)據(jù)同步過程可監(jiān)控,保證數(shù)據(jù)庫異常時(shí)快速自動切換。

其中,在具體實(shí)現(xiàn)時(shí),可以在主備數(shù)據(jù)庫所在設(shè)備上部署數(shù)據(jù)庫代理軟件dbagent(或其他能夠?qū)崿F(xiàn)相同功能的軟件),dbagent是一種數(shù)據(jù)庫代理軟件,可以用于監(jiān)控?cái)?shù)據(jù)庫服務(wù)運(yùn)行情況,解析binlog日志文件,在出現(xiàn)故障時(shí)可以用于切換控制進(jìn)程;其中,在mariadb數(shù)據(jù)庫運(yùn)行過程中,會將執(zhí)行過的相關(guān)動作記錄到binlog日志文件中,以備從數(shù)據(jù)庫讀取同步數(shù)據(jù),mariadb數(shù)據(jù)庫執(zhí)行過程中,產(chǎn)生binlog日志文件時(shí),會相應(yīng)給出binlog位置,即當(dāng)前日志位置(長整形值)。

具體地,主備數(shù)據(jù)庫的dbagent定時(shí)監(jiān)控本機(jī)數(shù)據(jù)庫運(yùn)行情況及當(dāng)前binlog日志中的最新gtid,同時(shí),主備數(shù)據(jù)庫之間互相共享主備機(jī)數(shù)據(jù)庫運(yùn)行情況。

當(dāng)本機(jī)數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時(shí):

主數(shù)據(jù)庫的dbagent定時(shí)通過mysql協(xié)議,用特定的用戶連接主數(shù)據(jù)庫服務(wù)端口,查詢并獲取本機(jī)數(shù)據(jù)庫當(dāng)前位置(當(dāng)前gtid_current_pos),并進(jìn)行記錄更新,通過心跳消息接口發(fā)送給備數(shù)據(jù)庫的dbagent進(jìn)行記錄。

當(dāng)本機(jī)數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時(shí):

備數(shù)據(jù)庫的dbagent定時(shí)通過mysql協(xié)議,用特定的用戶連接備數(shù)據(jù)庫服務(wù)端口,查詢并獲取本機(jī)數(shù)據(jù)庫當(dāng)前位置(當(dāng)前gtid_current_pos),并進(jìn)行記錄更新,通過心跳消息接口發(fā)送給主數(shù)據(jù)庫的dbagent進(jìn)行記錄。

步驟s20,接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置。

具體地,當(dāng)本機(jī)數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時(shí):

主數(shù)據(jù)庫的dbagent接收備數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,記錄備數(shù)據(jù)庫當(dāng)前gtid_current_pos位置。

當(dāng)本機(jī)數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時(shí):

備數(shù)據(jù)庫的dbagent接收主數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,記錄主數(shù)據(jù)庫當(dāng)前gtid_current_pos位置。

步驟s30,若所述連接本機(jī)數(shù)據(jù)庫服務(wù)操作的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則判定所述本機(jī)數(shù)據(jù)庫異常,并執(zhí)行告警操作或在所述本機(jī)數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進(jìn)行主備切換操作,或者,若所述接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則執(zhí)行告警操作或在所述本機(jī)數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進(jìn)行主備切換操作。

具體地,當(dāng)本機(jī)數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時(shí):

若備數(shù)據(jù)庫的dbagent連接數(shù)據(jù)庫服務(wù)失敗超出規(guī)定次數(shù)(比如10次,該次數(shù)可以是系統(tǒng)預(yù)先設(shè)置的,也可以由用戶根據(jù)實(shí)際使用情況進(jìn)行修改),判定當(dāng)前主數(shù)據(jù)庫異常,繼續(xù)執(zhí)行連接檢測操作。

當(dāng)本機(jī)數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時(shí):

若備數(shù)據(jù)庫的dbagent連接數(shù)據(jù)庫服務(wù)失敗超出規(guī)定次數(shù)(比如10次,該次數(shù)可以是系統(tǒng)預(yù)先設(shè)置的,也可以由用戶根據(jù)實(shí)際使用情況進(jìn)行修改),判定當(dāng)前主數(shù)據(jù)庫異常,解析主數(shù)據(jù)庫的日志文件,獲取主數(shù)據(jù)庫的最后位置,并根據(jù)最后位置執(zhí)行主備切換操作,在具體實(shí)現(xiàn)時(shí),可以采取如下方式:

1、通過解析數(shù)據(jù)庫binlog日志文件的方式,獲取主數(shù)據(jù)庫最后的gtid_current_pos位置,記錄為last_pos位置;

2、主數(shù)據(jù)庫的dbagent發(fā)送切換請求消息至備數(shù)據(jù)庫的dbagent,該消息中包括主數(shù)據(jù)庫的last_pos位置;

3、主數(shù)據(jù)庫的dbagent繼續(xù)定時(shí)檢測數(shù)據(jù)庫服務(wù)是否正常,直至數(shù)據(jù)庫服務(wù)恢復(fù);

4、主數(shù)據(jù)庫的dbagent根據(jù)切換請求中的主數(shù)據(jù)庫的last_pos位置,發(fā)起主備切換流程,其中:

若主數(shù)據(jù)庫的最后位置不為空,則對比主數(shù)據(jù)庫的最后位置與備數(shù)據(jù)庫當(dāng)前位置,其中,若備數(shù)據(jù)庫當(dāng)前位置等于主數(shù)據(jù)庫的最后位置,則執(zhí)行自動切換操作,若備數(shù)據(jù)庫當(dāng)前位置小于主數(shù)據(jù)庫的最后位置,則根據(jù)業(yè)務(wù)要求決策是否執(zhí)行自動切換操作;

若主數(shù)據(jù)庫的最后位置為空,則對比主數(shù)據(jù)庫的當(dāng)前位置與備數(shù)據(jù)庫當(dāng)前位置,其中,若備數(shù)據(jù)庫當(dāng)前位置大于或等于主數(shù)據(jù)庫的當(dāng)前位置,則執(zhí)行自動切換操作,否則,則根據(jù)業(yè)務(wù)要求決策是否執(zhí)行自動切換操作。

上述自動切換操作具體為:切換備數(shù)據(jù)庫為主數(shù)據(jù)庫,并在備數(shù)據(jù)庫服務(wù)恢 復(fù)后,重新恢復(fù)主備復(fù)制關(guān)系。

或者,當(dāng)主機(jī)數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時(shí):

如果主數(shù)據(jù)庫的dbagent超出規(guī)定次數(shù)未接收到主數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,則執(zhí)行告警告警操作。

當(dāng)主機(jī)數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時(shí):

如果備數(shù)據(jù)庫的dbagent超出規(guī)定次數(shù)未接收到主數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,則通過mysql協(xié)議連接主數(shù)據(jù)庫服務(wù)端口獲取主數(shù)據(jù)庫當(dāng)前位置gtid_current_pos,如果獲取成功說明主數(shù)據(jù)庫的dbagent進(jìn)程運(yùn)行異常,數(shù)據(jù)庫服務(wù)正常,無須發(fā)起主備切換,只需告警并記錄相關(guān)日志,如果獲取失敗,說明主數(shù)據(jù)庫dbagent進(jìn)程和數(shù)據(jù)庫服務(wù)均異常,此時(shí)可以發(fā)起主備切換請求。

另外,如圖2所示,為主從復(fù)制監(jiān)控管理平臺架構(gòu)圖,具體描述如下:

主數(shù)據(jù)庫執(zhí)行ddl語句或包含更新sql的事務(wù)時(shí),為該事務(wù)分配一個全局唯一的順序的gtid編號,事務(wù)提交前寫入二進(jìn)制binlog日志文件同時(shí)同步給從數(shù)據(jù)庫,從數(shù)據(jù)庫讀取主數(shù)據(jù)庫的binlog日志信息同步數(shù)據(jù),回復(fù)執(zhí)行對應(yīng)的sql語句,從而達(dá)到與主數(shù)據(jù)庫數(shù)據(jù)同步;

數(shù)據(jù)庫代理軟件dbagent定時(shí)監(jiān)測本機(jī)數(shù)據(jù)庫服務(wù)運(yùn)行情況,通過mysql協(xié)議連接訪問本機(jī)數(shù)據(jù)庫監(jiān)控?cái)?shù)據(jù)庫運(yùn)行是否正常,同時(shí)獲取本機(jī)數(shù)據(jù)庫當(dāng)前gtid_current_pos位置定時(shí)發(fā)送心跳消息給對端dbagent,dbagent接收到對端的心跳消息后解析記錄對端數(shù)據(jù)庫的gtid_current_pos位置,比對本機(jī)數(shù)據(jù)庫與對端數(shù)據(jù)庫的gtid_current_pos位置,根據(jù)差值判斷主從數(shù)據(jù)庫的數(shù)據(jù)同步情況,當(dāng)主從數(shù)據(jù)庫gtid_current_pos差距超過設(shè)定范圍進(jìn)行實(shí)時(shí)告警等相關(guān)措施。

進(jìn)一步,數(shù)據(jù)庫代理軟件dbagent一定時(shí)間內(nèi)接收不到對端dbagent發(fā)送的心跳消息后,主動通過mysql協(xié)議連接對端數(shù)據(jù)庫服務(wù),判斷對端數(shù)據(jù)庫服務(wù)是否正常,同時(shí)獲取對端數(shù)據(jù)庫的gtid_current_pos位置,如果連接失敗則判定對端數(shù)據(jù)庫異常,根據(jù)數(shù)據(jù)庫的主從角色決策是否發(fā)起主備切換。

通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換方法,該方法能夠?qū)崟r(shí)監(jiān)控掌握主從數(shù)據(jù)同步差距情況,間接了解系統(tǒng)的寫事務(wù)負(fù)載變化情況;去掉了第三方管理組件,直接規(guī)避了第三方管理組件故障引起的整個系統(tǒng)不可用問題;簡化處理邏輯的同時(shí)也簡化了安裝部署,dbagent可以與db進(jìn)行軟件捆綁,各數(shù)據(jù)庫節(jié)點(diǎn)部署統(tǒng)一簡便;快速識別主備機(jī)數(shù)據(jù)庫數(shù)據(jù)不一致,數(shù)據(jù)一致時(shí)能自動 進(jìn)行主備切換,并構(gòu)建新主從復(fù)制關(guān)系。數(shù)據(jù)不一致時(shí)能自動化生成差異化sql腳本,為人工干預(yù)節(jié)約時(shí)間,并高度保證數(shù)據(jù)一致性;在dbagent本身進(jìn)程異常數(shù)據(jù)庫服務(wù)正常情況下,避免不必要的誤切換。

如圖3所示,本發(fā)明第二實(shí)施例提出一種主備數(shù)據(jù)庫切換方法,包括:

步驟s11,執(zhí)行連接本機(jī)數(shù)據(jù)庫服務(wù)操作,定時(shí)獲取本機(jī)數(shù)據(jù)庫當(dāng)前位置。

具體地,主備數(shù)據(jù)庫的dbagent定時(shí)監(jiān)控本機(jī)數(shù)據(jù)庫運(yùn)行情況及當(dāng)前binlog日志中的最新gtid,同時(shí),主備數(shù)據(jù)庫之間互相共享主備機(jī)數(shù)據(jù)庫運(yùn)行情況。

當(dāng)本機(jī)數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時(shí):

主數(shù)據(jù)庫的dbagent定時(shí)通過mysql協(xié)議,用特定的用戶連接主數(shù)據(jù)庫服務(wù)端口,查詢并獲取本機(jī)數(shù)據(jù)庫當(dāng)前位置(當(dāng)前gtid_current_pos),并進(jìn)行記錄更新,通過心跳消息接口發(fā)送給備數(shù)據(jù)庫的dbagent進(jìn)行記錄。

當(dāng)本機(jī)數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時(shí):

備數(shù)據(jù)庫的dbagent定時(shí)通過mysql協(xié)議,用特定的用戶連接備數(shù)據(jù)庫服務(wù)端口,查詢并獲取本機(jī)數(shù)據(jù)庫當(dāng)前位置(當(dāng)前gtid_current_pos),并進(jìn)行記錄更新,通過心跳消息接口發(fā)送給主數(shù)據(jù)庫的dbagent進(jìn)行記錄。

步驟s21,接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置,將所述本機(jī)數(shù)據(jù)庫當(dāng)前位置與所述對端數(shù)據(jù)庫當(dāng)前位置進(jìn)行比對。

具體地,當(dāng)本機(jī)數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時(shí):

主數(shù)據(jù)庫的dbagent接收備數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,記錄備數(shù)據(jù)庫當(dāng)前gtid_current_pos位置,比對主數(shù)據(jù)庫的當(dāng)前gtid_current_pos位置和備數(shù)據(jù)庫的當(dāng)前gtid_current_pos位置。

當(dāng)本機(jī)數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時(shí):

備數(shù)據(jù)庫的dbagent接收主數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,記錄主數(shù)據(jù)庫當(dāng)前gtid_current_pos位置,比對主數(shù)據(jù)庫的當(dāng)前gtid_current_pos位置和備數(shù)據(jù)庫的當(dāng)前gtid_current_pos位置。

步驟s40,當(dāng)所述本機(jī)數(shù)據(jù)庫當(dāng)前位置與所述對端數(shù)據(jù)庫當(dāng)前位置的差值大于預(yù)設(shè)的閾值時(shí),執(zhí)行告警操作。

具體地,當(dāng)主數(shù)據(jù)庫的當(dāng)前gtid_current_pos位置和備數(shù)據(jù)庫的當(dāng)前gtid_current_pos位置差值大于配置的閾值時(shí)(該閾值可以是系統(tǒng)預(yù)先設(shè)置的,也 可以由用戶根據(jù)實(shí)際使用情況進(jìn)行修改),采取相應(yīng)措施,如告警等。

通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換方法,該方法能夠?qū)崟r(shí)監(jiān)控掌握主從數(shù)據(jù)同步差距情況,間接了解系統(tǒng)的寫事務(wù)負(fù)載變化情況;去掉了第三方管理組件,直接規(guī)避了第三方管理組件故障引起的整個系統(tǒng)不可用問題;簡化處理邏輯的同時(shí)也簡化了安裝部署,dbagent可以與db進(jìn)行軟件捆綁,各數(shù)據(jù)庫節(jié)點(diǎn)部署統(tǒng)一簡便;快速識別主備機(jī)數(shù)據(jù)庫數(shù)據(jù)不一致,數(shù)據(jù)一致時(shí)能自動進(jìn)行主備切換,并構(gòu)建新主從復(fù)制關(guān)系。數(shù)據(jù)不一致時(shí)能自動化生成差異化sql腳本,為人工干預(yù)節(jié)約時(shí)間,并高度保證數(shù)據(jù)一致性;在dbagent本身進(jìn)程異常數(shù)據(jù)庫服務(wù)正常情況下,避免不必要的誤切換。

進(jìn)一步的,為了更好地保證貯備數(shù)據(jù)庫切換時(shí)數(shù)據(jù)的一致性,參照圖4,為本發(fā)明具體實(shí)施方式中,若所述連接本機(jī)數(shù)據(jù)庫服務(wù)操作的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則判定所述本機(jī)數(shù)據(jù)庫異常,并執(zhí)行告警操作或在所述本機(jī)數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進(jìn)行主備切換操作的步驟的一種流程示意圖。

作為一種實(shí)施方式,上述步驟s30包括:

步驟s31,若所述本機(jī)數(shù)據(jù)庫為備數(shù)據(jù)庫,所述對端數(shù)據(jù)庫為主數(shù)據(jù)庫,則執(zhí)行告警操作,并繼續(xù)執(zhí)行連接檢測操作。

具體地,當(dāng)本機(jī)數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時(shí):

若備數(shù)據(jù)庫的dbagent連接數(shù)據(jù)庫服務(wù)失敗超出規(guī)定次數(shù)(比如10次,該次數(shù)可以是系統(tǒng)預(yù)先設(shè)置的,也可以由用戶根據(jù)實(shí)際使用情況進(jìn)行修改),判定當(dāng)前主數(shù)據(jù)庫異常,繼續(xù)執(zhí)行連接檢測操作。

步驟s32,若所述本機(jī)數(shù)據(jù)庫為主數(shù)據(jù)庫,所述對端數(shù)據(jù)庫為備數(shù)據(jù)庫,則解析所述本機(jī)數(shù)據(jù)庫的日志文件,獲取所述本機(jī)數(shù)據(jù)庫的最后位置,并根據(jù)所述最后位置執(zhí)行主備切換操作。

具體地,當(dāng)本機(jī)數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時(shí):

若備數(shù)據(jù)庫的dbagent連接數(shù)據(jù)庫服務(wù)失敗超出規(guī)定次數(shù)(比如10次,該次數(shù)可以是系統(tǒng)預(yù)先設(shè)置的,也可以由用戶根據(jù)實(shí)際使用情況進(jìn)行修改),判定當(dāng)前主數(shù)據(jù)庫異常,解析主數(shù)據(jù)庫的日志文件,獲取主數(shù)據(jù)庫的最后位置,并根據(jù)最后位置執(zhí)行主備切換操作,在具體實(shí)現(xiàn)時(shí),可以采取如下方式:

1、通過解析數(shù)據(jù)庫binlog日志文件的方式,獲取主數(shù)據(jù)庫最后的 gtid_current_pos位置,記錄為last_pos位置;

2、主數(shù)據(jù)庫的dbagent發(fā)送切換請求消息至備數(shù)據(jù)庫的dbagent,該消息中包括主數(shù)據(jù)庫的last_pos位置;

3、主數(shù)據(jù)庫的dbagent繼續(xù)定時(shí)檢測數(shù)據(jù)庫服務(wù)是否正常,直至數(shù)據(jù)庫服務(wù)恢復(fù);

4、主數(shù)據(jù)庫的dbagent根據(jù)切換請求中的主數(shù)據(jù)庫的last_pos位置,發(fā)起主備切換流程,其中:

若主數(shù)據(jù)庫的最后位置不為空,則對比主數(shù)據(jù)庫的最后位置與備數(shù)據(jù)庫當(dāng)前位置,其中,若備數(shù)據(jù)庫當(dāng)前位置等于主數(shù)據(jù)庫的最后位置,則執(zhí)行自動切換操作,若備數(shù)據(jù)庫當(dāng)前位置小于主數(shù)據(jù)庫的最后位置,則根據(jù)業(yè)務(wù)要求決策是否執(zhí)行自動切換操作;

若主數(shù)據(jù)庫的最后位置為空,則對比主數(shù)據(jù)庫的當(dāng)前位置與備數(shù)據(jù)庫當(dāng)前位置,其中,若備數(shù)據(jù)庫當(dāng)前位置大于或等于主數(shù)據(jù)庫的當(dāng)前位置,則執(zhí)行自動切換操作,否則,則根據(jù)業(yè)務(wù)要求決策是否執(zhí)行自動切換操作。

通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換方法,該方法通過在本機(jī)數(shù)據(jù)庫異常時(shí),主備數(shù)據(jù)庫執(zhí)行的不同處理方式,更好地實(shí)現(xiàn)了實(shí)時(shí)監(jiān)控掌握主備數(shù)據(jù)庫同步差距情況,簡化操作,保證數(shù)據(jù)一致性,同時(shí)避免誤切換。

進(jìn)一步的,為了更好地保證貯備數(shù)據(jù)庫切換時(shí)數(shù)據(jù)的一致性,參照圖5,為本發(fā)明具體實(shí)施方式中,執(zhí)行主備切換操作的步驟的一種流程示意圖。

作為一種實(shí)施方式,上述步驟s32包括:

步驟s321,若所述主數(shù)據(jù)庫的最后位置不為空,則對比所述主數(shù)據(jù)庫的最后位置與所述備數(shù)據(jù)庫當(dāng)前位置,其中,若所述備數(shù)據(jù)庫當(dāng)前位置等于所述主數(shù)據(jù)庫的最后位置,則執(zhí)行自動切換操作,若所述備數(shù)據(jù)庫當(dāng)前位置小于所述主數(shù)據(jù)庫的最后位置,則根據(jù)業(yè)務(wù)要求決策是否執(zhí)行所述自動切換操作。

具體地,如果主數(shù)據(jù)庫的last_pos位置不為空,則比較主數(shù)據(jù)庫最后的gtid位置last_pos和備數(shù)據(jù)庫的當(dāng)前gtid_current_pos是否一致,如果備數(shù)據(jù)庫gtid_current_pos等于主數(shù)據(jù)庫last_pos則進(jìn)行自動切換操作,如果備數(shù)據(jù)庫gtid_current_pos小于主數(shù)據(jù)庫last_pos說明主數(shù)據(jù)庫的數(shù)據(jù)尚未完全同步至主數(shù)據(jù)庫,主備數(shù)據(jù)庫數(shù)據(jù)不一致,此時(shí),可以根據(jù)業(yè)務(wù)要求決策是否需要自動切換 并記錄相關(guān)的日志信息。

其中,根據(jù)mariadb的復(fù)制原理,不可能出現(xiàn)備數(shù)據(jù)庫gtid_current_pos大于主數(shù)據(jù)庫last_pos的情況。

步驟s322,若所述主數(shù)據(jù)庫的最后位置為空,則對比所述主數(shù)據(jù)庫的當(dāng)前位置與所述備數(shù)據(jù)庫當(dāng)前位置,其中,若所述備數(shù)據(jù)庫當(dāng)前位置大于或等于所述主數(shù)據(jù)庫的當(dāng)前位置,則執(zhí)行所述自動切換操作,否則,則根據(jù)業(yè)務(wù)要求決策是否執(zhí)行所述自動切換操作。

具體地,如果主數(shù)據(jù)庫last_pos位置為空,則比較主數(shù)據(jù)庫當(dāng)前的gtid位置gtid_current_pos和備數(shù)據(jù)庫的當(dāng)前gtid_current_pos是否一致,如果備數(shù)據(jù)庫大于等于主數(shù)據(jù)庫gtid_current_pos位置,則進(jìn)行自動切換操作,否則,則說明主數(shù)據(jù)庫的數(shù)據(jù)尚未完全同步至備數(shù)據(jù)庫,主備數(shù)據(jù)庫數(shù)據(jù)不一致,此時(shí),可以根據(jù)業(yè)務(wù)要求決策是否需要自動切換并記錄相關(guān)的日志信息。

通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換方法,該方法通過根據(jù)不同情況執(zhí)行相應(yīng)的主備切換操作,更好地實(shí)現(xiàn)了實(shí)時(shí)監(jiān)控掌握主備數(shù)據(jù)庫同步差距情況,簡化操作,保證數(shù)據(jù)一致性,同時(shí)避免誤切換。

進(jìn)一步的,為了更好地保證貯備數(shù)據(jù)庫切換時(shí)數(shù)據(jù)的一致性,參照圖6,為本發(fā)明具體實(shí)施方式中,執(zhí)行自動切換操作的步驟的一種流程示意圖。

作為一種實(shí)施方式,上述步驟s32包括:

步驟s323,切換所述備數(shù)據(jù)庫為主數(shù)據(jù)庫,并在所述備數(shù)據(jù)庫服務(wù)恢復(fù)后,重新恢復(fù)主備復(fù)制關(guān)系。

具體地,dbagent切換備數(shù)據(jù)庫為主數(shù)據(jù)庫,將主原數(shù)據(jù)庫設(shè)置為備數(shù)據(jù)庫,待備數(shù)據(jù)庫服務(wù)恢復(fù)后,dbagent重新恢復(fù)主備數(shù)據(jù)庫復(fù)制關(guān)系;當(dāng)主備數(shù)據(jù)庫數(shù)據(jù)不一致時(shí),則需要解析原主數(shù)據(jù)庫的binlog日志文件,從備數(shù)據(jù)庫的gtid_current_pos位置處解析之后的所有g(shù)tid涉及的sql語句,生成正向sql語句后,在原備數(shù)據(jù)庫補(bǔ)充執(zhí)行完畢后使得原主備數(shù)據(jù)庫數(shù)據(jù)恢復(fù)一致。

通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換方法,該方法通過執(zhí)行自動切換操作,更好地實(shí)現(xiàn)了實(shí)時(shí)監(jiān)控掌握主備數(shù)據(jù)庫同步差距情況,簡化操作,保證數(shù)據(jù)一致性,同時(shí)避免誤切換。

進(jìn)一步的,為了更好地保證貯備數(shù)據(jù)庫切換時(shí)數(shù)據(jù)的一致性,參照圖7,為本發(fā)明具體實(shí)施方式中,獲取所述本機(jī)數(shù)據(jù)庫的最后位置的步驟的一種流程示意圖。

作為一種實(shí)施方式,上述步驟s32包括:

步驟s324,獲取所述本機(jī)數(shù)據(jù)庫的當(dāng)前日志文件列表。

具體地,當(dāng)主機(jī)數(shù)據(jù)庫服務(wù)異常時(shí),dbagent通過調(diào)用mysqlbinlog工具獲取數(shù)據(jù)庫最后的gtid位置last_pos。

其中,通過數(shù)據(jù)庫binlog二進(jìn)制日志文件夾下的index文件獲取當(dāng)前binlog文件列表。

步驟s325,從所述當(dāng)前日志文件列表中的最后一個日志文件開始掃描,并從所述最后一個日志文件的最后一個事件中獲取所述本機(jī)數(shù)據(jù)庫的最后位置。

具體地,從最后一個binlog日志文件開始掃描,掃描找到這個binlog文件的最后一個gtid事件(gtid_log_event),獲取最后一個gtid即為last_pos。

步驟s326,若無法從所述最后一個日志文件找到所述最后一個事件,則掃描所述最后一個日志文件的上一個日志文件,直到找到所述最后一個事件。

具體地,如果當(dāng)前binlog沒有找到gtid事件,即沒有事務(wù)提交記錄在這個binlog文件中,那么就掃描上一個binlog文件,循環(huán)往復(fù),直到找到最后一個gtid。

進(jìn)一步,通過binlog日志文件查找指定gtid_current_pos位置的方法同上述查找last_pos方法。

另外,如圖8所示,為mariadb主備切換操作前后,主備數(shù)據(jù)庫相應(yīng)的binlog日志位置變換情況。

其中,posa是原主數(shù)據(jù)庫最后一次上報(bào)的正常心跳消息中的gtid_current_pos位置;last_pos是原主數(shù)據(jù)庫最后一個寫事務(wù)實(shí)際寫入binlog二進(jìn)制日志中的最大gtid位置;posb為原備機(jī)數(shù)據(jù)庫從主數(shù)據(jù)庫復(fù)制binlog日志的最后一個事務(wù)對應(yīng)的gtid位置;當(dāng)last_pos、posb兩者重合相等時(shí),主備數(shù)據(jù)完全一致,可自動進(jìn)行主備切換;當(dāng)last_pos未知(掉電斷網(wǎng)等物理機(jī)異常情況),posb大于等于posa時(shí)主備數(shù)據(jù)是否一致未知;此時(shí)進(jìn)行主備切換后,待原主機(jī)恢復(fù)異常后需要重新確認(rèn)last_pos位置與posb的關(guān)系,如果last_pos大于posb,則主備機(jī)之間有差異化binlog,否則主備機(jī)數(shù)據(jù)一致;當(dāng)last_pos未知(掉電斷網(wǎng)等物理機(jī)異常情況),posb小于posa時(shí),原備機(jī)數(shù)據(jù)明顯落后原主機(jī),主備機(jī)數(shù)據(jù) 不一致。

通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換方法,更好地實(shí)現(xiàn)了實(shí)時(shí)監(jiān)控掌握主備數(shù)據(jù)庫同步差距情況,簡化操作,保證數(shù)據(jù)一致性,同時(shí)避免誤切換。

基于上述方法實(shí)施例的實(shí)現(xiàn),本發(fā)明還提供相應(yīng)的裝置實(shí)施例。

如圖9所示,本發(fā)明第一實(shí)施例提出一種主備數(shù)據(jù)庫切換裝置,包括:

連接模塊100,用于執(zhí)行連接本機(jī)數(shù)據(jù)庫服務(wù)操作。

其中,本發(fā)明主要通過利用mariadb和binlog日志保障數(shù)據(jù)庫主備數(shù)據(jù)同步過程可監(jiān)控,保證數(shù)據(jù)庫異常時(shí)快速自動切換。

其中,在具體實(shí)現(xiàn)時(shí),可以在主備數(shù)據(jù)庫所在設(shè)備上部署數(shù)據(jù)庫代理軟件dbagent(或其他能夠?qū)崿F(xiàn)相同功能的軟件),dbagent是一種數(shù)據(jù)庫代理軟件,可以用于監(jiān)控?cái)?shù)據(jù)庫服務(wù)運(yùn)行情況,解析binlog日志文件,在出現(xiàn)故障時(shí)可以用于切換控制進(jìn)程;其中,在mariadb數(shù)據(jù)庫運(yùn)行過程中,會將執(zhí)行過的相關(guān)動作記錄到binlog日志文件中,以備從數(shù)據(jù)庫讀取同步數(shù)據(jù),mariadb數(shù)據(jù)庫執(zhí)行過程中,產(chǎn)生binlog日志文件時(shí),會相應(yīng)給出binlog位置,即當(dāng)前日志位置(長整形值)。

具體地,主備數(shù)據(jù)庫的dbagent定時(shí)監(jiān)控本機(jī)數(shù)據(jù)庫運(yùn)行情況及當(dāng)前binlog日志中的最新gtid,同時(shí),主備數(shù)據(jù)庫之間互相共享主備機(jī)數(shù)據(jù)庫運(yùn)行情況。

當(dāng)本機(jī)數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時(shí):

主數(shù)據(jù)庫的dbagent定時(shí)通過mysql協(xié)議,用特定的用戶連接主數(shù)據(jù)庫服務(wù)端口,查詢并獲取本機(jī)數(shù)據(jù)庫當(dāng)前位置(當(dāng)前gtid_current_pos),并進(jìn)行記錄更新,通過心跳消息接口發(fā)送給備數(shù)據(jù)庫的dbagent進(jìn)行記錄。

當(dāng)本機(jī)數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時(shí):

備數(shù)據(jù)庫的dbagent定時(shí)通過mysql協(xié)議,用特定的用戶連接備數(shù)據(jù)庫服務(wù)端口,查詢并獲取本機(jī)數(shù)據(jù)庫當(dāng)前位置(當(dāng)前gtid_current_pos),并進(jìn)行記錄更新,通過心跳消息接口發(fā)送給主數(shù)據(jù)庫的dbagent進(jìn)行記錄。

位置模塊200,用于接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置。

具體地,當(dāng)本機(jī)數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時(shí):

主數(shù)據(jù)庫的dbagent接收備數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,記錄備數(shù) 據(jù)庫當(dāng)前gtid_current_pos位置。

當(dāng)本機(jī)數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時(shí):

備數(shù)據(jù)庫的dbagent接收主數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,記錄主數(shù)據(jù)庫當(dāng)前gtid_current_pos位置。

執(zhí)行模塊300,用于若所述連接本機(jī)數(shù)據(jù)庫服務(wù)操作的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則判定所述本機(jī)數(shù)據(jù)庫異常,并執(zhí)行告警操作或在所述本機(jī)數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進(jìn)行主備切換操作,或者,若所述接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則執(zhí)行告警操作或在所述本機(jī)數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進(jìn)行主備切換操作。

具體地,當(dāng)本機(jī)數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時(shí):

若備數(shù)據(jù)庫的dbagent連接數(shù)據(jù)庫服務(wù)失敗超出規(guī)定次數(shù)(比如10次,該次數(shù)可以是系統(tǒng)預(yù)先設(shè)置的,也可以由用戶根據(jù)實(shí)際使用情況進(jìn)行修改),判定當(dāng)前主數(shù)據(jù)庫異常,繼續(xù)執(zhí)行連接檢測操作。

當(dāng)本機(jī)數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時(shí):

若備數(shù)據(jù)庫的dbagent連接數(shù)據(jù)庫服務(wù)失敗超出規(guī)定次數(shù)(比如10次,該次數(shù)可以是系統(tǒng)預(yù)先設(shè)置的,也可以由用戶根據(jù)實(shí)際使用情況進(jìn)行修改),判定當(dāng)前主數(shù)據(jù)庫異常,解析主數(shù)據(jù)庫的日志文件,獲取主數(shù)據(jù)庫的最后位置,并根據(jù)最后位置執(zhí)行主備切換操作,在具體實(shí)現(xiàn)時(shí),可以采取如下方式:

1、通過解析數(shù)據(jù)庫binlog日志文件的方式,獲取主數(shù)據(jù)庫最后的gtid_current_pos位置,記錄為last_pos位置;

2、主數(shù)據(jù)庫的dbagent發(fā)送切換請求消息至備數(shù)據(jù)庫的dbagent,該消息中包括主數(shù)據(jù)庫的last_pos位置;

3、主數(shù)據(jù)庫的dbagent繼續(xù)定時(shí)檢測數(shù)據(jù)庫服務(wù)是否正常,直至數(shù)據(jù)庫服務(wù)恢復(fù);

4、主數(shù)據(jù)庫的dbagent根據(jù)切換請求中的主數(shù)據(jù)庫的last_pos位置,發(fā)起主備切換流程,其中:

若主數(shù)據(jù)庫的最后位置不為空,則對比主數(shù)據(jù)庫的最后位置與備數(shù)據(jù)庫當(dāng)前位置,其中,若備數(shù)據(jù)庫當(dāng)前位置等于主數(shù)據(jù)庫的最后位置,則執(zhí)行自動切換操作,若備數(shù)據(jù)庫當(dāng)前位置小于主數(shù)據(jù)庫的最后位置,則根據(jù)業(yè)務(wù)要求決策是否執(zhí)行自動切換操作;

若主數(shù)據(jù)庫的最后位置為空,則對比主數(shù)據(jù)庫的當(dāng)前位置與備數(shù)據(jù)庫當(dāng)前位置,其中,若備數(shù)據(jù)庫當(dāng)前位置大于或等于主數(shù)據(jù)庫的當(dāng)前位置,則執(zhí)行自動切換操作,否則,則根據(jù)業(yè)務(wù)要求決策是否執(zhí)行自動切換操作。

上述自動切換操作具體為:切換備數(shù)據(jù)庫為主數(shù)據(jù)庫,并在備數(shù)據(jù)庫服務(wù)恢復(fù)后,重新恢復(fù)主備復(fù)制關(guān)系。

或者,當(dāng)主機(jī)數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時(shí):

如果主數(shù)據(jù)庫的dbagent超出規(guī)定次數(shù)未接收到主數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,則執(zhí)行告警告警操作。

當(dāng)主機(jī)數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時(shí):

如果備數(shù)據(jù)庫的dbagent超出規(guī)定次數(shù)未接收到主數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,則通過mysql協(xié)議連接主數(shù)據(jù)庫服務(wù)端口獲取主數(shù)據(jù)庫當(dāng)前位置gtid_current_pos,如果獲取成功說明主數(shù)據(jù)庫的dbagent進(jìn)程運(yùn)行異常,數(shù)據(jù)庫服務(wù)正常,無須發(fā)起主備切換,只需告警并記錄相關(guān)日志,如果獲取失敗,說明主數(shù)據(jù)庫dbagent進(jìn)程和數(shù)據(jù)庫服務(wù)均異常,此時(shí)可以發(fā)起主備切換請求。

另外,如圖2所示,為主從復(fù)制監(jiān)控管理平臺架構(gòu)圖,具體描述如下:

主數(shù)據(jù)庫執(zhí)行ddl語句或包含更新sql的事務(wù)時(shí),為該事務(wù)分配一個全局唯一的順序的gtid編號,事務(wù)提交前寫入二進(jìn)制binlog日志文件同時(shí)同步給從數(shù)據(jù)庫,從數(shù)據(jù)庫讀取主數(shù)據(jù)庫的binlog日志信息同步數(shù)據(jù),回復(fù)執(zhí)行對應(yīng)的sql語句,從而達(dá)到與主數(shù)據(jù)庫數(shù)據(jù)同步;

數(shù)據(jù)庫代理軟件dbagent定時(shí)監(jiān)測本機(jī)數(shù)據(jù)庫服務(wù)運(yùn)行情況,通過mysql協(xié)議連接訪問本機(jī)數(shù)據(jù)庫監(jiān)控?cái)?shù)據(jù)庫運(yùn)行是否正常,同時(shí)獲取本機(jī)數(shù)據(jù)庫當(dāng)前gtid_current_pos位置定時(shí)發(fā)送心跳消息給對端dbagent,dbagent接收到對端的心跳消息后解析記錄對端數(shù)據(jù)庫的gtid_current_pos位置,比對本機(jī)數(shù)據(jù)庫與對端數(shù)據(jù)庫的gtid_current_pos位置,根據(jù)差值判斷主從數(shù)據(jù)庫的數(shù)據(jù)同步情況,當(dāng)主從數(shù)據(jù)庫gtid_current_pos差距超過設(shè)定范圍進(jìn)行實(shí)時(shí)告警等相關(guān)措施。

進(jìn)一步,數(shù)據(jù)庫代理軟件dbagent一定時(shí)間內(nèi)接收不到對端dbagent發(fā)送的心跳消息后,主動通過mysql協(xié)議連接對端數(shù)據(jù)庫服務(wù),判斷對端數(shù)據(jù)庫服務(wù)是否正常,同時(shí)獲取對端數(shù)據(jù)庫的gtid_current_pos位置,如果連接失敗則判定對端數(shù)據(jù)庫異常,根據(jù)數(shù)據(jù)庫的主從角色決策是否發(fā)起主備切換。

通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換裝置,該方法能夠?qū)崟r(shí)監(jiān) 控掌握主從數(shù)據(jù)同步差距情況,間接了解系統(tǒng)的寫事務(wù)負(fù)載變化情況;去掉了第三方管理組件,直接規(guī)避了第三方管理組件故障引起的整個系統(tǒng)不可用問題;簡化處理邏輯的同時(shí)也簡化了安裝部署,dbagent可以與db進(jìn)行軟件捆綁,各數(shù)據(jù)庫節(jié)點(diǎn)部署統(tǒng)一簡便;快速識別主備機(jī)數(shù)據(jù)庫數(shù)據(jù)不一致,數(shù)據(jù)一致時(shí)能自動進(jìn)行主備切換,并構(gòu)建新主從復(fù)制關(guān)系。數(shù)據(jù)不一致時(shí)能自動化生成差異化sql腳本,為人工干預(yù)節(jié)約時(shí)間,并高度保證數(shù)據(jù)一致性;在dbagent本身進(jìn)程異常數(shù)據(jù)庫服務(wù)正常情況下,避免不必要的誤切換。

如圖10所示,本發(fā)明第二實(shí)施例提出一種主備數(shù)據(jù)庫切換裝置,其中:

上述連接模塊100,還用于執(zhí)行連接本機(jī)數(shù)據(jù)庫服務(wù)操作,定時(shí)獲取本機(jī)數(shù)據(jù)庫當(dāng)前位置。

具體地,主備數(shù)據(jù)庫的dbagent定時(shí)監(jiān)控本機(jī)數(shù)據(jù)庫運(yùn)行情況及當(dāng)前binlog日志中的最新gtid,同時(shí),主備數(shù)據(jù)庫之間互相共享主備機(jī)數(shù)據(jù)庫運(yùn)行情況。

當(dāng)本機(jī)數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時(shí):

主數(shù)據(jù)庫的dbagent定時(shí)通過mysql協(xié)議,用特定的用戶連接主數(shù)據(jù)庫服務(wù)端口,查詢并獲取本機(jī)數(shù)據(jù)庫當(dāng)前位置(當(dāng)前gtid_current_pos),并進(jìn)行記錄更新,通過心跳消息接口發(fā)送給備數(shù)據(jù)庫的dbagent進(jìn)行記錄。

當(dāng)本機(jī)數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時(shí):

備數(shù)據(jù)庫的dbagent定時(shí)通過mysql協(xié)議,用特定的用戶連接備數(shù)據(jù)庫服務(wù)端口,查詢并獲取本機(jī)數(shù)據(jù)庫當(dāng)前位置(當(dāng)前gtid_current_pos),并進(jìn)行記錄更新,通過心跳消息接口發(fā)送給主數(shù)據(jù)庫的dbagent進(jìn)行記錄。

上述位置模塊200,還用于接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置,將所述本機(jī)數(shù)據(jù)庫當(dāng)前位置與所述對端數(shù)據(jù)庫當(dāng)前位置進(jìn)行比對。

具體地,當(dāng)本機(jī)數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時(shí):

主數(shù)據(jù)庫的dbagent接收備數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,記錄備數(shù)據(jù)庫當(dāng)前gtid_current_pos位置,比對主數(shù)據(jù)庫的當(dāng)前gtid_current_pos位置和備數(shù)據(jù)庫的當(dāng)前gtid_current_pos位置。

當(dāng)本機(jī)數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時(shí):

備數(shù)據(jù)庫的dbagent接收主數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,記錄主數(shù)據(jù)庫當(dāng)前gtid_current_pos位置,比對主數(shù)據(jù)庫的當(dāng)前gtid_current_pos位置和備 數(shù)據(jù)庫的當(dāng)前gtid_current_pos位置。

該裝置還包括:

告警模塊400,用于當(dāng)所述本機(jī)數(shù)據(jù)庫當(dāng)前位置與所述對端數(shù)據(jù)庫當(dāng)前位置的差值大于預(yù)設(shè)的閾值時(shí),執(zhí)行告警操作。

具體地,當(dāng)主數(shù)據(jù)庫的當(dāng)前gtid_current_pos位置和備數(shù)據(jù)庫的當(dāng)前gtid_current_pos位置差值大于配置的閾值時(shí)(該閾值可以是系統(tǒng)預(yù)先設(shè)置的,也可以由用戶根據(jù)實(shí)際使用情況進(jìn)行修改),采取相應(yīng)措施,如告警等。

通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換裝置,該方法能夠?qū)崟r(shí)監(jiān)控掌握主從數(shù)據(jù)同步差距情況,間接了解系統(tǒng)的寫事務(wù)負(fù)載變化情況;去掉了第三方管理組件,直接規(guī)避了第三方管理組件故障引起的整個系統(tǒng)不可用問題;簡化處理邏輯的同時(shí)也簡化了安裝部署,dbagent可以與db進(jìn)行軟件捆綁,各數(shù)據(jù)庫節(jié)點(diǎn)部署統(tǒng)一簡便;快速識別主備機(jī)數(shù)據(jù)庫數(shù)據(jù)不一致,數(shù)據(jù)一致時(shí)能自動進(jìn)行主備切換,并構(gòu)建新主從復(fù)制關(guān)系。數(shù)據(jù)不一致時(shí)能自動化生成差異化sql腳本,為人工干預(yù)節(jié)約時(shí)間,并高度保證數(shù)據(jù)一致性;在dbagent本身進(jìn)程異常數(shù)據(jù)庫服務(wù)正常情況下,避免不必要的誤切換。

進(jìn)一步的,為了更好地保證貯備數(shù)據(jù)庫切換時(shí)數(shù)據(jù)的一致性,上述執(zhí)行模塊300,還用于若所述本機(jī)數(shù)據(jù)庫為備數(shù)據(jù)庫,所述對端數(shù)據(jù)庫為主數(shù)據(jù)庫,則執(zhí)行告警操作,并繼續(xù)執(zhí)行連接檢測操作;若所述本機(jī)數(shù)據(jù)庫為主數(shù)據(jù)庫,所述對端數(shù)據(jù)庫為備數(shù)據(jù)庫,則解析所述本機(jī)數(shù)據(jù)庫的日志文件,獲取所述本機(jī)數(shù)據(jù)庫的最后位置,并根據(jù)所述最后位置執(zhí)行主備切換操作。

具體地,當(dāng)本機(jī)數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時(shí):

若備數(shù)據(jù)庫的dbagent連接數(shù)據(jù)庫服務(wù)失敗超出規(guī)定次數(shù)(比如10次,該次數(shù)可以是系統(tǒng)預(yù)先設(shè)置的,也可以由用戶根據(jù)實(shí)際使用情況進(jìn)行修改),判定當(dāng)前主數(shù)據(jù)庫異常,繼續(xù)執(zhí)行連接檢測操作。

然后,當(dāng)本機(jī)數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時(shí):

若備數(shù)據(jù)庫的dbagent連接數(shù)據(jù)庫服務(wù)失敗超出規(guī)定次數(shù)(比如10次,該次數(shù)可以是系統(tǒng)預(yù)先設(shè)置的,也可以由用戶根據(jù)實(shí)際使用情況進(jìn)行修改),判定當(dāng)前主數(shù)據(jù)庫異常,解析主數(shù)據(jù)庫的日志文件,獲取主數(shù)據(jù)庫的最后位置,并根據(jù)最后位置執(zhí)行主備切換操作,在具體實(shí)現(xiàn)時(shí),可以采取如下方式:

1、通過解析數(shù)據(jù)庫binlog日志文件的方式,獲取主數(shù)據(jù)庫最后的gtid_current_pos位置,記錄為last_pos位置;

2、主數(shù)據(jù)庫的dbagent發(fā)送切換請求消息至備數(shù)據(jù)庫的dbagent,該消息中包括主數(shù)據(jù)庫的last_pos位置;

3、主數(shù)據(jù)庫的dbagent繼續(xù)定時(shí)檢測數(shù)據(jù)庫服務(wù)是否正常,直至數(shù)據(jù)庫服務(wù)恢復(fù);

4、主數(shù)據(jù)庫的dbagent根據(jù)切換請求中的主數(shù)據(jù)庫的last_pos位置,發(fā)起主備切換流程,其中:

若主數(shù)據(jù)庫的最后位置不為空,則對比主數(shù)據(jù)庫的最后位置與備數(shù)據(jù)庫當(dāng)前位置,其中,若備數(shù)據(jù)庫當(dāng)前位置等于主數(shù)據(jù)庫的最后位置,則執(zhí)行自動切換操作,若備數(shù)據(jù)庫當(dāng)前位置小于主數(shù)據(jù)庫的最后位置,則根據(jù)業(yè)務(wù)要求決策是否執(zhí)行自動切換操作;

若主數(shù)據(jù)庫的最后位置為空,則對比主數(shù)據(jù)庫的當(dāng)前位置與備數(shù)據(jù)庫當(dāng)前位置,其中,若備數(shù)據(jù)庫當(dāng)前位置大于或等于主數(shù)據(jù)庫的當(dāng)前位置,則執(zhí)行自動切換操作,否則,則根據(jù)業(yè)務(wù)要求決策是否執(zhí)行自動切換操作。

通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換裝置,該方法通過在本機(jī)數(shù)據(jù)庫異常時(shí),主備數(shù)據(jù)庫執(zhí)行的不同處理方式,更好地實(shí)現(xiàn)了實(shí)時(shí)監(jiān)控掌握主備數(shù)據(jù)庫同步差距情況,簡化操作,保證數(shù)據(jù)一致性,同時(shí)避免誤切換。

進(jìn)一步的,為了更好地保證貯備數(shù)據(jù)庫切換時(shí)數(shù)據(jù)的一致性,上述執(zhí)行模塊300,還用于若所述主數(shù)據(jù)庫的最后位置不為空,則對比所述主數(shù)據(jù)庫的最后位置與所述備數(shù)據(jù)庫當(dāng)前位置,其中,若所述備數(shù)據(jù)庫當(dāng)前位置等于所述主數(shù)據(jù)庫的最后位置,則執(zhí)行自動切換操作,若所述備數(shù)據(jù)庫當(dāng)前位置小于所述主數(shù)據(jù)庫的最后位置,則根據(jù)業(yè)務(wù)要求決策是否執(zhí)行所述自動切換操作;若所述主數(shù)據(jù)庫的最后位置為空,則對比所述主數(shù)據(jù)庫的當(dāng)前位置與所述備數(shù)據(jù)庫當(dāng)前位置,其中,若所述備數(shù)據(jù)庫當(dāng)前位置大于或等于所述主數(shù)據(jù)庫的當(dāng)前位置,則執(zhí)行所述自動切換操作,否則,則根據(jù)業(yè)務(wù)要求決策是否執(zhí)行所述自動切換操作。

具體地,如果主數(shù)據(jù)庫的last_pos位置不為空,則比較主數(shù)據(jù)庫最后的gtid位置last_pos和備數(shù)據(jù)庫的當(dāng)前gtid_current_pos是否一致,如果備數(shù)據(jù)庫gtid_current_pos等于主數(shù)據(jù)庫last_pos則進(jìn)行自動切換操作,如果備數(shù)據(jù)庫 gtid_current_pos小于主數(shù)據(jù)庫last_pos說明主數(shù)據(jù)庫的數(shù)據(jù)尚未完全同步至主數(shù)據(jù)庫,主備數(shù)據(jù)庫數(shù)據(jù)不一致,此時(shí),可以根據(jù)業(yè)務(wù)要求決策是否需要自動切換并記錄相關(guān)的日志信息。

其中,根據(jù)mariadb的復(fù)制原理,不可能出現(xiàn)備數(shù)據(jù)庫gtid_current_pos大于主數(shù)據(jù)庫last_pos的情況。

然后,如果主數(shù)據(jù)庫last_pos位置為空,則比較主數(shù)據(jù)庫當(dāng)前的gtid位置gtid_current_pos和備數(shù)據(jù)庫的當(dāng)前gtid_current_pos是否一致,如果備數(shù)據(jù)庫大于等于主數(shù)據(jù)庫gtid_current_pos位置,則進(jìn)行自動切換操作,否則,則說明主數(shù)據(jù)庫的數(shù)據(jù)尚未完全同步至備數(shù)據(jù)庫,主備數(shù)據(jù)庫數(shù)據(jù)不一致,此時(shí),可以根據(jù)業(yè)務(wù)要求決策是否需要自動切換并記錄相關(guān)的日志信息。

通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換裝置,該方法通過根據(jù)不同情況執(zhí)行相應(yīng)的主備切換操作,更好地實(shí)現(xiàn)了實(shí)時(shí)監(jiān)控掌握主備數(shù)據(jù)庫同步差距情況,簡化操作,保證數(shù)據(jù)一致性,同時(shí)避免誤切換。

進(jìn)一步的,為了更好地保證貯備數(shù)據(jù)庫切換時(shí)數(shù)據(jù)的一致性,上述執(zhí)行模塊300,還用于切換所述備數(shù)據(jù)庫為主數(shù)據(jù)庫,并在所述備數(shù)據(jù)庫服務(wù)恢復(fù)后,重新恢復(fù)主備復(fù)制關(guān)系。

具體地,dbagent切換備數(shù)據(jù)庫為主數(shù)據(jù)庫,將主原數(shù)據(jù)庫設(shè)置為備數(shù)據(jù)庫,待備數(shù)據(jù)庫服務(wù)恢復(fù)后,dbagent重新恢復(fù)主備數(shù)據(jù)庫復(fù)制關(guān)系;當(dāng)主備數(shù)據(jù)庫數(shù)據(jù)不一致時(shí),則需要解析原主數(shù)據(jù)庫的binlog日志文件,從備數(shù)據(jù)庫的gtid_current_pos位置處解析之后的所有g(shù)tid涉及的sql語句,生成正向sql語句后,在原備數(shù)據(jù)庫補(bǔ)充執(zhí)行完畢后使得原主備數(shù)據(jù)庫數(shù)據(jù)恢復(fù)一致。

通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換裝置,該方法通過執(zhí)行自動切換操作,更好地實(shí)現(xiàn)了實(shí)時(shí)監(jiān)控掌握主備數(shù)據(jù)庫同步差距情況,簡化操作,保證數(shù)據(jù)一致性,同時(shí)避免誤切換。

進(jìn)一步的,為了更好地保證貯備數(shù)據(jù)庫切換時(shí)數(shù)據(jù)的一致性,上述執(zhí)行模塊300,還用于獲取所述本機(jī)數(shù)據(jù)庫的當(dāng)前日志文件列表;從所述當(dāng)前日志文件列表中的最后一個日志文件開始掃描,并從所述最后一個日志文件的最后一個事件中獲取所述本機(jī)數(shù)據(jù)庫的最后位置;若無法從所述最后一個日志文件找到所述最 后一個事件,則掃描所述最后一個日志文件的上一個日志文件,直到找到所述最后一個事件。

具體地,當(dāng)主機(jī)數(shù)據(jù)庫服務(wù)異常時(shí),dbagent通過調(diào)用mysqlbinlog工具獲取數(shù)據(jù)庫最后的gtid位置last_pos。

其中,通過數(shù)據(jù)庫binlog二進(jìn)制日志文件夾下的index文件獲取當(dāng)前binlog文件列表。

然后,從最后一個binlog日志文件開始掃描,掃描找到這個binlog文件的最后一個gtid事件(gtid_log_event),獲取最后一個gtid即為last_pos。

然后,如果當(dāng)前binlog沒有找到gtid事件,即沒有事務(wù)提交記錄在這個binlog文件中,那么就掃描上一個binlog文件,循環(huán)往復(fù),直到找到最后一個gtid。

進(jìn)一步,通過binlog日志文件查找指定gtid_current_pos位置的方法同上述查找last_pos方法。

另外,如圖8所示,為mariadb主備切換操作前后,主備數(shù)據(jù)庫相應(yīng)的binlog日志位置變換情況。

其中,posa是原主數(shù)據(jù)庫最后一次上報(bào)的正常心跳消息中的gtid_current_pos位置;last_pos是原主數(shù)據(jù)庫最后一個寫事務(wù)實(shí)際寫入binlog二進(jìn)制日志中的最大gtid位置;posb為原備機(jī)數(shù)據(jù)庫從主數(shù)據(jù)庫復(fù)制binlog日志的最后一個事務(wù)對應(yīng)的gtid位置;當(dāng)last_pos、posb兩者重合相等時(shí),主備數(shù)據(jù)完全一致,可自動進(jìn)行主備切換;當(dāng)last_pos未知(掉電斷網(wǎng)等物理機(jī)異常情況),posb大于等于posa時(shí)主備數(shù)據(jù)是否一致未知;此時(shí)進(jìn)行主備切換后,待原主機(jī)恢復(fù)異常后需要重新確認(rèn)last_pos位置與posb的關(guān)系,如果last_pos大于posb,則主備機(jī)之間有差異化binlog,否則主備機(jī)數(shù)據(jù)一致;當(dāng)last_pos未知(掉電斷網(wǎng)等物理機(jī)異常情況),posb小于posa時(shí),原備機(jī)數(shù)據(jù)明顯落后原主機(jī),主備機(jī)數(shù)據(jù)不一致。

通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換裝置,更好地實(shí)現(xiàn)了實(shí)時(shí)監(jiān)控掌握主備數(shù)據(jù)庫同步差距情況,簡化操作,保證數(shù)據(jù)一致性,同時(shí)避免誤切換。

以上僅為本發(fā)明的優(yōu)選實(shí)施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等效結(jié)構(gòu)或等效流程變換,或直接或間接運(yùn)用在 其他相關(guān)的技術(shù)領(lǐng)域,均同理包括在本發(fā)明的專利保護(hù)范圍內(nèi)。

當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
张家口市| 临武县| 南宁市| 同心县| 当涂县| 宁国市| 乌兰浩特市| 上饶市| 晴隆县| 循化| 安龙县| 凤翔县| 云龙县| 扎囊县| 揭西县| 洛浦县| 化州市| 宁城县| 南丰县| 苏州市| 文水县| 洱源县| 蓬莱市| 彭泽县| 临夏县| 吉水县| 武功县| 滁州市| 河北区| 陆河县| 绍兴县| 赤峰市| 甘肃省| 三门县| 新平| 马关县| 望谟县| 定州市| 武邑县| 石嘴山市| 潼关县|