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