本發(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ù)兩大特點。在短時間內(nèi),可能存在大量數(shù)據(jù)新增或修改。隨著數(shù)據(jù)數(shù)量級遞增,從字節(jié)、千字節(jié)、兆字節(jié)到現(xiàn)在的萬兆字節(jié),結(jié)合mariadb/mysql數(shù)據(jù)庫良好橫向擴展特性,基于mariadb/mysql數(shù)據(jù)庫的分布式數(shù)據(jù)庫得到廣泛的應(yīng)用。
同時為了提高數(shù)據(jù)庫容災(zāi)性,各數(shù)據(jù)庫提供商均提出了相應(yīng)策略,其中mariadb/mysql數(shù)據(jù)庫使用的是主從復(fù)制策略,其核心理念是主數(shù)據(jù)庫對外提供服務(wù),當(dāng)主庫有更新的時候,主庫會把更新操作的sql寫入二進制日志(binlog),并維護一個二進制日志文件的索引,以便于日志文件輪回(rotate)。從數(shù)據(jù)庫讀取主數(shù)據(jù)庫運行所生成binlog日志,并執(zhí)行binlog日志中相關(guān)動作,從而保證主從數(shù)據(jù)庫數(shù)據(jù)一致。當(dāng)數(shù)據(jù)庫主機出現(xiàn)宕機,需要在較短時間內(nèi)恢復(fù)應(yīng)用,就需要使用從機來充當(dāng)主數(shù)據(jù)庫(即主備切換),如何判斷從機數(shù)據(jù)庫和主機數(shù)據(jù)庫數(shù)據(jù)是否一致,如何在較短時間內(nèi)將主從機數(shù)據(jù)庫數(shù)據(jù)恢復(fù)成一致,成為一個技術(shù)難題。
主從復(fù)制是備機復(fù)制主機binlog日志,由于存在主機寫日志時延和網(wǎng)絡(luò)通訊時延以及備機回放日志時延等因素,因此必然存在主備日志不同步現(xiàn)象。當(dāng)前業(yè)界識別主備數(shù)據(jù)是否一致的通常做法大致有兩種:一種業(yè)務(wù)應(yīng)用層用戶自行在主數(shù)據(jù)庫新增監(jiān)控表,定期更新該表中的時間戳,管理模塊監(jiān)控主備機監(jiān)控表中時間戳差值判斷主備數(shù)據(jù)同步差距情況。另外一種是在數(shù)據(jù)庫主備機分別增加dbagent代理模塊,定時查詢數(shù)據(jù)庫的當(dāng)前binlog位置,上報給管理模塊,由管理模塊判斷主備機數(shù)據(jù)同步差距情況。
以上兩種方式存在如下弊端:
1、均引入了第三方的管理模塊,增加了交互復(fù)雜度,同時當(dāng)?shù)谌焦芾砟K出現(xiàn)故障情況下,整個監(jiān)控系統(tǒng)癱瘓,發(fā)生故障時無法實現(xiàn)切換。
2、由于引入第三方管理模塊并且是定時上報,因此存在周期內(nèi)的時間差問題,眾所周知數(shù)據(jù)庫應(yīng)用每秒鐘的tps都是成千上萬的,而這種定時上報機制至少也是秒級,因此大大降低了判斷精度,無法保證在切換的時候主備機是強一致的,對數(shù)據(jù)安全要求極高的保險類、證券類、銀行類等行業(yè)是無法接受這種方案的。
3、上述方式二當(dāng)數(shù)據(jù)庫服務(wù)正常,而監(jiān)控數(shù)據(jù)庫運行情況的主dbagent代理模塊異常,也可能會引起異常的數(shù)據(jù)庫的主備切換。
技術(shù)實現(xiàn)要素:
本發(fā)明的主要目的在于提出一種主備數(shù)據(jù)庫切換方法和裝置,旨在解決現(xiàn)有技術(shù)中主備數(shù)據(jù)庫進行切換時,數(shù)據(jù)精度差,操作復(fù)雜,穩(wěn)定性低的問題。
為實現(xiàn)上述目的,本發(fā)明提出一種主備數(shù)據(jù)庫切換方法,包括:
執(zhí)行連接本機數(shù)據(jù)庫服務(wù)操作;
接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置;
若所述連接本機數(shù)據(jù)庫服務(wù)操作的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則判定所述本機數(shù)據(jù)庫異常,并執(zhí)行告警操作或在所述本機數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進行主備切換操作,或者,若所述接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則執(zhí)行告警操作或在所述本機數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進行主備切換操作。
優(yōu)選地,所述執(zhí)行連接本機數(shù)據(jù)庫服務(wù)操作的步驟包括:
執(zhí)行連接數(shù)據(jù)庫服務(wù)操作,定時獲取本機數(shù)據(jù)庫當(dāng)前位置;
所述接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置的步驟包括:
接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置,將所述本機數(shù)據(jù)庫當(dāng)前位置與所述對端數(shù)據(jù)庫當(dāng)前位置進行比對;
所述接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置,將所述本機數(shù)據(jù)庫當(dāng)前位置與所述對端數(shù)據(jù)庫當(dāng)前位置進行比對的步驟之后,還包括:
當(dāng)所述本機數(shù)據(jù)庫當(dāng)前位置與所述對端數(shù)據(jù)庫當(dāng)前位置的差值大于預(yù)設(shè)的閾值時,執(zhí)行告警操作。
優(yōu)選地,所述若所述連接本機數(shù)據(jù)庫服務(wù)操作的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則判定所述本機數(shù)據(jù)庫異常,并執(zhí)行告警操作或在所述本機數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進行主備切換操作的步驟包括:
若所述本機數(shù)據(jù)庫為備數(shù)據(jù)庫,所述對端數(shù)據(jù)庫為主數(shù)據(jù)庫,則執(zhí)行告警操作,并繼續(xù)執(zhí)行連接檢測操作;
若所述本機數(shù)據(jù)庫為主數(shù)據(jù)庫,所述對端數(shù)據(jù)庫為備數(shù)據(jù)庫,則解析所述本機數(shù)據(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)選地,所述獲取所述本機數(shù)據(jù)庫的最后位置的步驟包括:
獲取所述本機數(shù)據(jù)庫的當(dāng)前日志文件列表;
從所述當(dāng)前日志文件列表中的最后一個日志文件開始掃描,并從所述最后一個日志文件的最后一個事件中獲取所述本機數(shù)據(jù)庫的最后位置;
若無法從所述最后一個日志文件找到所述最后一個事件,則掃描所述最后一個日志文件的上一個日志文件,直到找到所述最后一個事件。
為實現(xiàn)上述目的,本發(fā)明還提出一種主備數(shù)據(jù)庫切換裝置,包括:
連接模塊,用于執(zhí)行連接本機數(shù)據(jù)庫服務(wù)操作;
位置模塊,用于接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置;
執(zhí)行模塊,用于若所述連接本機數(shù)據(jù)庫服務(wù)操作的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則判定所述本機數(shù)據(jù)庫異常,并執(zhí)行告警操作或在所述本機數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進行主備切換操作,或者,若所述接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng) 前位置的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則執(zhí)行告警操作或在所述本機數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進行主備切換操作。
優(yōu)選地,所述連接模塊,還用于執(zhí)行連接本機數(shù)據(jù)庫服務(wù)操作,定時獲取本機數(shù)據(jù)庫當(dāng)前位置;
所述位置模塊,還用于接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置,將所述本機數(shù)據(jù)庫當(dāng)前位置與所述對端數(shù)據(jù)庫當(dāng)前位置進行比對;
所述裝置還包括:
告警模塊,用于當(dāng)所述本機數(shù)據(jù)庫當(dāng)前位置與所述對端數(shù)據(jù)庫當(dāng)前位置的差值大于預(yù)設(shè)的閾值時,執(zhí)行告警操作。
優(yōu)選地,所述執(zhí)行模塊,還用于若所述本機數(shù)據(jù)庫為備數(shù)據(jù)庫,所述對端數(shù)據(jù)庫為主數(shù)據(jù)庫,則執(zhí)行告警操作,并繼續(xù)執(zhí)行連接檢測操作;若所述本機數(shù)據(jù)庫為主數(shù)據(jù)庫,所述對端數(shù)據(jù)庫為備數(shù)據(jù)庫,則解析所述本機數(shù)據(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í)行模塊,還用于獲取所述本機數(shù)據(jù)庫的當(dāng)前日志文件列表;從所述當(dāng)前日志文件列表中的最后一個日志文件開始掃描,并從所述最后一個日志文件的最后一個事件中獲取所述本機數(shù)據(jù)庫的最后位置;若無法從所述最后一個日志文件找到所述最后一個事件,則掃描所述最后一個日志文件的上一個日志文件,直到找到所述最后一個事件。
本發(fā)明公開了一種主備數(shù)據(jù)庫切換方法和裝置,通過執(zhí)行連接本機數(shù)據(jù)庫服 務(wù)操作;接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置;若連接數(shù)據(jù)庫服務(wù)操作的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則判定本機數(shù)據(jù)庫異常,并執(zhí)行告警操作或在本機數(shù)據(jù)庫和對端數(shù)據(jù)庫之間進行主備切換操作,或者,若接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則執(zhí)行告警操作或在本機數(shù)據(jù)庫和對端數(shù)據(jù)庫之間進行主備切換操作,解決了現(xiàn)有技術(shù)中主備數(shù)據(jù)庫進行切換時,數(shù)據(jù)精度差,操作復(fù)雜,穩(wěn)定性低的問題。實現(xiàn)了實時監(jiān)控掌握主備數(shù)據(jù)庫同步差距情況,簡化操作,保證數(shù)據(jù)一致性,同時避免誤切換。
附圖說明
圖1是本發(fā)明主備數(shù)據(jù)庫切換方法第一實施例的流程示意圖;
圖2是本發(fā)明實施例中主備數(shù)據(jù)庫復(fù)制監(jiān)控管理架構(gòu)圖;
圖3是本發(fā)明主備數(shù)據(jù)庫切換方法第二實施例的流程示意圖;
圖4是本發(fā)明實施例中若所述連接本機數(shù)據(jù)庫服務(wù)操作的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則判定所述本機數(shù)據(jù)庫異常,并執(zhí)行告警操作或在所述本機數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進行主備切換操作的步驟的一種流程示意圖;
圖5是本發(fā)明實施例中執(zhí)行主備切換操作的步驟的一種流程示意圖;
圖6是本發(fā)明實施例中自動切換操作的步驟的一種流程示意圖;
圖7是本發(fā)明實施例中獲取所述本機數(shù)據(jù)庫的最后位置的步驟的一種流程示意圖;
圖8是本發(fā)明實施例中主備切換前后binlog日志位置變化關(guān)系圖;
圖9是本發(fā)明主備數(shù)據(jù)庫切換裝置第一實施例的功能模塊示意圖;
圖10是本發(fā)明主備數(shù)據(jù)庫切換裝置第二實施例的功能模塊示意圖。
本發(fā)明目的的實現(xiàn)、功能特點及優(yōu)點將結(jié)合實施例,參照附圖做進一步說明。
具體實施方式
應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
如圖1所示,本發(fā)明第一實施例提出一種主備數(shù)據(jù)庫切換方法,包括:
步驟s10,執(zhí)行連接本機數(shù)據(jù)庫服務(wù)操作。
本發(fā)明方法的執(zhí)行主體可以為一種數(shù)據(jù)庫管理平臺或數(shù)據(jù)庫服務(wù)器,具體應(yīng)用于主數(shù)據(jù)庫或備數(shù)據(jù)庫將在下述說明書進行具體說明,當(dāng)然也不限定于其他能夠?qū)崿F(xiàn)主備數(shù)據(jù)庫切換的設(shè)備或服務(wù)器。
其中,本發(fā)明主要通過利用mariadb和binlog日志保障數(shù)據(jù)庫主備數(shù)據(jù)同步過程可監(jiān)控,保證數(shù)據(jù)庫異常時快速自動切換。
其中,在具體實現(xiàn)時,可以在主備數(shù)據(jù)庫所在設(shè)備上部署數(shù)據(jù)庫代理軟件dbagent(或其他能夠?qū)崿F(xiàn)相同功能的軟件),dbagent是一種數(shù)據(jù)庫代理軟件,可以用于監(jiān)控數(shù)據(jù)庫服務(wù)運行情況,解析binlog日志文件,在出現(xiàn)故障時可以用于切換控制進程;其中,在mariadb數(shù)據(jù)庫運行過程中,會將執(zhí)行過的相關(guān)動作記錄到binlog日志文件中,以備從數(shù)據(jù)庫讀取同步數(shù)據(jù),mariadb數(shù)據(jù)庫執(zhí)行過程中,產(chǎn)生binlog日志文件時,會相應(yīng)給出binlog位置,即當(dāng)前日志位置(長整形值)。
具體地,主備數(shù)據(jù)庫的dbagent定時監(jiān)控本機數(shù)據(jù)庫運行情況及當(dāng)前binlog日志中的最新gtid,同時,主備數(shù)據(jù)庫之間互相共享主備機數(shù)據(jù)庫運行情況。
當(dāng)本機數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時:
主數(shù)據(jù)庫的dbagent定時通過mysql協(xié)議,用特定的用戶連接主數(shù)據(jù)庫服務(wù)端口,查詢并獲取本機數(shù)據(jù)庫當(dāng)前位置(當(dāng)前gtid_current_pos),并進行記錄更新,通過心跳消息接口發(fā)送給備數(shù)據(jù)庫的dbagent進行記錄。
當(dāng)本機數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時:
備數(shù)據(jù)庫的dbagent定時通過mysql協(xié)議,用特定的用戶連接備數(shù)據(jù)庫服務(wù)端口,查詢并獲取本機數(shù)據(jù)庫當(dāng)前位置(當(dāng)前gtid_current_pos),并進行記錄更新,通過心跳消息接口發(fā)送給主數(shù)據(jù)庫的dbagent進行記錄。
步驟s20,接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置。
具體地,當(dāng)本機數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時:
主數(shù)據(jù)庫的dbagent接收備數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,記錄備數(shù)據(jù)庫當(dāng)前gtid_current_pos位置。
當(dāng)本機數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時:
備數(shù)據(jù)庫的dbagent接收主數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,記錄主數(shù)據(jù)庫當(dāng)前gtid_current_pos位置。
步驟s30,若所述連接本機數(shù)據(jù)庫服務(wù)操作的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則判定所述本機數(shù)據(jù)庫異常,并執(zhí)行告警操作或在所述本機數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進行主備切換操作,或者,若所述接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則執(zhí)行告警操作或在所述本機數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進行主備切換操作。
具體地,當(dāng)本機數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時:
若備數(shù)據(jù)庫的dbagent連接數(shù)據(jù)庫服務(wù)失敗超出規(guī)定次數(shù)(比如10次,該次數(shù)可以是系統(tǒng)預(yù)先設(shè)置的,也可以由用戶根據(jù)實際使用情況進行修改),判定當(dāng)前主數(shù)據(jù)庫異常,繼續(xù)執(zhí)行連接檢測操作。
當(dāng)本機數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時:
若備數(shù)據(jù)庫的dbagent連接數(shù)據(jù)庫服務(wù)失敗超出規(guī)定次數(shù)(比如10次,該次數(shù)可以是系統(tǒng)預(yù)先設(shè)置的,也可以由用戶根據(jù)實際使用情況進行修改),判定當(dāng)前主數(shù)據(jù)庫異常,解析主數(shù)據(jù)庫的日志文件,獲取主數(shù)據(jù)庫的最后位置,并根據(jù)最后位置執(zhí)行主備切換操作,在具體實現(xiàn)時,可以采取如下方式:
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ù)據(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)主機數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時:
如果主數(shù)據(jù)庫的dbagent超出規(guī)定次數(shù)未接收到主數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,則執(zhí)行告警告警操作。
當(dāng)主機數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時:
如果備數(shù)據(jù)庫的dbagent超出規(guī)定次數(shù)未接收到主數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,則通過mysql協(xié)議連接主數(shù)據(jù)庫服務(wù)端口獲取主數(shù)據(jù)庫當(dāng)前位置gtid_current_pos,如果獲取成功說明主數(shù)據(jù)庫的dbagent進程運行異常,數(shù)據(jù)庫服務(wù)正常,無須發(fā)起主備切換,只需告警并記錄相關(guān)日志,如果獲取失敗,說明主數(shù)據(jù)庫dbagent進程和數(shù)據(jù)庫服務(wù)均異常,此時可以發(fā)起主備切換請求。
另外,如圖2所示,為主從復(fù)制監(jiān)控管理平臺架構(gòu)圖,具體描述如下:
主數(shù)據(jù)庫執(zhí)行ddl語句或包含更新sql的事務(wù)時,為該事務(wù)分配一個全局唯一的順序的gtid編號,事務(wù)提交前寫入二進制binlog日志文件同時同步給從數(shù)據(jù)庫,從數(shù)據(jù)庫讀取主數(shù)據(jù)庫的binlog日志信息同步數(shù)據(jù),回復(fù)執(zhí)行對應(yīng)的sql語句,從而達到與主數(shù)據(jù)庫數(shù)據(jù)同步;
數(shù)據(jù)庫代理軟件dbagent定時監(jiān)測本機數(shù)據(jù)庫服務(wù)運行情況,通過mysql協(xié)議連接訪問本機數(shù)據(jù)庫監(jiān)控數(shù)據(jù)庫運行是否正常,同時獲取本機數(shù)據(jù)庫當(dāng)前gtid_current_pos位置定時發(fā)送心跳消息給對端dbagent,dbagent接收到對端的心跳消息后解析記錄對端數(shù)據(jù)庫的gtid_current_pos位置,比對本機數(shù)據(jù)庫與對端數(shù)據(jù)庫的gtid_current_pos位置,根據(jù)差值判斷主從數(shù)據(jù)庫的數(shù)據(jù)同步情況,當(dāng)主從數(shù)據(jù)庫gtid_current_pos差距超過設(shè)定范圍進行實時告警等相關(guān)措施。
進一步,數(shù)據(jù)庫代理軟件dbagent一定時間內(nèi)接收不到對端dbagent發(fā)送的心跳消息后,主動通過mysql協(xié)議連接對端數(shù)據(jù)庫服務(wù),判斷對端數(shù)據(jù)庫服務(wù)是否正常,同時獲取對端數(shù)據(jù)庫的gtid_current_pos位置,如果連接失敗則判定對端數(shù)據(jù)庫異常,根據(jù)數(shù)據(jù)庫的主從角色決策是否發(fā)起主備切換。
通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換方法,該方法能夠?qū)崟r監(jiān)控掌握主從數(shù)據(jù)同步差距情況,間接了解系統(tǒng)的寫事務(wù)負(fù)載變化情況;去掉了第三方管理組件,直接規(guī)避了第三方管理組件故障引起的整個系統(tǒng)不可用問題;簡化處理邏輯的同時也簡化了安裝部署,dbagent可以與db進行軟件捆綁,各數(shù)據(jù)庫節(jié)點部署統(tǒng)一簡便;快速識別主備機數(shù)據(jù)庫數(shù)據(jù)不一致,數(shù)據(jù)一致時能自動 進行主備切換,并構(gòu)建新主從復(fù)制關(guān)系。數(shù)據(jù)不一致時能自動化生成差異化sql腳本,為人工干預(yù)節(jié)約時間,并高度保證數(shù)據(jù)一致性;在dbagent本身進程異常數(shù)據(jù)庫服務(wù)正常情況下,避免不必要的誤切換。
如圖3所示,本發(fā)明第二實施例提出一種主備數(shù)據(jù)庫切換方法,包括:
步驟s11,執(zhí)行連接本機數(shù)據(jù)庫服務(wù)操作,定時獲取本機數(shù)據(jù)庫當(dāng)前位置。
具體地,主備數(shù)據(jù)庫的dbagent定時監(jiān)控本機數(shù)據(jù)庫運行情況及當(dāng)前binlog日志中的最新gtid,同時,主備數(shù)據(jù)庫之間互相共享主備機數(shù)據(jù)庫運行情況。
當(dāng)本機數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時:
主數(shù)據(jù)庫的dbagent定時通過mysql協(xié)議,用特定的用戶連接主數(shù)據(jù)庫服務(wù)端口,查詢并獲取本機數(shù)據(jù)庫當(dāng)前位置(當(dāng)前gtid_current_pos),并進行記錄更新,通過心跳消息接口發(fā)送給備數(shù)據(jù)庫的dbagent進行記錄。
當(dāng)本機數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時:
備數(shù)據(jù)庫的dbagent定時通過mysql協(xié)議,用特定的用戶連接備數(shù)據(jù)庫服務(wù)端口,查詢并獲取本機數(shù)據(jù)庫當(dāng)前位置(當(dāng)前gtid_current_pos),并進行記錄更新,通過心跳消息接口發(fā)送給主數(shù)據(jù)庫的dbagent進行記錄。
步驟s21,接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置,將所述本機數(shù)據(jù)庫當(dāng)前位置與所述對端數(shù)據(jù)庫當(dāng)前位置進行比對。
具體地,當(dāng)本機數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時:
主數(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)本機數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時:
備數(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)所述本機數(shù)據(jù)庫當(dāng)前位置與所述對端數(shù)據(jù)庫當(dāng)前位置的差值大于預(yù)設(shè)的閾值時,執(zhí)行告警操作。
具體地,當(dāng)主數(shù)據(jù)庫的當(dāng)前gtid_current_pos位置和備數(shù)據(jù)庫的當(dāng)前gtid_current_pos位置差值大于配置的閾值時(該閾值可以是系統(tǒng)預(yù)先設(shè)置的,也 可以由用戶根據(jù)實際使用情況進行修改),采取相應(yīng)措施,如告警等。
通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換方法,該方法能夠?qū)崟r監(jiān)控掌握主從數(shù)據(jù)同步差距情況,間接了解系統(tǒng)的寫事務(wù)負(fù)載變化情況;去掉了第三方管理組件,直接規(guī)避了第三方管理組件故障引起的整個系統(tǒng)不可用問題;簡化處理邏輯的同時也簡化了安裝部署,dbagent可以與db進行軟件捆綁,各數(shù)據(jù)庫節(jié)點部署統(tǒng)一簡便;快速識別主備機數(shù)據(jù)庫數(shù)據(jù)不一致,數(shù)據(jù)一致時能自動進行主備切換,并構(gòu)建新主從復(fù)制關(guān)系。數(shù)據(jù)不一致時能自動化生成差異化sql腳本,為人工干預(yù)節(jié)約時間,并高度保證數(shù)據(jù)一致性;在dbagent本身進程異常數(shù)據(jù)庫服務(wù)正常情況下,避免不必要的誤切換。
進一步的,為了更好地保證貯備數(shù)據(jù)庫切換時數(shù)據(jù)的一致性,參照圖4,為本發(fā)明具體實施方式中,若所述連接本機數(shù)據(jù)庫服務(wù)操作的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則判定所述本機數(shù)據(jù)庫異常,并執(zhí)行告警操作或在所述本機數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進行主備切換操作的步驟的一種流程示意圖。
作為一種實施方式,上述步驟s30包括:
步驟s31,若所述本機數(shù)據(jù)庫為備數(shù)據(jù)庫,所述對端數(shù)據(jù)庫為主數(shù)據(jù)庫,則執(zhí)行告警操作,并繼續(xù)執(zhí)行連接檢測操作。
具體地,當(dāng)本機數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時:
若備數(shù)據(jù)庫的dbagent連接數(shù)據(jù)庫服務(wù)失敗超出規(guī)定次數(shù)(比如10次,該次數(shù)可以是系統(tǒng)預(yù)先設(shè)置的,也可以由用戶根據(jù)實際使用情況進行修改),判定當(dāng)前主數(shù)據(jù)庫異常,繼續(xù)執(zhí)行連接檢測操作。
步驟s32,若所述本機數(shù)據(jù)庫為主數(shù)據(jù)庫,所述對端數(shù)據(jù)庫為備數(shù)據(jù)庫,則解析所述本機數(shù)據(jù)庫的日志文件,獲取所述本機數(shù)據(jù)庫的最后位置,并根據(jù)所述最后位置執(zhí)行主備切換操作。
具體地,當(dāng)本機數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時:
若備數(shù)據(jù)庫的dbagent連接數(shù)據(jù)庫服務(wù)失敗超出規(guī)定次數(shù)(比如10次,該次數(shù)可以是系統(tǒng)預(yù)先設(shè)置的,也可以由用戶根據(jù)實際使用情況進行修改),判定當(dāng)前主數(shù)據(jù)庫異常,解析主數(shù)據(jù)庫的日志文件,獲取主數(shù)據(jù)庫的最后位置,并根據(jù)最后位置執(zhí)行主備切換操作,在具體實現(xiàn)時,可以采取如下方式:
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ù)據(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ù)庫切換方法,該方法通過在本機數(shù)據(jù)庫異常時,主備數(shù)據(jù)庫執(zhí)行的不同處理方式,更好地實現(xiàn)了實時監(jiān)控掌握主備數(shù)據(jù)庫同步差距情況,簡化操作,保證數(shù)據(jù)一致性,同時避免誤切換。
進一步的,為了更好地保證貯備數(shù)據(jù)庫切換時數(shù)據(jù)的一致性,參照圖5,為本發(fā)明具體實施方式中,執(zhí)行主備切換操作的步驟的一種流程示意圖。
作為一種實施方式,上述步驟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則進行自動切換操作,如果備數(shù)據(jù)庫gtid_current_pos小于主數(shù)據(jù)庫last_pos說明主數(shù)據(jù)庫的數(shù)據(jù)尚未完全同步至主數(shù)據(jù)庫,主備數(shù)據(jù)庫數(shù)據(jù)不一致,此時,可以根據(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位置,則進行自動切換操作,否則,則說明主數(shù)據(jù)庫的數(shù)據(jù)尚未完全同步至備數(shù)據(jù)庫,主備數(shù)據(jù)庫數(shù)據(jù)不一致,此時,可以根據(jù)業(yè)務(wù)要求決策是否需要自動切換并記錄相關(guān)的日志信息。
通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換方法,該方法通過根據(jù)不同情況執(zhí)行相應(yīng)的主備切換操作,更好地實現(xiàn)了實時監(jiān)控掌握主備數(shù)據(jù)庫同步差距情況,簡化操作,保證數(shù)據(jù)一致性,同時避免誤切換。
進一步的,為了更好地保證貯備數(shù)據(jù)庫切換時數(shù)據(jù)的一致性,參照圖6,為本發(fā)明具體實施方式中,執(zhí)行自動切換操作的步驟的一種流程示意圖。
作為一種實施方式,上述步驟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ù)據(jù)庫的binlog日志文件,從備數(shù)據(jù)庫的gtid_current_pos位置處解析之后的所有g(shù)tid涉及的sql語句,生成正向sql語句后,在原備數(shù)據(jù)庫補充執(zhí)行完畢后使得原主備數(shù)據(jù)庫數(shù)據(jù)恢復(fù)一致。
通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換方法,該方法通過執(zhí)行自動切換操作,更好地實現(xiàn)了實時監(jiān)控掌握主備數(shù)據(jù)庫同步差距情況,簡化操作,保證數(shù)據(jù)一致性,同時避免誤切換。
進一步的,為了更好地保證貯備數(shù)據(jù)庫切換時數(shù)據(jù)的一致性,參照圖7,為本發(fā)明具體實施方式中,獲取所述本機數(shù)據(jù)庫的最后位置的步驟的一種流程示意圖。
作為一種實施方式,上述步驟s32包括:
步驟s324,獲取所述本機數(shù)據(jù)庫的當(dāng)前日志文件列表。
具體地,當(dāng)主機數(shù)據(jù)庫服務(wù)異常時,dbagent通過調(diào)用mysqlbinlog工具獲取數(shù)據(jù)庫最后的gtid位置last_pos。
其中,通過數(shù)據(jù)庫binlog二進制日志文件夾下的index文件獲取當(dāng)前binlog文件列表。
步驟s325,從所述當(dāng)前日志文件列表中的最后一個日志文件開始掃描,并從所述最后一個日志文件的最后一個事件中獲取所述本機數(shù)據(jù)庫的最后位置。
具體地,從最后一個binlog日志文件開始掃描,掃描找到這個binlog文件的最后一個gtid事件(gtid_log_event),獲取最后一個gtid即為last_pos。
步驟s326,若無法從所述最后一個日志文件找到所述最后一個事件,則掃描所述最后一個日志文件的上一個日志文件,直到找到所述最后一個事件。
具體地,如果當(dāng)前binlog沒有找到gtid事件,即沒有事務(wù)提交記錄在這個binlog文件中,那么就掃描上一個binlog文件,循環(huán)往復(fù),直到找到最后一個gtid。
進一步,通過binlog日志文件查找指定gtid_current_pos位置的方法同上述查找last_pos方法。
另外,如圖8所示,為mariadb主備切換操作前后,主備數(shù)據(jù)庫相應(yīng)的binlog日志位置變換情況。
其中,posa是原主數(shù)據(jù)庫最后一次上報的正常心跳消息中的gtid_current_pos位置;last_pos是原主數(shù)據(jù)庫最后一個寫事務(wù)實際寫入binlog二進制日志中的最大gtid位置;posb為原備機數(shù)據(jù)庫從主數(shù)據(jù)庫復(fù)制binlog日志的最后一個事務(wù)對應(yīng)的gtid位置;當(dāng)last_pos、posb兩者重合相等時,主備數(shù)據(jù)完全一致,可自動進行主備切換;當(dāng)last_pos未知(掉電斷網(wǎng)等物理機異常情況),posb大于等于posa時主備數(shù)據(jù)是否一致未知;此時進行主備切換后,待原主機恢復(fù)異常后需要重新確認(rèn)last_pos位置與posb的關(guān)系,如果last_pos大于posb,則主備機之間有差異化binlog,否則主備機數(shù)據(jù)一致;當(dāng)last_pos未知(掉電斷網(wǎng)等物理機異常情況),posb小于posa時,原備機數(shù)據(jù)明顯落后原主機,主備機數(shù)據(jù) 不一致。
通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換方法,更好地實現(xiàn)了實時監(jiān)控掌握主備數(shù)據(jù)庫同步差距情況,簡化操作,保證數(shù)據(jù)一致性,同時避免誤切換。
基于上述方法實施例的實現(xiàn),本發(fā)明還提供相應(yīng)的裝置實施例。
如圖9所示,本發(fā)明第一實施例提出一種主備數(shù)據(jù)庫切換裝置,包括:
連接模塊100,用于執(zhí)行連接本機數(shù)據(jù)庫服務(wù)操作。
其中,本發(fā)明主要通過利用mariadb和binlog日志保障數(shù)據(jù)庫主備數(shù)據(jù)同步過程可監(jiān)控,保證數(shù)據(jù)庫異常時快速自動切換。
其中,在具體實現(xiàn)時,可以在主備數(shù)據(jù)庫所在設(shè)備上部署數(shù)據(jù)庫代理軟件dbagent(或其他能夠?qū)崿F(xiàn)相同功能的軟件),dbagent是一種數(shù)據(jù)庫代理軟件,可以用于監(jiān)控數(shù)據(jù)庫服務(wù)運行情況,解析binlog日志文件,在出現(xiàn)故障時可以用于切換控制進程;其中,在mariadb數(shù)據(jù)庫運行過程中,會將執(zhí)行過的相關(guān)動作記錄到binlog日志文件中,以備從數(shù)據(jù)庫讀取同步數(shù)據(jù),mariadb數(shù)據(jù)庫執(zhí)行過程中,產(chǎn)生binlog日志文件時,會相應(yīng)給出binlog位置,即當(dāng)前日志位置(長整形值)。
具體地,主備數(shù)據(jù)庫的dbagent定時監(jiān)控本機數(shù)據(jù)庫運行情況及當(dāng)前binlog日志中的最新gtid,同時,主備數(shù)據(jù)庫之間互相共享主備機數(shù)據(jù)庫運行情況。
當(dāng)本機數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時:
主數(shù)據(jù)庫的dbagent定時通過mysql協(xié)議,用特定的用戶連接主數(shù)據(jù)庫服務(wù)端口,查詢并獲取本機數(shù)據(jù)庫當(dāng)前位置(當(dāng)前gtid_current_pos),并進行記錄更新,通過心跳消息接口發(fā)送給備數(shù)據(jù)庫的dbagent進行記錄。
當(dāng)本機數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時:
備數(shù)據(jù)庫的dbagent定時通過mysql協(xié)議,用特定的用戶連接備數(shù)據(jù)庫服務(wù)端口,查詢并獲取本機數(shù)據(jù)庫當(dāng)前位置(當(dāng)前gtid_current_pos),并進行記錄更新,通過心跳消息接口發(fā)送給主數(shù)據(jù)庫的dbagent進行記錄。
位置模塊200,用于接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置。
具體地,當(dāng)本機數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時:
主數(shù)據(jù)庫的dbagent接收備數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,記錄備數(shù) 據(jù)庫當(dāng)前gtid_current_pos位置。
當(dāng)本機數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時:
備數(shù)據(jù)庫的dbagent接收主數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,記錄主數(shù)據(jù)庫當(dāng)前gtid_current_pos位置。
執(zhí)行模塊300,用于若所述連接本機數(shù)據(jù)庫服務(wù)操作的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則判定所述本機數(shù)據(jù)庫異常,并執(zhí)行告警操作或在所述本機數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進行主備切換操作,或者,若所述接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置的失敗次數(shù)超過預(yù)設(shè)的次數(shù),則執(zhí)行告警操作或在所述本機數(shù)據(jù)庫和所述對端數(shù)據(jù)庫之間進行主備切換操作。
具體地,當(dāng)本機數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時:
若備數(shù)據(jù)庫的dbagent連接數(shù)據(jù)庫服務(wù)失敗超出規(guī)定次數(shù)(比如10次,該次數(shù)可以是系統(tǒng)預(yù)先設(shè)置的,也可以由用戶根據(jù)實際使用情況進行修改),判定當(dāng)前主數(shù)據(jù)庫異常,繼續(xù)執(zhí)行連接檢測操作。
當(dāng)本機數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時:
若備數(shù)據(jù)庫的dbagent連接數(shù)據(jù)庫服務(wù)失敗超出規(guī)定次數(shù)(比如10次,該次數(shù)可以是系統(tǒng)預(yù)先設(shè)置的,也可以由用戶根據(jù)實際使用情況進行修改),判定當(dāng)前主數(shù)據(jù)庫異常,解析主數(shù)據(jù)庫的日志文件,獲取主數(shù)據(jù)庫的最后位置,并根據(jù)最后位置執(zhí)行主備切換操作,在具體實現(xiàn)時,可以采取如下方式:
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ù)據(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)主機數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時:
如果主數(shù)據(jù)庫的dbagent超出規(guī)定次數(shù)未接收到主數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,則執(zhí)行告警告警操作。
當(dāng)主機數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時:
如果備數(shù)據(jù)庫的dbagent超出規(guī)定次數(shù)未接收到主數(shù)據(jù)庫的dbagent發(fā)送的心跳消息,則通過mysql協(xié)議連接主數(shù)據(jù)庫服務(wù)端口獲取主數(shù)據(jù)庫當(dāng)前位置gtid_current_pos,如果獲取成功說明主數(shù)據(jù)庫的dbagent進程運行異常,數(shù)據(jù)庫服務(wù)正常,無須發(fā)起主備切換,只需告警并記錄相關(guān)日志,如果獲取失敗,說明主數(shù)據(jù)庫dbagent進程和數(shù)據(jù)庫服務(wù)均異常,此時可以發(fā)起主備切換請求。
另外,如圖2所示,為主從復(fù)制監(jiān)控管理平臺架構(gòu)圖,具體描述如下:
主數(shù)據(jù)庫執(zhí)行ddl語句或包含更新sql的事務(wù)時,為該事務(wù)分配一個全局唯一的順序的gtid編號,事務(wù)提交前寫入二進制binlog日志文件同時同步給從數(shù)據(jù)庫,從數(shù)據(jù)庫讀取主數(shù)據(jù)庫的binlog日志信息同步數(shù)據(jù),回復(fù)執(zhí)行對應(yīng)的sql語句,從而達到與主數(shù)據(jù)庫數(shù)據(jù)同步;
數(shù)據(jù)庫代理軟件dbagent定時監(jiān)測本機數(shù)據(jù)庫服務(wù)運行情況,通過mysql協(xié)議連接訪問本機數(shù)據(jù)庫監(jiān)控數(shù)據(jù)庫運行是否正常,同時獲取本機數(shù)據(jù)庫當(dāng)前gtid_current_pos位置定時發(fā)送心跳消息給對端dbagent,dbagent接收到對端的心跳消息后解析記錄對端數(shù)據(jù)庫的gtid_current_pos位置,比對本機數(shù)據(jù)庫與對端數(shù)據(jù)庫的gtid_current_pos位置,根據(jù)差值判斷主從數(shù)據(jù)庫的數(shù)據(jù)同步情況,當(dāng)主從數(shù)據(jù)庫gtid_current_pos差距超過設(shè)定范圍進行實時告警等相關(guān)措施。
進一步,數(shù)據(jù)庫代理軟件dbagent一定時間內(nèi)接收不到對端dbagent發(fā)送的心跳消息后,主動通過mysql協(xié)議連接對端數(shù)據(jù)庫服務(wù),判斷對端數(shù)據(jù)庫服務(wù)是否正常,同時獲取對端數(shù)據(jù)庫的gtid_current_pos位置,如果連接失敗則判定對端數(shù)據(jù)庫異常,根據(jù)數(shù)據(jù)庫的主從角色決策是否發(fā)起主備切換。
通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換裝置,該方法能夠?qū)崟r監(jiān) 控掌握主從數(shù)據(jù)同步差距情況,間接了解系統(tǒng)的寫事務(wù)負(fù)載變化情況;去掉了第三方管理組件,直接規(guī)避了第三方管理組件故障引起的整個系統(tǒng)不可用問題;簡化處理邏輯的同時也簡化了安裝部署,dbagent可以與db進行軟件捆綁,各數(shù)據(jù)庫節(jié)點部署統(tǒng)一簡便;快速識別主備機數(shù)據(jù)庫數(shù)據(jù)不一致,數(shù)據(jù)一致時能自動進行主備切換,并構(gòu)建新主從復(fù)制關(guān)系。數(shù)據(jù)不一致時能自動化生成差異化sql腳本,為人工干預(yù)節(jié)約時間,并高度保證數(shù)據(jù)一致性;在dbagent本身進程異常數(shù)據(jù)庫服務(wù)正常情況下,避免不必要的誤切換。
如圖10所示,本發(fā)明第二實施例提出一種主備數(shù)據(jù)庫切換裝置,其中:
上述連接模塊100,還用于執(zhí)行連接本機數(shù)據(jù)庫服務(wù)操作,定時獲取本機數(shù)據(jù)庫當(dāng)前位置。
具體地,主備數(shù)據(jù)庫的dbagent定時監(jiān)控本機數(shù)據(jù)庫運行情況及當(dāng)前binlog日志中的最新gtid,同時,主備數(shù)據(jù)庫之間互相共享主備機數(shù)據(jù)庫運行情況。
當(dāng)本機數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時:
主數(shù)據(jù)庫的dbagent定時通過mysql協(xié)議,用特定的用戶連接主數(shù)據(jù)庫服務(wù)端口,查詢并獲取本機數(shù)據(jù)庫當(dāng)前位置(當(dāng)前gtid_current_pos),并進行記錄更新,通過心跳消息接口發(fā)送給備數(shù)據(jù)庫的dbagent進行記錄。
當(dāng)本機數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時:
備數(shù)據(jù)庫的dbagent定時通過mysql協(xié)議,用特定的用戶連接備數(shù)據(jù)庫服務(wù)端口,查詢并獲取本機數(shù)據(jù)庫當(dāng)前位置(當(dāng)前gtid_current_pos),并進行記錄更新,通過心跳消息接口發(fā)送給主數(shù)據(jù)庫的dbagent進行記錄。
上述位置模塊200,還用于接收對端數(shù)據(jù)庫發(fā)送的對端數(shù)據(jù)庫當(dāng)前位置,將所述本機數(shù)據(jù)庫當(dāng)前位置與所述對端數(shù)據(jù)庫當(dāng)前位置進行比對。
具體地,當(dāng)本機數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時:
主數(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)本機數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時:
備數(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)所述本機數(shù)據(jù)庫當(dāng)前位置與所述對端數(shù)據(jù)庫當(dāng)前位置的差值大于預(yù)設(shè)的閾值時,執(zhí)行告警操作。
具體地,當(dāng)主數(shù)據(jù)庫的當(dāng)前gtid_current_pos位置和備數(shù)據(jù)庫的當(dāng)前gtid_current_pos位置差值大于配置的閾值時(該閾值可以是系統(tǒng)預(yù)先設(shè)置的,也可以由用戶根據(jù)實際使用情況進行修改),采取相應(yīng)措施,如告警等。
通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換裝置,該方法能夠?qū)崟r監(jiān)控掌握主從數(shù)據(jù)同步差距情況,間接了解系統(tǒng)的寫事務(wù)負(fù)載變化情況;去掉了第三方管理組件,直接規(guī)避了第三方管理組件故障引起的整個系統(tǒng)不可用問題;簡化處理邏輯的同時也簡化了安裝部署,dbagent可以與db進行軟件捆綁,各數(shù)據(jù)庫節(jié)點部署統(tǒng)一簡便;快速識別主備機數(shù)據(jù)庫數(shù)據(jù)不一致,數(shù)據(jù)一致時能自動進行主備切換,并構(gòu)建新主從復(fù)制關(guān)系。數(shù)據(jù)不一致時能自動化生成差異化sql腳本,為人工干預(yù)節(jié)約時間,并高度保證數(shù)據(jù)一致性;在dbagent本身進程異常數(shù)據(jù)庫服務(wù)正常情況下,避免不必要的誤切換。
進一步的,為了更好地保證貯備數(shù)據(jù)庫切換時數(shù)據(jù)的一致性,上述執(zhí)行模塊300,還用于若所述本機數(shù)據(jù)庫為備數(shù)據(jù)庫,所述對端數(shù)據(jù)庫為主數(shù)據(jù)庫,則執(zhí)行告警操作,并繼續(xù)執(zhí)行連接檢測操作;若所述本機數(shù)據(jù)庫為主數(shù)據(jù)庫,所述對端數(shù)據(jù)庫為備數(shù)據(jù)庫,則解析所述本機數(shù)據(jù)庫的日志文件,獲取所述本機數(shù)據(jù)庫的最后位置,并根據(jù)所述最后位置執(zhí)行主備切換操作。
具體地,當(dāng)本機數(shù)據(jù)庫為備數(shù)據(jù)庫,對端數(shù)據(jù)庫為主數(shù)據(jù)庫時:
若備數(shù)據(jù)庫的dbagent連接數(shù)據(jù)庫服務(wù)失敗超出規(guī)定次數(shù)(比如10次,該次數(shù)可以是系統(tǒng)預(yù)先設(shè)置的,也可以由用戶根據(jù)實際使用情況進行修改),判定當(dāng)前主數(shù)據(jù)庫異常,繼續(xù)執(zhí)行連接檢測操作。
然后,當(dāng)本機數(shù)據(jù)庫為主數(shù)據(jù)庫,對端數(shù)據(jù)庫為備數(shù)據(jù)庫時:
若備數(shù)據(jù)庫的dbagent連接數(shù)據(jù)庫服務(wù)失敗超出規(guī)定次數(shù)(比如10次,該次數(shù)可以是系統(tǒng)預(yù)先設(shè)置的,也可以由用戶根據(jù)實際使用情況進行修改),判定當(dāng)前主數(shù)據(jù)庫異常,解析主數(shù)據(jù)庫的日志文件,獲取主數(shù)據(jù)庫的最后位置,并根據(jù)最后位置執(zhí)行主備切換操作,在具體實現(xiàn)時,可以采取如下方式:
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ù)據(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ù)庫切換裝置,該方法通過在本機數(shù)據(jù)庫異常時,主備數(shù)據(jù)庫執(zhí)行的不同處理方式,更好地實現(xiàn)了實時監(jiān)控掌握主備數(shù)據(jù)庫同步差距情況,簡化操作,保證數(shù)據(jù)一致性,同時避免誤切換。
進一步的,為了更好地保證貯備數(shù)據(jù)庫切換時數(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則進行自動切換操作,如果備數(shù)據(jù)庫 gtid_current_pos小于主數(shù)據(jù)庫last_pos說明主數(shù)據(jù)庫的數(shù)據(jù)尚未完全同步至主數(shù)據(jù)庫,主備數(shù)據(jù)庫數(shù)據(jù)不一致,此時,可以根據(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位置,則進行自動切換操作,否則,則說明主數(shù)據(jù)庫的數(shù)據(jù)尚未完全同步至備數(shù)據(jù)庫,主備數(shù)據(jù)庫數(shù)據(jù)不一致,此時,可以根據(jù)業(yè)務(wù)要求決策是否需要自動切換并記錄相關(guān)的日志信息。
通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換裝置,該方法通過根據(jù)不同情況執(zhí)行相應(yīng)的主備切換操作,更好地實現(xiàn)了實時監(jiān)控掌握主備數(shù)據(jù)庫同步差距情況,簡化操作,保證數(shù)據(jù)一致性,同時避免誤切換。
進一步的,為了更好地保證貯備數(shù)據(jù)庫切換時數(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ù)據(jù)庫的binlog日志文件,從備數(shù)據(jù)庫的gtid_current_pos位置處解析之后的所有g(shù)tid涉及的sql語句,生成正向sql語句后,在原備數(shù)據(jù)庫補充執(zhí)行完畢后使得原主備數(shù)據(jù)庫數(shù)據(jù)恢復(fù)一致。
通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換裝置,該方法通過執(zhí)行自動切換操作,更好地實現(xiàn)了實時監(jiān)控掌握主備數(shù)據(jù)庫同步差距情況,簡化操作,保證數(shù)據(jù)一致性,同時避免誤切換。
進一步的,為了更好地保證貯備數(shù)據(jù)庫切換時數(shù)據(jù)的一致性,上述執(zhí)行模塊300,還用于獲取所述本機數(shù)據(jù)庫的當(dāng)前日志文件列表;從所述當(dāng)前日志文件列表中的最后一個日志文件開始掃描,并從所述最后一個日志文件的最后一個事件中獲取所述本機數(shù)據(jù)庫的最后位置;若無法從所述最后一個日志文件找到所述最 后一個事件,則掃描所述最后一個日志文件的上一個日志文件,直到找到所述最后一個事件。
具體地,當(dāng)主機數(shù)據(jù)庫服務(wù)異常時,dbagent通過調(diào)用mysqlbinlog工具獲取數(shù)據(jù)庫最后的gtid位置last_pos。
其中,通過數(shù)據(jù)庫binlog二進制日志文件夾下的index文件獲取當(dāng)前binlog文件列表。
然后,從最后一個binlog日志文件開始掃描,掃描找到這個binlog文件的最后一個gtid事件(gtid_log_event),獲取最后一個gtid即為last_pos。
然后,如果當(dāng)前binlog沒有找到gtid事件,即沒有事務(wù)提交記錄在這個binlog文件中,那么就掃描上一個binlog文件,循環(huán)往復(fù),直到找到最后一個gtid。
進一步,通過binlog日志文件查找指定gtid_current_pos位置的方法同上述查找last_pos方法。
另外,如圖8所示,為mariadb主備切換操作前后,主備數(shù)據(jù)庫相應(yīng)的binlog日志位置變換情況。
其中,posa是原主數(shù)據(jù)庫最后一次上報的正常心跳消息中的gtid_current_pos位置;last_pos是原主數(shù)據(jù)庫最后一個寫事務(wù)實際寫入binlog二進制日志中的最大gtid位置;posb為原備機數(shù)據(jù)庫從主數(shù)據(jù)庫復(fù)制binlog日志的最后一個事務(wù)對應(yīng)的gtid位置;當(dāng)last_pos、posb兩者重合相等時,主備數(shù)據(jù)完全一致,可自動進行主備切換;當(dāng)last_pos未知(掉電斷網(wǎng)等物理機異常情況),posb大于等于posa時主備數(shù)據(jù)是否一致未知;此時進行主備切換后,待原主機恢復(fù)異常后需要重新確認(rèn)last_pos位置與posb的關(guān)系,如果last_pos大于posb,則主備機之間有差異化binlog,否則主備機數(shù)據(jù)一致;當(dāng)last_pos未知(掉電斷網(wǎng)等物理機異常情況),posb小于posa時,原備機數(shù)據(jù)明顯落后原主機,主備機數(shù)據(jù)不一致。
通過上述方案,本發(fā)明提供了一種主備數(shù)據(jù)庫切換裝置,更好地實現(xiàn)了實時監(jiān)控掌握主備數(shù)據(jù)庫同步差距情況,簡化操作,保證數(shù)據(jù)一致性,同時避免誤切換。
以上僅為本發(fā)明的優(yōu)選實施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等效結(jié)構(gòu)或等效流程變換,或直接或間接運用在 其他相關(guān)的技術(shù)領(lǐng)域,均同理包括在本發(fā)明的專利保護范圍內(nèi)。