專利名稱:數(shù)據(jù)庫高可用實現(xiàn)方法及其裝置的制作方法
技術(shù)領(lǐng)域:
本申請涉及信息技術(shù)領(lǐng)域,尤其涉及一種數(shù)據(jù)庫高可用實現(xiàn)方法及其裝置。
背景技術(shù):
近年來,各行各業(yè)都利用計算機(jī)系統(tǒng)來提供及時可靠的信息和服務(wù);但是,計算機(jī)硬件和軟件都不可避免地會發(fā)生故障。一旦系統(tǒng)發(fā)生故障,便需要人工認(rèn)定以及錯誤分析、測試和系統(tǒng)恢復(fù)。因此,系統(tǒng)故障可能導(dǎo)致系統(tǒng)較長時間的停頓,甚至整個服務(wù)的終止、網(wǎng)絡(luò)的癱瘓,給企業(yè)帶來難以估計的經(jīng)濟(jì)損失。由此可見,對一些行業(yè)(例如網(wǎng)絡(luò)服務(wù)商、金融機(jī)構(gòu)、超市的POS系統(tǒng)服務(wù)器等)來說,系統(tǒng)的容錯性和不間斷性顯得尤為重要。因此,必須采取適當(dāng)?shù)拇胧﹣泶_保計算機(jī)系統(tǒng)的不間斷運行,即系統(tǒng)的高可用,這里,高可用性(High Availability)指的是通過盡量縮短因日常維護(hù)操作(計劃)和突發(fā)的系統(tǒng)崩潰(非計劃)所導(dǎo)致的停機(jī)時間,以提高系統(tǒng)和應(yīng)用的可用性。它與被認(rèn)為是不間斷操作的容錯技術(shù)有所不同。高可用性系統(tǒng)是目前企業(yè)防止核心計算機(jī)系統(tǒng)因故障停機(jī)的最有效手段。例如,當(dāng)其中某一臺服務(wù)器出現(xiàn)故障時,可將訪問請求轉(zhuǎn)移到其它可以正常工作的服務(wù)器上,這就保證了公司和企業(yè)的核心業(yè)務(wù)系統(tǒng)安全、高效的運行。目前,行業(yè)內(nèi)的高可用性軟件主要有IBM的hacmp (高可用性集群多重處理),HP的service guard, Veritas vcs等,從技術(shù)上來說,它們監(jiān)控的層面都是主機(jī);另外,這些傳統(tǒng)的高可用工具也不會檢測備庫針對主庫的延時。以hacmp為例,要判斷其oracle是否可用,僅僅是查看一下oracle的進(jìn)程是否存在,然而,這樣的判斷方式是不準(zhǔn)確的,當(dāng)oracle處于夯住(hang)狀態(tài)時,hacmp是無法偵測到的。
發(fā)明內(nèi)容
鑒于上述現(xiàn)有技術(shù)的缺陷,本申請的主要目的在于提供一種數(shù)據(jù)庫高可用實現(xiàn)方法及其裝置,以解決現(xiàn)有技術(shù)存在的上述問題。為實現(xiàn)上述目的,本申請的實施例提供了一種數(shù)據(jù)庫高可用實現(xiàn)方法,應(yīng)用于包括主庫和備庫的數(shù)據(jù)庫中,該方法包括以下步驟S1、設(shè)置心跳表子線程來判斷所述主庫的心跳表是否更新失敗,設(shè)置備庫子線程來判斷所述備庫是否可用,設(shè)置網(wǎng)關(guān)子線程來判斷所述主庫和所述備庫分別所在服務(wù)器的網(wǎng)關(guān)是否可用;S2、設(shè)置主線程對所述心跳表子線程、所述備庫子線程和所述網(wǎng)關(guān)子線程的判斷結(jié)果進(jìn)行循環(huán)檢測,在所述心跳表子線程、所述備庫子線程和所述網(wǎng)關(guān)子線程的判斷結(jié)果均為是時繼續(xù)步驟S3 ;S3、執(zhí)行從所述主庫到所述備庫的切換。本申請的實施例還提供了一種數(shù)據(jù)庫高可用實現(xiàn)裝置,應(yīng)用于包括主庫和備庫的數(shù)據(jù)庫中,該裝置包括主線程模塊及切換模塊,還包括心跳表子線程模塊,用于判斷所述主庫的心跳表是否更新失敗;備庫子線程模塊,用于判斷所述備庫是否可用;網(wǎng)關(guān)子線程模塊,用于判斷所述主庫和所述備庫分別所在服務(wù)器的網(wǎng)關(guān)是否可用;所述主線程模塊對所述心跳表子線程模塊、所述備庫子線程模塊和所述網(wǎng)關(guān)子線程模塊的判斷結(jié)果進(jìn)行循環(huán)檢測,并且在所述心跳表子線程模塊、所述備庫子線程模塊和所述網(wǎng)關(guān)子線程模塊的判斷結(jié)果均為是時通知所述切換模塊執(zhí)行從所述主庫到所述備庫的切換。由上述技術(shù)方案可知,本申請將心跳表的更新的成功與否作為判斷數(shù)據(jù)庫是否可用的標(biāo)準(zhǔn),使得在判斷上更加準(zhǔn)確;通過對切換條件的靈活配置可以有效地控制主庫和備庫之間切換的時間。
圖1為本申請數(shù)據(jù)庫高可用實現(xiàn)方法的實施例流程圖;圖2為本申請數(shù)據(jù)庫高可用實現(xiàn)裝置的實施例結(jié)構(gòu)框圖。
具體實施例方式下面將詳細(xì)描述本申請的具體實施例。應(yīng)當(dāng)注意,這里描述的實施例只用于舉例說明,并不用于限制本申請。圖1為本申請數(shù)據(jù)庫高可用實現(xiàn)方法的實施例流程圖。本實施例的數(shù)據(jù)庫高可用實現(xiàn)方法用于實現(xiàn)主用數(shù)據(jù)庫(下文中簡稱為主庫)和備用數(shù)據(jù)庫(下文中簡稱為備庫)之間的切換,如圖所示,所述方法包括以下步驟S1、S2和S3。S1、設(shè)置心跳表子線程來判斷所述主庫的心跳表是否更新失敗,設(shè)置備庫子線程來判斷所述備庫是否可用,設(shè)置網(wǎng)關(guān)子線程來判斷所述主庫和所述備庫分別所在服務(wù)器的網(wǎng)關(guān)是否可用。之前提到的高可用程序(HA,例如hacmp、service guard等)主要針對的是主機(jī)層面(例如存儲不可用、網(wǎng)絡(luò)不可用等),它具有通用性,但是對于數(shù)據(jù)庫的高可用又缺乏針對性,例如,它判斷主庫是否健康的方式只是簡單的查看oracle進(jìn)程是否存在,如果oracle的進(jìn)程夯住(即進(jìn)程存在,但數(shù)據(jù)庫無法提供服務(wù)),hacmp將不能發(fā)起切換,所以,數(shù)據(jù)庫的高可用軟件需要有如下功能1.以數(shù)據(jù)庫是否能夠提供服務(wù)作為數(shù)據(jù)庫是否健康的唯一標(biāo)準(zhǔn);2.切換之前需要檢測備庫是否具備可切換的條件;3.能夠第一時間發(fā)現(xiàn)高可用軟件是否在健康工作。在一個實施例中,本方法可以通過一個包括主線程及多個子線程的計算機(jī)程序來實現(xiàn),其中,主線程和多個子線程均運行在監(jiān)控機(jī)上,所述監(jiān)控機(jī)可以為第三方服務(wù)器,所述主線程生成多個子線程,多個子線程分別完成對主庫、備庫、網(wǎng)關(guān)的對應(yīng)檢查后,主線程再通過獲得每個子線程返回值來判斷是否需要進(jìn)行數(shù)據(jù)庫主備切換;對應(yīng)于本步驟,首先,判斷主庫的心跳表是否更新失敗。這里,心跳表即為數(shù)據(jù)庫里的一張表,用于通過更新里面的某個字段來判斷數(shù)據(jù)庫監(jiān)聽器是否可用、數(shù)據(jù)庫是否可用、是否有訪問超時等。在一個實施例中,主線程每隔一定的心跳表更新時間間隔update_interval會對心跳表檢測子線程進(jìn)行循環(huán)檢測,并根據(jù)檢測到的update_flag的值來判斷主庫是否可用;需要注意的是,判斷主庫可用的前提條件有兩個,一是數(shù)據(jù)庫可訪問,二是心跳表可更新且更新未超時;這里,還需要特殊說明一下,若心跳表更新失敗則需要根據(jù)配置文件來判斷是否將update_flag的值置為“false” ;當(dāng)update_flag = false時,表示主庫不可用,此時可以進(jìn)行切換;反之,當(dāng)update_flag = true時,貝U表示主庫可用,此時不可以進(jìn)行切換;在一個實施例中,心跳表更新時間間隔update_interval的值可以根據(jù)情況進(jìn)行靈活配置,例如可設(shè)置為2秒、10秒或30秒等等;在一個實施例中,當(dāng)主庫心跳表的更新超時update_timeout的值超過預(yù)設(shè)的心跳表更新時間間隔update_interval的值而不返回結(jié)果時則表示超時,認(rèn)為更新主庫心跳表的操作失敗一次。在一個實施例中,由于網(wǎng)絡(luò)的抖動等原因,可能導(dǎo)致心跳表的某一次更新失敗或者超時,然而,若僅憑這一次的失敗就進(jìn)行切換勢必會導(dǎo)致在數(shù)據(jù)庫狀態(tài)的判斷上的不準(zhǔn)確;因此,可通過對心跳表的累積連續(xù)失敗次數(shù)的判斷來對數(shù)據(jù)庫狀態(tài)進(jìn)行更加準(zhǔn)確的判斷;例如,當(dāng)心跳表更新時間間隔內(nèi)更新失敗的累積連續(xù)失敗次數(shù)超過update_error_alarm_count的值后會通過短信、郵件等方式開始報警;當(dāng)累積連續(xù)失敗次數(shù)超過update_error_count 的值之后,再將 update_flag 的值置為 “false”,即 update_flag = false,此時認(rèn)為主庫不可用;因此,通過這樣的操作來對于數(shù)據(jù)庫狀態(tài)進(jìn)行判斷才是更加準(zhǔn)確的;在一個實施例中,update_error_alarm_count 的值和 update_error_count 的值可根據(jù)情況進(jìn)行靈活配置的,例如update_error_alarm_count的值可設(shè)置為3次、4次或6次等,update_error_count的值可設(shè)置為10次、16次或20次等;優(yōu)選地,將update_error_alarm_count 的 1 : /]''于 update_error_count 的I 。其次,判斷備庫是否可用。在一個實施例中,主線程每隔一定的檢測備庫時間間隔check_standby_interval會對備庫檢測子線程進(jìn)行循環(huán)檢 測,并根據(jù)檢測到的check_standby_flag的值來判斷備庫是否可用;需要注意的是,判斷備庫可用的前提條件有兩個,一是備庫可訪問,二是備庫針對主庫的延時沒有超過檢測備庫閾值check_standby_threshold ;這里所說的延時是指備庫中的數(shù)據(jù)相對于主庫中的數(shù)據(jù)所落后時間的長短,若備庫落后主庫太久,則說明備庫的數(shù)據(jù)是陳舊的,那么在切換完成之后用戶就訪問不到自己所需的最新數(shù)據(jù),也就是說,在切換完成之后相對用戶而言,數(shù)據(jù)庫還是不可用的,由于備庫中的數(shù)據(jù)沒有及時被更新,因此,用戶不可能從備庫中得到所需的最新數(shù)據(jù);這里,還需要特殊說明一下,若檢測備庫可用,則將 check_standby_flag 的值置為 “true” ;進(jìn)一步而言,當(dāng) check_standby_flag =true時,表示備庫可用,此時可以進(jìn)行切換;反之,當(dāng)check_standby_flag = false時,則表示備庫不可用,此時不可以進(jìn)行切換;在一個實施例中,檢測備庫時間間隔check_standbyjnterval的值可根據(jù)情況進(jìn)行靈活配置,例如可設(shè)置為2秒、10秒或30秒等等;在一個實施例中,若檢測備庫超時check_sandby_timeout的值超過預(yù)設(shè)的檢測備庫時間間隔check_sandby_interval的值而不返回結(jié)果則表示超時,認(rèn)為檢測備庫是否可用的操作失敗一次;需要注意的是,備庫針對主庫的延時不能超過檢測備庫閾值check_standby_threshold。在一個實施例中,由于網(wǎng)絡(luò)的抖動等原因,可能導(dǎo)致某一次的備庫檢測失敗,然而,若僅憑這一次的失敗就進(jìn)行切換勢必會導(dǎo)致在數(shù)據(jù)庫狀態(tài)的判斷上的不準(zhǔn)確;因此,可通過對檢測備庫的累積連續(xù)失敗次數(shù)的判斷來對數(shù)據(jù)庫狀態(tài)進(jìn)行更加準(zhǔn)確的判斷;例如,當(dāng)檢測備庫時間間隔內(nèi)檢測失敗的累積連續(xù)失敗次數(shù)超過check_standby_error_alarm_count的值后會通過短信、郵件等方式開始報警;當(dāng)累積連續(xù)失敗次數(shù)超過check_standby_error_count 的值之后,再將 check_standby_flag 的值置為 “false”,即 check_standby_flag = false,此時認(rèn)為備庫不可用;在一個實施例中,check_standby_error_alarm_count的值和check_standby_error_count的值可根據(jù)情況進(jìn)行靈活配置的,例如check_standby_error_alarm_count 的值可設(shè)置為 3 次、4 次或 6 次等,check_standby_error_count的值可設(shè)置為10次、16次或20次等;優(yōu)選地,將check_standby_error_alarm_count 的值設(shè)為小于 check_standby_error_count 的值。在一個實施例中,如果檢測到備庫中的數(shù)據(jù)與主庫中的數(shù)據(jù)不一致,則先要將備庫中的數(shù)據(jù)與主庫中的數(shù)據(jù)進(jìn)行同步,之后再繼續(xù)進(jìn)行如上所述的檢測,如果檢測到備庫中的數(shù)據(jù)與主庫中的數(shù)據(jù)一致,則表示備庫可用。再次,判斷主庫和備庫所在服務(wù)器的網(wǎng)關(guān)是否可用。在一個實施例中,主線程每隔一定的檢測網(wǎng)關(guān)時間間隔check_gateway_interval會對網(wǎng)關(guān)檢測子線程進(jìn)行循環(huán)檢測,并根據(jù)檢測到的ping_standby_flag的值來判斷主庫和備庫所在服務(wù)器的網(wǎng)關(guān)是否可用;需要注意的是,判斷網(wǎng)關(guān)可用的前提條件有兩個,一是網(wǎng)關(guān)可連通,二是網(wǎng)關(guān)不可用的累積連續(xù)失敗次數(shù)未超過預(yù)設(shè)的網(wǎng)關(guān)不可用連續(xù)失敗次數(shù);這里,還需要特殊說明一下,若檢測網(wǎng)關(guān)可用,則將ping_Standby_flag的值設(shè)置為“true”;具體而言,當(dāng)ping_standby_flag = false時,表示網(wǎng)關(guān)不可用,此時不可以進(jìn)行切換;反之,當(dāng)ping_standby_flag = true時,貝U表示網(wǎng)關(guān)可用,此時可以進(jìn)行切換;在一個實施例中,檢測網(wǎng)關(guān)時間間隔check_gateway_interval的值可根據(jù)情況進(jìn)行靈活配置,例如可設(shè)置為5秒、10秒或30秒等等。在一個實施例中,ping命令為DOS命令,可以檢測任何一個用戶是否與同一網(wǎng)段的其他用戶連通,是否與其他網(wǎng)段的用戶連接正常,同時還可以檢測自己的IP地址是否與其他用戶的IP地址發(fā)生沖突等等。在一個實施例中,由于網(wǎng)絡(luò)的抖動等原因,可能導(dǎo)致某一次的檢測網(wǎng)關(guān)失敗,然而,若僅憑這一次的失敗就進(jìn)行切換勢必會導(dǎo)致在數(shù)據(jù)庫狀態(tài)的判斷上的不準(zhǔn)確;因此,可以通過對檢測網(wǎng)關(guān)的累積連續(xù)失敗次數(shù)的判斷來對數(shù)據(jù)庫狀態(tài)進(jìn)行更加準(zhǔn)確的判斷;例如,當(dāng)檢測網(wǎng)關(guān)時間間隔內(nèi)檢測失敗的累積連續(xù)失敗次數(shù)超過check_gateway_error_alarm_count的值之后會通過短信、郵件等方式開始報警;當(dāng)累積連續(xù)失敗次數(shù)超過 check_gateway_error_count 的值之后,再將 ping_standby_flag 的值置為 “false”,即ping_standby_flag = false,此時認(rèn)為網(wǎng)關(guān)不可用;在一個實施例中,check_gateway_error_alarm_count的值和check_gateway_error_count的值可根據(jù)情況進(jìn)行靈活配置,例如check_gateway_error_alarm_count 的值可設(shè)置為 10 次、18 次或 25 次等,update_error_count的值可設(shè)置為50次、60次或70次等;優(yōu)選地,將check_gateway_error_alarm_countcheck_gateway_error_count 的I 。S2、設(shè)置主線程對所述心跳表子線程、所述備庫子線程和所述網(wǎng)關(guān)子線程的判斷結(jié)果進(jìn)行循環(huán)檢測,在所述心跳表子線程、所述備庫子線程和所述網(wǎng)關(guān)子線程的判斷結(jié)果均為是時繼續(xù)步驟S3。在一個實施例中,主線程會循環(huán)獲取各子線程的判斷結(jié)果;當(dāng)判斷結(jié)果均為是時,則表示當(dāng)前狀態(tài)下主庫不可用且備庫可用、網(wǎng)關(guān)可訪問,即,當(dāng)滿足update_flag = false且 check_standby_f lag = true、ping_standby_f lag = true 的條件時會執(zhí)行切換。在一個實施例中,切換的前置條件(例如備庫是否可用、備庫與主庫的延時等)可以根據(jù)需要來進(jìn)行靈活配置,從而有效地控制主庫和備庫之間切換的時間。S3、執(zhí)行從所述主庫到所述備庫的切換。在一個實施例中,若滿足上述切換條件,則會執(zhí)行從所述主庫到所述備庫的切換,即將主庫關(guān)閉備庫打開。在一個實施例中,上述切換也可以由程序員手動進(jìn)行。在一個實施例中,在切換完成后主線程還需對新主庫的心跳表進(jìn)行驗證,并通過例如短信、郵件或日志等方式返回驗證結(jié)果以告知程序員更新成功與否,若更新失敗則需要通過程序員手動來進(jìn)行檢測;這里的更新驗證方法也是可以根據(jù)實際情況來靈活配置的。此外,上述步驟SI中還包括通過sockect客戶端直接和smartcluster (智能集群)主線程進(jìn)行通訊,直接執(zhí)行切換。在一個實施例中,對應(yīng)于本步驟,需要判斷從外部接收的命令是否為停止,如果是則根據(jù)接收到的指示直接執(zhí)行切換的外部命令;表示用戶已經(jīng)從外部發(fā)送了 switch (切換)命令給主線程,此時,主線程會直接停止每個子線程,待所有子線程推出后,主線程執(zhí)行主庫到備庫的切換操作,即將主庫關(guān)閉備庫打開。接續(xù),上述步驟S2中還包括所述主線程對所述socket監(jiān)聽子線程(用于接收外部命令)的返回進(jìn)行循環(huán)檢測,并在所述socket監(jiān)聽子線程的返回內(nèi)容是“switch”時繼續(xù)上述步驟S3。接續(xù),上述步驟S3具體包括首先,關(guān)閉所述主庫并啟動所述備庫。主線程會根據(jù)服務(wù)標(biāo)簽(service tag,這是服務(wù)器的一個唯一標(biāo)識)獲取主庫所在服務(wù)器的帶外管理IP,通過帶外管理IP可以調(diào)用ipmi協(xié)議直接對主庫下電,從而保證主庫資源(例如服務(wù)IP、共享存儲等)全部被釋放(通過ipmi協(xié)議可確認(rèn)主庫所在主機(jī)是否下電成功)即表示關(guān)閉主庫操作成功。在一個實施例中,通過運行ha_script腳本來啟用備庫,使其成為新主庫;具體而言,首先,根據(jù)smartcluster配置文件中的standby_cmd配置項生成切換腳本,在原備庫中運行例如recover、failover over等操作;其次,根據(jù)primary_cmd生成在新主庫中運行的腳本。經(jīng)過上述步驟,已經(jīng)成功實現(xiàn)了從主庫到備庫的切換,也就是說,用戶已經(jīng)可以使用新主庫(原備庫)來讀取數(shù)據(jù)等。其次,將所述原主庫所在服務(wù)器的服務(wù)IP賦給所述原備庫(即新主庫)所在服務(wù)器。這里,服務(wù)IP是指在線上環(huán)境,應(yīng)用會通過服務(wù)IP訪問數(shù)據(jù)庫,例如主庫服務(wù)器 A 的 IP 為 192. 168. 0. 1,備庫服務(wù)器 B 的 IP 為 192. 168. 0. 2,服務(wù) IP 為 192. 168. 0. 3 ;當(dāng)主庫是好的時候,服務(wù)IP在服務(wù)器A上,應(yīng)用會通過服務(wù)IP192. 168. 0.3訪問數(shù)據(jù)庫,當(dāng)發(fā)生問題切換之后,數(shù)據(jù)庫切換到服務(wù)器B,為了做到對應(yīng)用透明切換,需要把服務(wù)IP192. 168. 0. 3賦到服務(wù)器B上,這樣應(yīng)用依然通過服務(wù)IP192. 168. 0. 3訪問數(shù)據(jù)庫,但是實際上數(shù)據(jù)庫已經(jīng)切換到服務(wù)器B 了。在一個實施例中,當(dāng)主庫被關(guān)閉而備庫被啟動后,主線程會將原主庫所在服務(wù)器的服務(wù)IP賦給備庫所在服務(wù)器,賦值成功后,主線程會再發(fā)起一次對新主庫的更新操作,如果更新操作成功,則表示切換成功,新主庫可用,也就是說,用戶可以從備庫中讀取所需的數(shù)據(jù)。此外,在一個實施例中,當(dāng)對心跳表和備庫進(jìn)行更新時可能存在某一時間間隔內(nèi)更新成功,而另一時間間隔內(nèi)更新失敗或被夯住,但在下一時間間隔內(nèi)又更新成功的情況,為了及時準(zhǔn)確的監(jiān)控數(shù)據(jù)庫狀態(tài),需要對心跳表和備庫更新中是否有夯住的僵尸數(shù)組進(jìn)行判斷;具體而言,例如,預(yù)先設(shè)置主線程每隔預(yù)定時間間隔(如30秒)會對主庫心跳表發(fā)起一次更新檢測,當(dāng)檢測失敗的累積連續(xù)失敗次數(shù)超過預(yù)設(shè)值后(如4次)開始報警,當(dāng)累積連續(xù)失敗次數(shù)超過極限值(如16次)后,將update_flag的值置為“false”,此時認(rèn)為主庫不可用;假設(shè)當(dāng)預(yù)定時間間隔內(nèi)檢測失敗的累積連續(xù)失敗次數(shù)在第6次和第7次時均檢測超時,此時由于進(jìn)程處于夯住狀態(tài)因而沒有返回值;若當(dāng)預(yù)定時間間隔內(nèi)檢測失敗的累積連續(xù)失敗次數(shù)在第8次時檢測成功,則表示主庫可用,此時會按照如上所述的步驟繼續(xù)執(zhí)行;因此,在預(yù)設(shè)值(如4次)到極限值(如16次)之間可能會有很多數(shù)組(即僵尸數(shù)組)被夯住,盡管這些被夯住的僵尸數(shù)組可能不會影響進(jìn)程的執(zhí)行,但對程序員來說還需要對這些僵尸數(shù)組進(jìn)行監(jiān)控,如果有被夯住的僵尸數(shù)組,則需執(zhí)行下一步操作。接續(xù),在一個實施例中,如上所述,當(dāng)有僵尸數(shù)組被夯住時需要對夯住的僵尸數(shù)組(例如夯住數(shù)量等)進(jìn)行存儲及監(jiān)控,并以日志的方式進(jìn)行記錄;當(dāng)僵尸數(shù)組的數(shù)量達(dá)到或超過一定閾值時,系統(tǒng)便會通過短信、郵件、日志等方式進(jìn)行報警,從而使程序員可以第一時間了解程序運行的情況,并根據(jù)日志記載的內(nèi)容來及時對系統(tǒng)進(jìn)行維護(hù)。綜上所述,本實施例的集群系統(tǒng)應(yīng)用方法將心跳表的更新的成功與否作為判斷數(shù)據(jù)庫是否可用的標(biāo)準(zhǔn),使得在判斷上更加準(zhǔn)確;通過對切換條件的靈活配置,例如提供多個配置項或根據(jù)需要設(shè)置多種切換的前置條件(例如備用庫是否可用、與主數(shù)據(jù)庫的延時等),可以有效地控制主庫和備庫之間切換的時間;在切換完成后還會對新主庫進(jìn)行更新操作,以判斷切換是否成功;此外,本申請是采用Python語言來實現(xiàn)的,因此,不存在任何許可的問題。圖2為本申請數(shù)據(jù)庫高可用實現(xiàn)裝置的實施例結(jié)構(gòu)框圖。如圖所示,本實施例的一種數(shù)據(jù)庫高可用實現(xiàn)裝置,應(yīng)用于包括主庫和備庫的數(shù)據(jù)庫中,該裝置包括主線程模塊11及切換模塊12,還包括心跳表子線程模塊111,用于判斷主庫的心跳表是否更新失??;備庫子線程模塊112,用于判斷備庫是否可用;網(wǎng)關(guān)子線程模塊113,用于判斷主庫和備庫分別所在服務(wù)器的網(wǎng)關(guān)是否可用;主線程模塊11對心跳表子線程模塊111、備庫子線程模塊112和網(wǎng)關(guān)子線程模塊113的判斷結(jié)果進(jìn)行循環(huán)檢測,并且在心跳表子線程模塊111、備庫子線程模塊112和網(wǎng)關(guān)子線程模塊113的判斷結(jié)果均為是時通知切換模塊12執(zhí)行從主庫到備庫的切換。在一個實施例中,數(shù)據(jù)庫高可用實現(xiàn)裝置主要通過對心跳表子線程模塊111、備庫子線程模塊112及網(wǎng)關(guān)子線程模塊113的判斷結(jié)果進(jìn)行循環(huán)檢測,并在判斷結(jié)果均為是時通知切換模塊12執(zhí)行從主庫到備庫的切換。具體而言,在一個實施例中,心跳表子線程模塊111包括主庫訪問檢測單元1111,用于檢測主庫是否可以訪問,如果不能訪問則直接判斷主庫的心跳表更新失?。恢鲙旄聠卧?112,用于在主庫訪問檢測單元1111檢測到主庫可以訪問時,按預(yù)設(shè)的心跳表更新時間間隔對主庫的心跳表進(jìn)行更新,如果能夠在心跳表更新時間間隔內(nèi)完成更新,則判斷主庫的心跳表更新成功;以及主庫更新判斷單元1113,用于判斷心跳表更新時間間隔內(nèi)未完成更新的累積次數(shù)是否超過預(yù)設(shè)的心跳表更新連續(xù)失敗次數(shù),如果是則判斷主庫的心跳表更新失敗,否則通知主庫更新單元1112繼續(xù)進(jìn)行更新。在一個實施例中,心跳表子線程模塊111每隔一定的心跳表更新時間間隔update_interval會對主庫訪問檢測單元1111進(jìn)行循環(huán)檢測,并根據(jù)檢測到的update_flag的值來判斷主庫是否可用;若心跳表更新失敗則將update_flag的值置為“false” ;當(dāng)update_flag = false時,表示主庫不可用,此時可以進(jìn)行切換;反之,當(dāng)update_flag=true時,則表示主庫可用,此時不可以進(jìn)行切換;在一個實施例中,心跳表更新時間間隔update_interval的值可以根據(jù)情況進(jìn)行靈活配置,例如可設(shè)置為2秒、10秒或30秒等
坐寸o在一個實施例中,當(dāng)判斷主庫可用時,主庫更新單元1112會按預(yù)設(shè)的心跳表更新時間間隔對主庫的心跳表進(jìn)行更新。在一個實施例中,由于網(wǎng)絡(luò)的抖動等原因,可能導(dǎo)致心跳表的某一次更新失敗或者超時,因此,需要通過主庫更新判斷單元1113來對在心跳表更新時間間隔內(nèi)更新失敗的累積次數(shù)是否超過預(yù)設(shè)的心跳表更新連續(xù)失敗次數(shù)進(jìn)行判斷。例如,當(dāng)心跳表更新時間間隔內(nèi)更新失敗的累積次數(shù)超過update_error_alarm_count的值后會通過短信、郵件等方式開始報警;當(dāng)累積連續(xù)失敗次數(shù)超過update_error_count的值之后,再將update—flag的值置為“false”,即update_flag = false,此時認(rèn)為主庫不可用;在一個實施例中,update_error_alarm_count的值和update_error_count的值可根據(jù)情況進(jìn)行靈活配置的,例如update_error_alarm_count 的值可設(shè)置為 3 次、4 次或 6 次等,update_error_count的值可設(shè)置為10次、16次或20次等;優(yōu)選地,將update_error_alarm_count的值設(shè)置為小于 update_error_count 的值。接續(xù),在一個實施例中,備庫子線程模塊112還包括備庫訪問檢測單元1121,用于檢測備庫是否可以訪問,如果可以訪問則判斷備庫可用,如果不可以訪問則判斷備庫不可用;備庫數(shù)據(jù)判斷單元1122,用于判斷備庫中的數(shù)據(jù)是否與主庫中的數(shù)據(jù)一致,如果是則判斷備庫可用,如果否則判斷備庫不可用。在一個實施例中,備庫訪問檢測單元1121每隔一定的檢測備庫時間間隔check_standby_interval會對備庫進(jìn)行循環(huán)檢測,并根據(jù)檢測到的check_standby_flag的值來判斷備庫是否可用;若檢測備庫可用,則將check_standby_flag的值置為“true” ;進(jìn)一步而言,當(dāng)check_standby_flag = true時,表示備庫可用,此時可以進(jìn)行切換;反之,當(dāng)check_standby_flag = false時,則表示備庫不可用,此時不可以進(jìn)行切換;在一個實施例中,檢測備庫時間間隔check_standby_interval的值可根據(jù)情況進(jìn)行靈活配置,例如可設(shè)置為2秒、10秒或30秒等等;在一個實施例中,若檢測備庫超時check_sandby_timeout的值超過預(yù)設(shè)的檢測備庫時間間隔check_sandby_interval的值而不返回結(jié)果則表示超時,認(rèn)為檢測備庫是否可用的操作失敗一次;需要注意的是,備庫針對主庫的延時不能超過檢測備庫閾值 check_standby_thresho I d。在一個實施例中,由于網(wǎng)絡(luò)的抖動等原因,可能導(dǎo)致某一次的備庫檢測失敗,因此,需要通過備庫數(shù)據(jù)判斷單元1122來對在檢測備庫時間間隔內(nèi)更新失敗的累積次數(shù)是否超過預(yù)設(shè)的備庫更新連續(xù)失敗次數(shù)進(jìn)行判斷;例如,當(dāng)檢測備庫時間間隔內(nèi)檢測失敗的累積連續(xù)失敗次數(shù)超過check_standby_error_alarm_count的值后會通過短信、郵件等方式開始報警;當(dāng)累積連續(xù)失敗次數(shù)超過check—standby—error—count的值之后,再將check—standby—flag 的值置為 “false”,即 check—standby—flag = false,此時認(rèn)為備庫不可用;在一個實施例中,check—standby—error—alarm—count 的值和 check—standby—error—count的值可根據(jù)情況進(jìn)行靈活配置的,例如check—standby_ _error_alarm_count的值可設(shè)置為3次、4次或6次等,check_standby_error_count的值可設(shè)置為10次、16次或 20 次等;優(yōu)選地,將 check_standby_error_alarm_count 的值設(shè)為小于 check_standby_error_count 的值。在一個實施例中,備庫子線程模塊112還包括數(shù)據(jù)同步單元1123,用于將備庫中的數(shù)據(jù)與主庫中的數(shù)據(jù)進(jìn)行同步,之后返回備庫數(shù)據(jù)判斷單元1122繼續(xù)檢測。接續(xù),在一個實施例中,網(wǎng)關(guān)子線程模塊113還包括網(wǎng)關(guān)檢測單元1131,用于按預(yù)設(shè)的檢測網(wǎng)關(guān)時間間隔,分別對主庫和備庫所在服務(wù)器的網(wǎng)關(guān)是否可連通進(jìn)行檢測,如果是則判斷網(wǎng)關(guān)可用,如果否則判斷網(wǎng)關(guān)不可用;以及網(wǎng)關(guān)更新判斷單元1132,用于判斷檢測網(wǎng)關(guān)時間間隔內(nèi)網(wǎng)關(guān)不可用的累積次數(shù)是否超過預(yù)設(shè)的網(wǎng)關(guān)不可用連續(xù)失敗次數(shù),如果否則判斷網(wǎng)關(guān)可用,如果是則判斷網(wǎng)關(guān)不可用。在一個實施例中,網(wǎng)關(guān)檢測單元1131每隔一定的檢測網(wǎng)關(guān)時間間隔check_gateway_interval會對網(wǎng)關(guān)進(jìn)行循環(huán)檢測,并根據(jù)檢測到的ping_standby_flag的值來判斷主庫和備庫所在服務(wù)器的網(wǎng)關(guān)是否可用;若檢測網(wǎng)關(guān)可用,則將ping_Standby_flag的值設(shè)置為“true” ;具體而言,當(dāng)ping_standby_flag = false時,表示網(wǎng)關(guān)不可用,此時不可以進(jìn)行切換;反之,當(dāng)ping_standby_flag = true時,貝U表示網(wǎng)關(guān)可用,此時可以進(jìn)行切換;在一個實施例中,檢測網(wǎng)關(guān)時間間隔check_gateway_interval的值可根據(jù)情況進(jìn)行靈活配置,例如可設(shè)置為5秒、10秒或30秒等等。在一個實施例中,由于網(wǎng)絡(luò)的抖動等原因,可能導(dǎo)致某一次的檢測網(wǎng)關(guān)失敗,因此,需要通過網(wǎng)關(guān)更新判斷單元1132來對在檢測網(wǎng)關(guān)時間間隔內(nèi)網(wǎng)關(guān)不可用的累積次數(shù)是否超過預(yù)設(shè)的網(wǎng)關(guān)不可用連續(xù)失敗次數(shù)進(jìn)行判斷;例如,當(dāng)檢測網(wǎng)關(guān)時間間隔內(nèi)檢測失敗的累積連續(xù)失敗次數(shù)超過check_gateway_error_alarm_count的值之后會通過短信、郵件等方式開始報警;當(dāng)累積連續(xù)失敗次數(shù)超過check_gateway_error_count的值之后,再將 ping_standby_flag 的值置為 “false”,即 ping_standby_flag = false,此時認(rèn)為網(wǎng)關(guān)不可用;在一個實施例中,check_gateway_error_alarm_count 的值和 check_gateway_error_count的值可根據(jù)情況進(jìn)行靈活配置,例如check_gateway_ _error_alarm_count 的值可設(shè)置為10次、18次或25次等,update_error_count的值可設(shè)置為50次、60次或70次等;優(yōu)選地,將 check_gateway_error_alarm_count 的值設(shè)置為小于 check_gateway_error_count 的值。接續(xù),在一個實施例中,數(shù)據(jù)庫高可用實現(xiàn)裝置還包括外部命令子線程模塊13,用于判斷是否接收到指示直接執(zhí)行切換的外部命令;主線程模塊11在循環(huán)檢測中加入對外部命令子線程模塊13的判斷結(jié)果的檢測,并在外部命令子線程模塊13的判斷結(jié)果為是時執(zhí)行從主庫到備庫的切換。在一個實施例中,外部命令子線程模塊13主要有以下兩個作用,一是在預(yù)設(shè)的時間間隔對判斷結(jié)果進(jìn)行循環(huán)檢測,若接收到來自外部的命令(例如停止、中止循環(huán)等)時,外部命令子線程模塊13會進(jìn)行判斷,若判斷從外部接收的命令為“停止”命令,則外部命令子線程模塊13會將判斷結(jié)果的值設(shè)置為“false”,此時,外部命令子線程模塊13停止數(shù)據(jù)庫高可用實現(xiàn)裝置對其他子模塊的檢測,而直接執(zhí)行從主庫到備庫的切換,即將主庫關(guān)閉備庫打開;二是實現(xiàn)進(jìn)程通訊,即通過連接(socket)端口和外部進(jìn)程進(jìn)行通訊以實現(xiàn)遠(yuǎn)程管理。接續(xù),在一個實施例中,切換模塊12包括上電下電單元模塊121,用于關(guān)閉主庫并啟動備庫;以及IP賦值單元122,用于將主庫所在服務(wù)器的IP賦給備庫所在服務(wù)器。在一個實施例中,由于并未給新主庫(即原備庫)分配相應(yīng)的IP,因此主線程仍無法訪問到新主庫,故此時打開的備庫是不可用的。為了真正實現(xiàn)從主庫到備庫的切換,接下來,上電下電單元模塊121會對原主庫是否真正被關(guān)閉進(jìn)行檢測,根據(jù)服務(wù)標(biāo)簽(servicetag,這是服務(wù)器的一個唯一標(biāo)識)獲取主庫所在服務(wù)器的帶外管理IP,通過帶外管理IP可以調(diào)用ipmi協(xié)議直接對主庫下電,從而保證主庫資源(例如服務(wù)IP、共享存儲等)全部被釋放,當(dāng)確認(rèn)主庫已經(jīng)下電后,即表示關(guān)閉主庫操作成功。此外,在一個實施例中,上電下電單元模塊121還會通過運行ha_script腳本來啟用備庫,使其成為新主庫;具體而言,首先,根據(jù)sandby_cmd生成腳本,在原備庫中運行例如recover、switch over等操作;其次,根據(jù)primary_cmd生成在新主庫中運行的腳本。經(jīng)過上述步驟,已經(jīng)成功實現(xiàn)了從主庫到備庫的切換,也就是說,用戶已經(jīng)可以使用新主庫(原備庫)來讀取數(shù)據(jù)等。在一個實施例中,當(dāng)確定主庫被關(guān)閉而備庫被啟動后,IP賦值單元122會將原主庫所在服務(wù)器的服務(wù)IP賦給備庫所在服務(wù)器。接續(xù),在一個實施例中,數(shù)據(jù)庫高可用實現(xiàn)裝置還包括僵尸數(shù)組判斷模塊(未示出),用于判斷在心跳表和備庫更新中是否有夯住的僵尸數(shù)組;以及僵尸數(shù)組監(jiān)控模塊(未示出),用于存儲并監(jiān)控在心跳表和備庫更新中夯住的僵尸數(shù)組的數(shù)量。在一個實施例中,僵尸數(shù)組判斷模塊會對心跳表和備庫更新中夯住的僵尸數(shù)組進(jìn)行判斷;具體而言,例如,預(yù)先設(shè)置主線程模塊11每隔預(yù)定時間間隔(如30秒)會對主庫心跳表發(fā)起一次更新檢測,當(dāng)檢測失敗的累積連續(xù)失敗次數(shù)超過預(yù)設(shè)值后(如4次)開始報警,當(dāng)累積連續(xù)失敗次數(shù)超過極限值(如16次)后,將update_flag的值置為“false”,此時認(rèn)為主庫不可用;假設(shè)當(dāng)預(yù)定時間間隔內(nèi)檢測失敗的累積連續(xù)失敗次數(shù)在第6次和第7次時均檢測超時,此時由于進(jìn)程處于夯住狀態(tài)因而沒有返回值;若當(dāng)預(yù)定時間間隔內(nèi)檢測失敗的累積連續(xù)失敗次數(shù)在第8次時檢測成功,則表示主庫可用,此時會按照如上所述的步驟繼續(xù)執(zhí)行;因此,在預(yù)設(shè)值(如4次)到極限值(如16次)之間可能會有很多數(shù)組(即僵尸數(shù)組)被夯住,盡管這些被夯住的僵尸數(shù)組可能不會影響進(jìn)程的執(zhí)行,但對程序員來說還需要對這些僵尸數(shù)組進(jìn)行監(jiān)控作。接續(xù),在一個實施例中,當(dāng)有僵尸數(shù)組被夯住時,通過僵尸數(shù)組監(jiān)控模塊對夯住的僵尸數(shù)組(例如夯住數(shù)量等)進(jìn)行存儲及監(jiān)控,并以日志的方式進(jìn)行記錄;當(dāng)僵尸數(shù)組的數(shù)量達(dá)到或超過一定閾值時,系統(tǒng)便會通過短信、郵件、日志等方式進(jìn)行報警,從而使程序員可以第一時間了解程序運行的情況,并根據(jù)日志記載的內(nèi)容來及時對系統(tǒng)進(jìn)行維護(hù)。由上述技術(shù)方案可知,本實施例的數(shù)據(jù)庫裝置相對于現(xiàn)有技術(shù)的集群系統(tǒng)具有結(jié)構(gòu)簡單、配置靈活等特點,通過各個模塊之間的巧妙結(jié)合能夠很容易地實現(xiàn)從主庫到備庫的自動切換。
雖然已參照典型實施例描述了本申請,但應(yīng)當(dāng)理解,所用的術(shù)語是說明和示例性、而非限制性的術(shù)語。由于本申請能夠以多種形式具體實施而不脫離發(fā)明的精神或?qū)嵸|(zhì),所以應(yīng)當(dāng)理解,上述實施例不限于任何前述的細(xì)節(jié),而應(yīng)在隨附權(quán)利要求所限定的精神和范圍內(nèi)廣泛地解釋,因此落入權(quán)利要求或其等效范圍內(nèi)的全部變化和改型都應(yīng)為隨附權(quán)利要求所涵蓋。
權(quán)利要求
1.一種數(shù)據(jù)庫高可用實現(xiàn)方法,應(yīng)用于包括主庫和備庫的數(shù)據(jù)庫中,該方法包括以下步驟 51、設(shè)置心跳表子線程來判斷所述主庫的心跳表是否更新失敗,設(shè)置備庫子線程來判斷所述備庫是否可用,設(shè)置網(wǎng)關(guān)子線程來判斷所述主庫和所述備庫分別所在服務(wù)器的網(wǎng)關(guān)是否可用; 52、設(shè)置主線程對所述心跳表子線程、所述備庫子線程和所述網(wǎng)關(guān)子線程的判斷結(jié)果進(jìn)行循環(huán)檢測,在所述心跳表子線程、所述備庫子線程和所述網(wǎng)關(guān)子線程的判斷結(jié)果均為是時繼續(xù)步驟S3 ; 53、執(zhí)行從所述主庫到所述備庫的切換。
2.根據(jù)權(quán)利要求1所述的數(shù)據(jù)庫高可用實現(xiàn)方法,所述步驟SI中判斷所述主庫的心跳表是否更新失敗具體包括 Sm.檢測所述主庫是否可以訪問,如果是則繼續(xù)步驟S112,否則轉(zhuǎn)步驟S114; 5112.按預(yù)設(shè)的心跳表更新時間間隔對所述主庫的心跳表進(jìn)行更新,如果在所述心跳表更新時間間隔內(nèi)完成更新則轉(zhuǎn)步驟S115,否則繼續(xù)步驟S113 ; 5113.判斷所述心跳表更新時間間隔內(nèi)未完成更新的累積連續(xù)失敗次數(shù)是否超過預(yù)設(shè)的心跳表更新連續(xù)失敗次數(shù),如果是則繼續(xù)步驟S114,否則返回步驟S112 ; 5114.判斷所述主庫的心跳表更新失敗; 5115.判斷所述主庫的心跳表更新成功。
3.根據(jù)權(quán)利要求1所述的數(shù)據(jù)庫高可用實現(xiàn)方法,所述步驟SI中判斷所述備庫是否可用具體包括 5121.檢測所述備庫是否可以訪問,如果是則繼續(xù)步驟S122,否則轉(zhuǎn)步驟S124; 5122.檢測所述備庫中的數(shù)據(jù)是否與所述主庫中的數(shù)據(jù)一致,如果是則繼續(xù)步驟S123,否則轉(zhuǎn)步驟S124 ; 5123.判斷所述備庫可用; 5124.判斷所述備庫不可用。
4.根據(jù)權(quán)利要求3所述的數(shù)據(jù)庫高可用實現(xiàn)方法,所述步驟S124之后還包括 5125.將所述備庫中的數(shù)據(jù)與所述主庫中的數(shù)據(jù)進(jìn)行同步,之后返回步驟S122繼續(xù)檢測。
5.根據(jù)權(quán)利要求1所述的數(shù)據(jù)庫高可用實現(xiàn)方法,所述步驟SI中判斷所述主庫和所述備庫分別所在服務(wù)器的網(wǎng)關(guān)是否可用具體包括 5131.按預(yù)設(shè)的檢測網(wǎng)關(guān)時間間隔,分別對所述主庫和所述備庫所在服務(wù)器的網(wǎng)關(guān)是否可連通進(jìn)行檢測,如果是則繼續(xù)步驟S132,否則轉(zhuǎn)步驟S134 ; 5132.判斷檢測網(wǎng)關(guān)時間間隔內(nèi)所述網(wǎng)關(guān)不可用的累積連續(xù)失敗次數(shù)是否超過預(yù)設(shè)的網(wǎng)關(guān)不可用連續(xù)失敗次數(shù),如果否則繼續(xù)步驟S133,否則轉(zhuǎn)步驟S134 ; 5133.判斷所述網(wǎng)關(guān)可用; 5134.判斷所述網(wǎng)關(guān)不可用。
6.根據(jù)權(quán)利要求1所述的數(shù)據(jù)庫高可用實現(xiàn)方法,所述步驟SI中還包括設(shè)置外部命令子線程來判斷是否接收到指示直接執(zhí)行切換的外部命令; 所述步驟S2中還包括所述主線程對所述外部命令子線程的判斷結(jié)果進(jìn)行循環(huán)檢測,并在所述外部命令子線程的判斷結(jié)果為是時繼續(xù)所述步驟S3。
7.根據(jù)權(quán)利要求1所述的數(shù)據(jù)庫高可用實現(xiàn)方法,所述步驟S3具體包括 5311.關(guān)閉所述主庫并啟動所述備庫; 5312.將所述主庫所在服務(wù)器的IP賦給所述備庫所在服務(wù)器。
8.一種數(shù)據(jù)庫高可用實現(xiàn)裝置,應(yīng)用于包括主庫和備庫的數(shù)據(jù)庫中,該裝置包括主線程模塊及切換模塊,還包括 心跳表子線程模塊,用于判斷所述主庫的心跳表是否更新失?。? 備庫子線程模塊,用于判斷所述備庫是否可用;網(wǎng)關(guān)子線程模塊,用于判斷所述主庫和所述備庫分別所在服務(wù)器的網(wǎng)關(guān)是否可用;所述主線程模塊對所述心跳表子線程模塊、所述備庫子線程模塊和所述網(wǎng)關(guān)子線程模塊的判斷結(jié)果進(jìn)行循環(huán)檢測,并且在所述心跳表子線程模塊、所述備庫子線程模塊和所述網(wǎng)關(guān)子線程模塊的判斷結(jié)果均為是時通知所述切換模塊執(zhí)行從所述主庫到所述備庫的切換。
9.根據(jù)權(quán)利要求8所述的數(shù)據(jù)庫高可用實現(xiàn)裝置,其中,所述心跳表子線程模塊包括 主庫訪問檢測單元,用于檢測所述主庫是否可以訪問,如果不能訪問則直接判斷所述主庫的心跳表更新失??; 主庫更新單元,用于在所述主庫訪問檢測單元檢測到所述主庫可以訪問時,按預(yù)設(shè)的心跳表更新時間間隔對所述主庫的心跳表進(jìn)行更新,如果能夠在所述心跳表更新時間間隔內(nèi)完成更新,則判斷所述主庫的心跳表更新成功;以及 主庫更新判斷單元,用于判斷所述心跳表更新時間間隔內(nèi)未完成更新的累積連續(xù)失敗次數(shù)是否超過預(yù)設(shè)的心跳表更新連續(xù)失敗次數(shù),如果是則判斷所述主庫的心跳表更新失敗,否則通知所述主庫更新單元繼續(xù)進(jìn)行更新。
10.根據(jù)權(quán)利要求8所述的數(shù)據(jù)庫高可用實現(xiàn)裝置,其中,所述備庫子線程模塊包括 備庫訪問檢測單元,用于檢測所述備庫是否可以訪問,如果可以訪問則判斷所述備庫可用,如果不可以訪問則判斷所述備庫不可用;以及 備庫數(shù)據(jù)判斷單元,用于判斷所述備庫中的數(shù)據(jù)是否與所述主庫中的數(shù)據(jù)一致,如果是則判斷所述備庫可用,如果否則判斷所述備庫不可用。
11.根據(jù)權(quán)利要求10所述的數(shù)據(jù)庫高可用實現(xiàn)裝置,其中,所述備庫子線程模塊還包括 數(shù)據(jù)同步單元,用于將所述備庫中的數(shù)據(jù)與所述主庫中的數(shù)據(jù)進(jìn)行同步,之后返回所述備庫數(shù)據(jù)判斷單元繼續(xù)檢測。
12.根據(jù)權(quán)利要求8所述的數(shù)據(jù)庫高可用實現(xiàn)裝置,其中,所述網(wǎng)關(guān)子線程模塊還包括 網(wǎng)關(guān)檢測單元,用于按預(yù)設(shè)的檢測網(wǎng)關(guān)時間間隔,分別對所述主庫和所述備庫所在服務(wù)器的網(wǎng)關(guān)是否可連通進(jìn)行檢測,如果是則判斷所述網(wǎng)關(guān)可用,如果否則判斷所述網(wǎng)關(guān)不可用;以及 網(wǎng)關(guān)更新判斷單元,用于判斷檢測網(wǎng)關(guān)時間間隔內(nèi)所述網(wǎng)關(guān)不可用的累積連續(xù)失敗次數(shù)是否超過預(yù)設(shè)的網(wǎng)關(guān)不可用連續(xù)失敗次數(shù),如果否則判斷所述網(wǎng)關(guān)可用,如果是則判斷所述網(wǎng)關(guān)不可用。
13.根據(jù)權(quán)利要求8所述的數(shù)據(jù)庫高可用實現(xiàn)裝置,其中,所述裝置還包括外部命令子線程模塊,用于判斷是否接收到指示直接執(zhí)行切換的外部命令; 所述主線程模塊在所述循環(huán)檢測中加入對所述外部命令子線程模塊的判斷結(jié)果的檢測,并在所述外部命令子線程模塊的判斷結(jié)果為是時執(zhí)行從所述主庫到所述備庫的切換。
14.根據(jù)權(quán)利要求8所述的數(shù)據(jù)庫高可用實現(xiàn)裝置,其中,所述切換模塊包括 上電下電單元模塊,用于關(guān)閉所述主庫并啟動所述備庫;以及 IP賦值單元,用于將所述主庫所在服務(wù)器的IP賦給所述備庫所在服務(wù)器。
全文摘要
本申請涉及一種數(shù)據(jù)庫高可用實現(xiàn)方法及其裝置,該方法包括以下步驟S1、設(shè)置心跳表子線程來判斷主庫的心跳表是否更新失敗,設(shè)置備庫子線程來判斷備庫是否可用,設(shè)置網(wǎng)關(guān)子線程來判斷主庫和備庫分別所在服務(wù)器的網(wǎng)關(guān)是否可用;S2、設(shè)置主線程對心跳表子線程、備庫子線程和網(wǎng)關(guān)子線程的判斷結(jié)果進(jìn)行循環(huán)檢測,在心跳表子線程、備庫子線程和網(wǎng)關(guān)子線程的判斷結(jié)果均為是時繼續(xù)步驟S3;S3、執(zhí)行從主庫到備庫的切換。本申請將心跳表更新的成功與否作為判斷數(shù)據(jù)庫是否可用的標(biāo)準(zhǔn);通過備庫是否可用(備庫延時是否滿足要求,備庫是否可以訪問等等)作為備庫是否可以用來切換的標(biāo)準(zhǔn);通過對切換條件的靈活配置有效地控制主庫和備庫之間的切換。
文檔編號G06F9/46GK103064860SQ201110324138
公開日2013年4月24日 申請日期2011年10月21日 優(yōu)先權(quán)日2011年10月21日
發(fā)明者熊中哲, 呂海波, 張瑞 申請人:阿里巴巴集團(tuán)控股有限公司