本發(fā)明涉及數(shù)據(jù)庫技術(shù)領(lǐng)域,特別是涉及一種數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控的方法以及裝置。
背景技術(shù):
隨著網(wǎng)站業(yè)務(wù)的發(fā)展進(jìn)步,用戶數(shù)量以及數(shù)據(jù)量也在不斷地增加,從而導(dǎo)致數(shù)據(jù)庫的訪問量也呈線性地增長。
為了應(yīng)對(duì)日益增長的訪問量,數(shù)據(jù)庫主從同步架構(gòu)廣泛應(yīng)用于大型網(wǎng)站系統(tǒng)。例如,MYSQL主從同步架構(gòu),其中MySam引擎負(fù)責(zé)新增、修改、刪除等操作,InnoDB引擎負(fù)責(zé)查詢。數(shù)據(jù)庫主從同步架構(gòu)可以是指設(shè)立有主從兩個(gè)數(shù)據(jù)庫,主從數(shù)據(jù)庫之間的信息狀態(tài)是同步的。
數(shù)據(jù)庫主從同步狀態(tài)是決定著數(shù)據(jù)庫在高并發(fā)負(fù)載下的性能好壞,因而數(shù)據(jù)庫主從同步狀態(tài)的監(jiān)控也就顯得尤為重要?,F(xiàn)有技術(shù)中的數(shù)據(jù)主從同步狀態(tài)的監(jiān)控方法一般是人為手動(dòng)地執(zhí)行結(jié)構(gòu)化查詢語句(Structured Query Language,SQL)語句,例如show、slave以及status\G等語句,然后檢查輸出結(jié)果中的Slave_IO_Running、Slave_SQL_Running以及Seconds_Behind_Master等三個(gè)參數(shù)值,最后人工判斷數(shù)據(jù)庫主從同步狀態(tài)是否正常。但是,由于數(shù)據(jù)庫主從同步狀態(tài)的監(jiān)控是人工完成的,在進(jìn)行檢測(cè)時(shí),需要運(yùn)維人員逐一登錄每臺(tái)設(shè)備進(jìn)行檢查,而當(dāng)設(shè)備數(shù)量達(dá)至成百上千時(shí),工作量極大,進(jìn)而導(dǎo)致數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控效率較低。綜上所述,如何提高數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控效率是本領(lǐng)域亟待解決的問題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是提供一種數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控的方法以及裝置,目的在于解決現(xiàn)有技術(shù)中數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控效率較低的問題。
為解決上述技術(shù)問題,本發(fā)明提供一種數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控的方法,該方法包括:
調(diào)用第一編程函數(shù),自動(dòng)執(zhí)行預(yù)設(shè)結(jié)構(gòu)化查詢指令,得出執(zhí)行結(jié)果;
根據(jù)所述執(zhí)行結(jié)果,判斷數(shù)據(jù)庫的主從同步狀態(tài)是否正常。
可選地,在所述調(diào)用監(jiān)控函數(shù),自動(dòng)執(zhí)行預(yù)設(shè)結(jié)構(gòu)化查詢指令,得出執(zhí)行結(jié)果之前還包括:
調(diào)用第二編程函數(shù),測(cè)試所述數(shù)據(jù)庫的端口狀態(tài),判斷是否符合預(yù)設(shè)連接條件;
當(dāng)符合所述預(yù)設(shè)連接條件時(shí),則進(jìn)行后續(xù)步驟;
當(dāng)不符合所述預(yù)設(shè)連接條件時(shí),生成第一告警郵件,并將所述告警郵件發(fā)送至第一預(yù)設(shè)收件人。
可選地,所述當(dāng)不符合所述預(yù)設(shè)連接條件時(shí),生成第一告警郵件,并將所述告警郵件發(fā)送至第一預(yù)設(shè)收件人包括:
獲取所述數(shù)據(jù)庫的第一異常信息;
根據(jù)所述第一異常信息以及第一預(yù)設(shè)郵件模板,生成所述第一告警郵件;
將所述第一告警郵件發(fā)送至所述第一預(yù)設(shè)收件人。
可選地,在所述根據(jù)所述執(zhí)行結(jié)果,判斷數(shù)據(jù)庫的主從同步狀態(tài)是否正常之后還包括:
當(dāng)判斷出所述數(shù)據(jù)庫的主從同步狀態(tài)為正常時(shí),停止執(zhí)行監(jiān)控程序;
當(dāng)判斷出所述數(shù)據(jù)庫的主從同步狀態(tài)為異常時(shí),獲取所述數(shù)據(jù)庫的第二異常信息;
根據(jù)所述第二異常信息以及第二預(yù)設(shè)郵件模板,生成第二告警郵件;
將所述第二告警郵件發(fā)送至第二預(yù)設(shè)收件人。
可選地,在所述當(dāng)判斷出所述數(shù)據(jù)庫的主從同步狀態(tài)為正常時(shí),停止執(zhí)行監(jiān)控程序之后還包括:
在經(jīng)過預(yù)設(shè)周期之后,執(zhí)行所述監(jiān)控程序,對(duì)所述數(shù)據(jù)庫的主從同步狀態(tài)進(jìn)行監(jiān)控。
此外,本發(fā)明還提供了一種數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控的裝置,該裝置包括:
調(diào)用模塊,用于調(diào)用第一編程函數(shù),自動(dòng)執(zhí)行預(yù)設(shè)結(jié)構(gòu)化查詢指令,得出執(zhí)行結(jié)果;
第一判斷模塊,用于根據(jù)所述執(zhí)行結(jié)果,判斷數(shù)據(jù)庫的主從同步狀態(tài)是否正常。
可選地,還包括:
第二判斷模塊,用于調(diào)用第二編程函數(shù),測(cè)試所述數(shù)據(jù)庫的端口狀態(tài),判斷是否符合預(yù)設(shè)連接條件;
建立模塊,用于當(dāng)符合所述預(yù)設(shè)連接條件時(shí),則進(jìn)行后續(xù)步驟;
第一告警模塊,用于當(dāng)不符合所述預(yù)設(shè)連接條件時(shí),生成第一告警郵件,并將所述告警郵件發(fā)送至第一預(yù)設(shè)收件人。
可選地,所述第一告警模塊包括:
第一異常信息獲取單元,用于獲取所述數(shù)據(jù)庫的第一異常信息;
生成單元,用于根據(jù)所述第一異常信息以及第一預(yù)設(shè)郵件模板,生成所述第一告警郵件;
發(fā)送單元,用于將所述第一告警郵件發(fā)送至所述第一預(yù)設(shè)收件人。
可選地,還包括:
停止模塊,用于當(dāng)判斷出所述數(shù)據(jù)庫的主從同步狀態(tài)為正常時(shí),停止執(zhí)行監(jiān)控程序;
獲取模塊,用于當(dāng)判斷出所述數(shù)據(jù)庫的主從同步狀態(tài)為異常時(shí),獲取所述數(shù)據(jù)庫的第二異常信息;
生成模塊,用于根據(jù)所述第二異常信息以及第二預(yù)設(shè)郵件模板,生成第二告警郵件;
發(fā)送模塊,用于將所述第二告警郵件發(fā)送至第二預(yù)設(shè)收件人。
可選地,還包括:
定時(shí)執(zhí)行模塊,用于在經(jīng)過預(yù)設(shè)周期之后,執(zhí)行所述監(jiān)控程序,對(duì)所述數(shù)據(jù)庫的主從同步狀態(tài)進(jìn)行監(jiān)控。
本發(fā)明所提供的一種數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控的方法以及裝置,通過調(diào)用第一編程函數(shù),自動(dòng)執(zhí)行預(yù)設(shè)結(jié)構(gòu)化查詢指令,得出執(zhí)行結(jié)果;根據(jù)上述執(zhí)行結(jié)果,判斷數(shù)據(jù)庫的主從同步狀態(tài)是否正常。利用編程手段,自動(dòng)執(zhí)行結(jié)構(gòu)化查詢指令,對(duì)數(shù)據(jù)庫的主從同步狀態(tài)進(jìn)行監(jiān)控,相較于人工執(zhí)行結(jié)構(gòu)化查詢指令對(duì)數(shù)據(jù)庫的主從同步狀態(tài)進(jìn)行監(jiān)控,其自動(dòng)執(zhí)行結(jié)構(gòu)化查詢指令,使得數(shù)據(jù)庫的主從同步狀態(tài)的監(jiān)控效率較高,可見,本申請(qǐng)有利于提高數(shù)據(jù)庫主從同步狀態(tài)的監(jiān)控效率。
附圖說明
為了更清楚的說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單的介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明實(shí)施例所提供的數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控方法的一種具體實(shí)施方式的流程示意圖;
圖2為本發(fā)明實(shí)施例所提供的數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控裝置的結(jié)構(gòu)框圖。
具體實(shí)施方式
為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明方案,下面結(jié)合附圖和具體實(shí)施方式對(duì)本發(fā)明作進(jìn)一步的詳細(xì)說明。顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
由于數(shù)據(jù)庫以及所使用的編程語言的不同,實(shí)現(xiàn)數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控的方式也會(huì)有所不同,故在下文將以數(shù)據(jù)為MYSQL數(shù)據(jù)庫,編程語言為Python的場(chǎng)景下進(jìn)行介紹說明。顯而易見地,當(dāng)數(shù)據(jù)庫的類型不同,或者是所使用腳本語言的不同時(shí),具體實(shí)現(xiàn)方式也與本發(fā)明實(shí)施例的思想一致,即也落在本發(fā)明實(shí)施例的保護(hù)范圍內(nèi)。
請(qǐng)參見圖1,圖1為本發(fā)明實(shí)施例所提供的數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控方法的一種具體實(shí)施方式的流程示意圖,該方法包括以下步驟:
步驟101:調(diào)用第一編程函數(shù),自動(dòng)執(zhí)行預(yù)設(shè)結(jié)構(gòu)化查詢指令,得出執(zhí)行結(jié)果。
需要說明的是,上述第一編程函數(shù)可以是指Python語言的is Slave函數(shù),其可以數(shù)據(jù)庫自動(dòng)執(zhí)行相應(yīng)的結(jié)構(gòu)化查詢指令,以對(duì)數(shù)據(jù)的主從同步狀態(tài)進(jìn)行監(jiān)控,即利用該函數(shù),可以監(jiān)控?cái)?shù)據(jù)庫的主從同步狀態(tài)。
上述預(yù)設(shè)結(jié)構(gòu)化查詢指令可以是指SQL語句,例如,可以為show、slave以及status\G等SQL語句。其可以根據(jù)數(shù)據(jù)庫的主從同步狀態(tài),得出相應(yīng)的參數(shù)值,根據(jù)該參數(shù)值,可以判斷出數(shù)據(jù)庫的主從同步狀態(tài)是否正常。
上述執(zhí)行結(jié)果可以是指執(zhí)行SQL語句后,得出的參數(shù)值,例如,當(dāng)執(zhí)行的是show、slave以及status\G三個(gè)SQL語句時(shí),輸出結(jié)果為Slave_IO_Running、Slave_SQL_Running以及Seconds_Behind_Master三個(gè)參數(shù)值,這三個(gè)參數(shù)值即為執(zhí)行結(jié)果。
具體地,運(yùn)行基于Python語言編寫的監(jiān)控腳本,監(jiān)控腳本可以調(diào)用到第一編程函數(shù)即is Slave函數(shù),執(zhí)行SQL語句,得出相應(yīng)的參數(shù)值。
可以理解的是,主從數(shù)據(jù)庫的信息交互是基于端口的,故主從數(shù)據(jù)庫之間的端口是否暢通,影響著數(shù)據(jù)庫的主從同步狀態(tài),故可以將監(jiān)控腳本設(shè)置于主數(shù)據(jù)庫上,利用監(jiān)控腳本來測(cè)試端口的狀態(tài),即通過判斷主從數(shù)據(jù)庫之間是否可以連通,從而可以得出數(shù)據(jù)的主從同步狀態(tài)。
在本發(fā)明的一些實(shí)施例中,在上述調(diào)用第一編程函數(shù),自動(dòng)執(zhí)行預(yù)設(shè)結(jié)構(gòu)化查詢指令,得出執(zhí)行結(jié)果之前還可以包括:調(diào)用第二編程函數(shù),測(cè)試所述數(shù)據(jù)庫的端口狀態(tài),判斷是否符合預(yù)設(shè)連接條件;當(dāng)符合所述預(yù)設(shè)連接條件時(shí),則進(jìn)行后續(xù)步驟;當(dāng)不符合所述預(yù)設(shè)連接條件時(shí),生成第一告警郵件,并將所述告警郵件發(fā)送至第一預(yù)設(shè)收件人。
需要說明的是,上述第二編程函數(shù)可以是指Python語言中的telnet函數(shù),其可以測(cè)試服務(wù)器的地址以及端口是否暢通,即基于Python的主從數(shù)據(jù)庫之間是否可以連通。
上述預(yù)設(shè)連接條件可以是指監(jiān)控腳本與從數(shù)據(jù)庫之間的端口處于暢通狀態(tài),此時(shí),可以調(diào)用is Slave函數(shù)來監(jiān)控?cái)?shù)據(jù)庫的主從同步狀態(tài)。
當(dāng)不符合上述預(yù)設(shè)連接條件時(shí),即主從數(shù)據(jù)庫之間的不可以連通時(shí),則可以判斷數(shù)據(jù)庫的主從同步狀態(tài)出現(xiàn)異常。此時(shí),為了及時(shí)通知運(yùn)維人員,以使運(yùn)維人員可以知悉當(dāng)前的主從同步狀態(tài)出現(xiàn)異常,可以自動(dòng)生成告警郵件,并將該告警郵件發(fā)送至預(yù)先設(shè)定的收件人。
上述第一預(yù)設(shè)收件人可以是任意設(shè)定的,其具體可以表現(xiàn)為數(shù)據(jù)庫的管理員,也可以為其它預(yù)先設(shè)定的人員,在此不再限定。顯而易見地,設(shè)定收件人具體可以通過設(shè)定郵件接收地址來實(shí)現(xiàn)。而更具體地,可以通過Python語言中的ring函數(shù)來實(shí)現(xiàn)告警郵件。
更進(jìn)一步地,為了使告警郵件的收件人在得知數(shù)據(jù)庫主從同步狀態(tài)出現(xiàn)異常之后,可以及時(shí)得知出現(xiàn)異常的原因以及位置,以及時(shí)作出應(yīng)對(duì)措施,在告警郵件中可以附上異常信息,表明出現(xiàn)異常的原因和位置。
故在本發(fā)明的一些實(shí)施例中,上述當(dāng)不符合所述預(yù)設(shè)連接條件時(shí),生成第一告警郵件,并將所述告警郵件發(fā)送至第一預(yù)設(shè)收件人的過程具體可以為:獲取所述數(shù)據(jù)庫的第一異常信息;根據(jù)所述第一異常信息以及第一預(yù)設(shè)郵件模板,生成所述第一告警郵件;將所述第一告警郵件發(fā)送至所述第一預(yù)設(shè)收件人。
需要說明的是,上述第一異常信息可以是包括當(dāng)前數(shù)據(jù)庫的端口狀態(tài),例如是否暢通等,以及當(dāng)前數(shù)據(jù)庫所處的服務(wù)器是哪臺(tái)服務(wù)器。當(dāng)然,上述第一異常信息還可以包括其它類型的信息,在此不作限定。
上述第一預(yù)設(shè)郵件模板可以是指預(yù)先設(shè)置好的郵件模板,例如,可以將郵件模板的標(biāo)題設(shè)置為數(shù)據(jù)庫主從同步狀態(tài)異常提醒,而將郵件模板的內(nèi)容設(shè)置包括稱呼用語、出現(xiàn)異常的原因以及出現(xiàn)異常的數(shù)據(jù)庫所在的服務(wù)器地址等。當(dāng)然,告警郵件的模板可以任意設(shè)定的,在此不作限定。而告警郵件的發(fā)送也可以通過上文提到的ring函數(shù)實(shí)現(xiàn)。
可以看出,通過測(cè)試主從數(shù)據(jù)庫之間的端口是否可以連通,從而初步判斷數(shù)據(jù)庫的主從同步狀態(tài)是否出現(xiàn)異常,使得主從同步狀態(tài)的監(jiān)控的較便利快捷。而在判斷出數(shù)據(jù)庫的主從同步狀態(tài)出現(xiàn)異常之后,發(fā)出告警郵件,可以及時(shí)處理數(shù)據(jù)庫的主從同步狀態(tài)異常情況,保證數(shù)據(jù)庫的主從同步。
步驟102:根據(jù)所述執(zhí)行結(jié)果,判斷數(shù)據(jù)庫的主從同步狀態(tài)是否正常。
需要說明的是,根據(jù)執(zhí)行SQL語句得出的參數(shù)值,來判斷數(shù)據(jù)庫的主從同步狀態(tài)是否出現(xiàn)異常是本領(lǐng)域技術(shù)人員所熟知的技術(shù),在此不再贅述。
可以理解的是,根據(jù)數(shù)據(jù)庫的主從同步狀態(tài)正常與否,可以進(jìn)行相應(yīng)的應(yīng)對(duì)措施。
在本發(fā)明的一些實(shí)施例中,上述根據(jù)所述執(zhí)行結(jié)果,判斷數(shù)據(jù)庫的主從同步狀態(tài)是否正常的過程可以具體為:當(dāng)判斷出所述數(shù)據(jù)庫的主從同步狀態(tài)為正常時(shí),停止執(zhí)行監(jiān)控程序;當(dāng)判斷出所述數(shù)據(jù)庫的主從同步狀態(tài)為異常時(shí),獲取所述數(shù)據(jù)庫的第二異常信息;根據(jù)所述第二異常信息以及第二預(yù)設(shè)郵件模板,生成第二告警郵件;將所述第二告警郵件發(fā)送至第二預(yù)設(shè)收件人。
需要說明的是,上述監(jiān)控程序可以是指上文中提到的監(jiān)控腳本,其可以是指基于Python語言編寫的。
上述第二異常信息可以是指表征數(shù)據(jù)庫的主從同步狀態(tài)出現(xiàn)異常的原因,以及出現(xiàn)異常的數(shù)據(jù)庫處于哪一臺(tái)服務(wù)器的信息。當(dāng)然,上述第二異常信息還可以包括其它類型的數(shù)據(jù)庫信息。
上述第二預(yù)設(shè)郵件模板可以與上文提到的第一預(yù)設(shè)郵件模板等同,具體介紹可以參見上文相應(yīng)內(nèi)容;當(dāng)然,也可以與第一預(yù)設(shè)郵件模板不同,可以是任意設(shè)定的,在此不作限定。
上述第二預(yù)設(shè)收件人可以與上文提到的第一預(yù)設(shè)收件人等同,具體介紹可以參見上文相應(yīng)內(nèi)容;當(dāng)然,第二預(yù)設(shè)收件人也可以與第一預(yù)設(shè)收件人不同,在此不作限定。
可以理解的是,當(dāng)判斷出數(shù)據(jù)庫的主從同步狀態(tài)為正常時(shí),可以停止執(zhí)行監(jiān)控程序,也可以繼續(xù)循環(huán)執(zhí)行監(jiān)控程序,以對(duì)數(shù)據(jù)庫實(shí)現(xiàn)無間斷的監(jiān)控。
但是,無間斷地運(yùn)行監(jiān)控腳本,會(huì)占用大量的資源。為了均衡監(jiān)控效率和資源的利用率,可以定時(shí)執(zhí)行監(jiān)控腳本,即定時(shí)監(jiān)控?cái)?shù)據(jù)庫的主從同步狀態(tài)。
在本發(fā)明的一些實(shí)施例中,上述當(dāng)判斷出所述數(shù)據(jù)庫的主從同步狀態(tài)為正常時(shí),停止執(zhí)行監(jiān)控程序之后還可以包括:在經(jīng)過預(yù)設(shè)周期之后,執(zhí)行所述監(jiān)控程序,對(duì)所述數(shù)據(jù)庫的主從同步狀態(tài)進(jìn)行監(jiān)控。
需要說明的是,上述預(yù)設(shè)周期可以是任意設(shè)定的,例如,可以將預(yù)設(shè)周期設(shè)定為10分鐘,此時(shí),每經(jīng)過10分鐘,則自動(dòng)執(zhí)行監(jiān)控程序即監(jiān)控腳本。
具體地,可以利用Linux/Unix crontab來實(shí)現(xiàn)定時(shí)監(jiān)控任務(wù),即在crontab內(nèi)添加定時(shí)任務(wù),這樣每隔預(yù)設(shè)周期,crontab會(huì)調(diào)用監(jiān)控程序即監(jiān)控腳本,對(duì)數(shù)據(jù)的主從同步狀態(tài)進(jìn)行監(jiān)控。
為了更好地介紹說明各個(gè)步驟的具體實(shí)現(xiàn)過程,下面將結(jié)合具體實(shí)現(xiàn)代碼來簡(jiǎn)要說明具體的Python代碼實(shí)現(xiàn)。
首先需要編寫SMTP郵件配置文件,以及創(chuàng)建Python函數(shù)__init__、__configParseMySQL__、__configParseSMTP__、__read_defaults_file__、telnet、is Slave、get_last_error、notify、close、ring函數(shù)。
然后編寫Python代碼來具體實(shí)現(xiàn)各個(gè)步驟,例如,利用telnet函數(shù)測(cè)試服務(wù)器地址以及端口是否暢通,判斷數(shù)據(jù)的主從同步狀態(tài)是否正常的過程可以具體如下:
測(cè)試服務(wù)器地址和端口是否暢通
:param host:服務(wù)器地址
:param port:服務(wù)器端口
:param timeout:測(cè)試超時(shí)時(shí)間
:return:Boolean
"""
try:
tel=telnetlib.Telnet(host,port,timeout)
tel.close()
return True
except:
return False
def connect(self):
"""
創(chuàng)建數(shù)據(jù)庫鏈接
"""
try:
config=self.__configParseMySQL__()
if self.telnet(config["host"],config["port"]):
self.__instance__=mysql.connector.connect(**config)
return True
else:
raise Exception("unable connect")
except:
self.__error__.append("無法連接服務(wù)器主機(jī):{host}:{port}".format(host=config[
"host"],port=config["port"]))
return False
defisSlave(self):
"""
數(shù)據(jù)庫同步是否正常
:return:None同步未開啟,False同步中斷,True同步正常
"""
cur=self.__instance__.cursor(dictionary=True)
cur.execute("SHOW SLAVE STATUS")
result=cur.fetchone()
cur.close()
if result:
if result["Slave_SQL_Running"]=="Yes"and result["Slave_IO_Running"]=="Yes":
return True
else:
if result["Slave_SQL_Running"]=="No":
self.__error__.append(result["Last_SQL_Error"])
else:
self.__error__.append(result["Last_IO_Error"])
return False
defget_last_error(self):
"""
獲取第一個(gè)錯(cuò)誤信息
:return:String
"""
if self.__error__:
return self.__error__.pop(0)
def notify(self,title,message):
"""
而發(fā)送告警郵件的具體代碼實(shí)現(xiàn)可以如下所示:
:param title:消息的標(biāo)題
:param message:消息的內(nèi)容
:return:
"""
msg=[title,message]
pool=[]
notify=notify_email(self.__configParseSMTP__())
pool.append(notify)
for item in pool:
item.ring(msg)
def close(self):
"""
關(guān)閉數(shù)據(jù)庫鏈接
"""
if self.__instance__:
self.__instance__.close()
class notify_email(object):
def__init__(self,config):
self.config=config
def ring(self,message=[]):
subject=message.pop(0)
messageBody="".join(message)
mailList=self.config["to"].split(";")
datetime=time.strftime("%Y-%m-%d%H:%M:%S")
for to in mailList:
body="""
<p>管理員<strong>{admin}</strong>,你好:</p>
<p style="text-indent:2em;">收到這封郵件說明你的數(shù)據(jù)庫同步出現(xiàn)異常,請(qǐng)您及時(shí)進(jìn)行處理。</p>
<p>異常信息:<br/>{body}</p>
<p style="text-align:right;">{date}</p>
""".format(admin=to,body=messageBody,date=datetime)
msg=MIMEText(body,"html","utf-8")
msg["From"]=self.config["from"]
msg["To"]=to
msg["Subject"]=subject
smtp=smtplib.SMTP()
smtp.connect(self.config["smtp_host"])
if self.config.has_key("smtp_user"):
smtp.login(self.config["smtp_user"],self.config["smtp_password"])
smtp.sendmail(self.config["from"],to,msg.as_string())
smtp.quit()
可以理解的是,上述具體的Python代碼的實(shí)現(xiàn)過程只是一種實(shí)施方式,具體的實(shí)現(xiàn)手段還可以有其它,在此不作限定。
本發(fā)明實(shí)施例所提供的數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控的方法,通過調(diào)用第一編程函數(shù),自動(dòng)執(zhí)行預(yù)設(shè)結(jié)構(gòu)化查詢指令,得出執(zhí)行結(jié)果;根據(jù)上述執(zhí)行結(jié)果,判斷數(shù)據(jù)庫的主從同步狀態(tài)是否正常。利用編程手段,自動(dòng)執(zhí)行結(jié)構(gòu)化查詢指令,對(duì)數(shù)據(jù)庫的主從同步狀態(tài)進(jìn)行監(jiān)控,相較于人工執(zhí)行結(jié)構(gòu)化查詢指令對(duì)數(shù)據(jù)庫的主從同步狀態(tài)進(jìn)行監(jiān)控,其自動(dòng)執(zhí)行結(jié)構(gòu)化查詢指令,使得數(shù)據(jù)庫的主從同步狀態(tài)的監(jiān)控效率較高,可見,該方法有利于提高數(shù)據(jù)庫主從同步狀態(tài)的監(jiān)控效率。
下面對(duì)本發(fā)明實(shí)施例提供的數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控裝置進(jìn)行介紹,下文描述的數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控裝置與上文描述的數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控方法可相互對(duì)應(yīng)參照。
圖2為本發(fā)明實(shí)施例所提供的數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控裝置的結(jié)構(gòu)框圖,參照?qǐng)D2數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控的裝置可以包括:
調(diào)用模塊201,用于調(diào)用第一編程函數(shù),自動(dòng)執(zhí)行預(yù)設(shè)結(jié)構(gòu)化查詢指令,得出執(zhí)行結(jié)果;
第一判斷模塊202,用于根據(jù)所述執(zhí)行結(jié)果,判斷數(shù)據(jù)庫的主從同步狀態(tài)是否正常。
可選地,還包括:
第二判斷模塊,用于調(diào)用第二編程函數(shù),測(cè)試所述數(shù)據(jù)庫的端口狀態(tài),判斷是否符合預(yù)設(shè)連接條件;
建立模塊,用于當(dāng)符合所述預(yù)設(shè)連接條件時(shí),則進(jìn)行后續(xù)步驟;
第一告警模塊,用于當(dāng)不符合所述預(yù)設(shè)連接條件時(shí),生成第一告警郵件,并將所述告警郵件發(fā)送至第一預(yù)設(shè)收件人。
可選地,所述第一告警模塊包括:
第一異常信息獲取單元,用于獲取所述數(shù)據(jù)庫的第一異常信息;
生成單元,用于根據(jù)所述第一異常信息以及第一預(yù)設(shè)郵件模板,生成所述第一告警郵件;
發(fā)送單元,用于將所述第一告警郵件發(fā)送至所述第一預(yù)設(shè)收件人。
可選地,還包括:
停止模塊,用于當(dāng)判斷出所述數(shù)據(jù)庫的主從同步狀態(tài)為正常時(shí),停止執(zhí)行監(jiān)控程序;
獲取模塊,用于當(dāng)判斷出所述數(shù)據(jù)庫的主從同步狀態(tài)為異常時(shí),獲取所述數(shù)據(jù)庫的第二異常信息;
生成模塊,用于根據(jù)所述第二異常信息以及第二預(yù)設(shè)郵件模板,生成第二告警郵件;
發(fā)送模塊,用于將所述第二告警郵件發(fā)送至第二預(yù)設(shè)收件人。
可選地,還包括:
定時(shí)執(zhí)行模塊,用于在經(jīng)過預(yù)設(shè)周期之后,執(zhí)行所述監(jiān)控程序,對(duì)所述數(shù)據(jù)庫的主從同步狀態(tài)進(jìn)行監(jiān)控。
本發(fā)明實(shí)施例所提供的數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控的裝置,通過調(diào)用第一編程函數(shù),自動(dòng)執(zhí)行預(yù)設(shè)結(jié)構(gòu)化查詢指令,得出執(zhí)行結(jié)果;根據(jù)上述執(zhí)行結(jié)果,判斷數(shù)據(jù)庫的主從同步狀態(tài)是否正常。利用編程手段,自動(dòng)執(zhí)行結(jié)構(gòu)化查詢指令,對(duì)數(shù)據(jù)庫的主從同步狀態(tài)進(jìn)行監(jiān)控,相較于人工執(zhí)行結(jié)構(gòu)化查詢指令對(duì)數(shù)據(jù)庫的主從同步狀態(tài)進(jìn)行監(jiān)控,其自動(dòng)執(zhí)行結(jié)構(gòu)化查詢指令,使得數(shù)據(jù)庫的主從同步狀態(tài)的監(jiān)控效率較高,可見,該裝置有利于提高數(shù)據(jù)庫主從同步狀態(tài)的監(jiān)控效率。
本說明書中各個(gè)實(shí)施例采用遞進(jìn)的方式描述,每個(gè)實(shí)施例重點(diǎn)說明的都是與其它實(shí)施例的不同之處,各個(gè)實(shí)施例之間相同或相似部分互相參見即可。對(duì)于實(shí)施例公開的裝置而言,由于其與實(shí)施例公開的方法相對(duì)應(yīng),所以描述的比較簡(jiǎn)單,相關(guān)之處參見方法部分說明即可。
專業(yè)人員還可以進(jìn)一步意識(shí)到,結(jié)合本文中所公開的實(shí)施例描述的各示例的單元及算法步驟,能夠以電子硬件、計(jì)算機(jī)軟件或者二者的結(jié)合來實(shí)現(xiàn),為了清楚地說明硬件和軟件的可互換性,在上述說明中已經(jīng)按照功能一般性地描述了各示例的組成及步驟。這些功能究竟以硬件還是軟件方式來執(zhí)行,取決于技術(shù)方案的特定應(yīng)用和設(shè)計(jì)約束條件。專業(yè)技術(shù)人員可以對(duì)每個(gè)特定的應(yīng)用來使用不同方法來實(shí)現(xiàn)所描述的功能,但是這種實(shí)現(xiàn)不應(yīng)認(rèn)為超出本發(fā)明的范圍。
結(jié)合本文中所公開的實(shí)施例描述的方法或算法的步驟可以直接用硬件、處理器執(zhí)行的軟件模塊,或者二者的結(jié)合來實(shí)施。軟件模塊可以置于隨機(jī)存儲(chǔ)器(RAM)、內(nèi)存、只讀存儲(chǔ)器(ROM)、電可編程ROM、電可擦除可編程ROM、寄存器、硬盤、可移動(dòng)磁盤、CD-ROM、或技術(shù)領(lǐng)域內(nèi)所公知的任意其它形式的存儲(chǔ)介質(zhì)中。
以上對(duì)本發(fā)明所提供的數(shù)據(jù)庫主從同步狀態(tài)監(jiān)控的方法以及裝置進(jìn)行了詳細(xì)介紹。本文中應(yīng)用了具體個(gè)例對(duì)本發(fā)明的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想。應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以對(duì)本發(fā)明進(jìn)行若干改進(jìn)和修飾,這些改進(jìn)和修飾也落入本發(fā)明權(quán)利要求的保護(hù)范圍內(nèi)。