本發(fā)明屬于數(shù)據(jù)庫技術(shù)領(lǐng)域,具體地說,涉及一種數(shù)據(jù)庫讀寫分離方法、裝置和系統(tǒng)。
背景技術(shù):
目前常用的數(shù)據(jù)庫讀寫分離方案通常是由應(yīng)用程序判斷結(jié)構(gòu)化查詢語言(structuredquerylanguage,sql)請求是否為查詢操作,如果是查詢操作,則固定的訪問備份數(shù)據(jù)庫,如果是寫操作則訪問主數(shù)據(jù)庫。這種方式的缺點(diǎn)是:查詢操作過于集中到備份數(shù)據(jù)庫上,如果是讀多寫少的應(yīng)用程序,則備份數(shù)據(jù)庫壓力較大,導(dǎo)致查詢慢,同時主數(shù)據(jù)庫會出現(xiàn)資源浪費(fèi);應(yīng)用程序還需要自己識別讀寫操作,對于復(fù)雜的sql識別難度大;對于主數(shù)據(jù)庫和備份數(shù)據(jù)庫的可靠性要求很高,一旦備份數(shù)據(jù)庫或者主數(shù)據(jù)庫宕機(jī),查詢服務(wù)或者寫服務(wù)就會停止,大大降低可用性。
在另外一種數(shù)據(jù)庫讀寫分離的方案中,通過設(shè)計(jì)一個代理(proxy)程序,客戶端的sql都要經(jīng)過代理程序轉(zhuǎn)發(fā),代理程序根據(jù)客戶端的sql類型,自動將sql分配到主數(shù)據(jù)庫或者備份數(shù)據(jù)庫。這種方式的缺點(diǎn)是:代理程序解析sql的能力有限,由于數(shù)據(jù)庫sql類型繁多,除非是數(shù)據(jù)庫自身來解析sql,否則代理程序難以有效地區(qū)分所有的sql類型,同時代理程序解析一次sql后,數(shù)據(jù)庫本身也會再次解析sql,這樣降低了效率;代理程序不能實(shí)時了解主數(shù)據(jù)庫和備份數(shù)據(jù)庫當(dāng)前的壓力,這會導(dǎo)致主備壓力不均,性能降低;代理程序不能夠?qū)崟r了解主數(shù)據(jù)庫和備份數(shù)據(jù)庫之間的延遲,對于還未同步到備份數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行查詢將不會得到期望的結(jié)果。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本申請?zhí)峁┝艘环N數(shù)據(jù)庫讀寫分離方法、裝置和系統(tǒng),以解決現(xiàn)有技術(shù)中sql對應(yīng)的讀操作與寫操作在主數(shù)據(jù)庫與備份數(shù)據(jù)庫之間分配不合理的技術(shù)問題。
為了解決上述技術(shù)問題,本申請公開了一種數(shù)據(jù)庫讀寫分離方法,適用于第一數(shù)據(jù)庫,包括:接收來自客戶端的sql語句;解析所述sql語句以確定對應(yīng)的操作類型;響應(yīng)于所述操作類型是只讀操作時,檢測所述只讀操作所讀取的數(shù)據(jù)是否已同步至第二數(shù)據(jù)庫;響應(yīng)于所述只讀操作所讀取的數(shù)據(jù)已同步至第二數(shù)據(jù)庫時,轉(zhuǎn)發(fā)所述sql語句至所述第二數(shù)據(jù)庫,由所述第二數(shù)據(jù)庫完成執(zhí)行。
為了解決上述技術(shù)問題,本申請還公開了一種數(shù)據(jù)庫讀寫分離方法,適用于第二數(shù)據(jù)庫,包括:向第一數(shù)據(jù)庫發(fā)送數(shù)據(jù)同步信息;當(dāng)只讀操作所讀取的數(shù)據(jù)已從第一數(shù)據(jù)庫同步至本地時,接收所述第一數(shù)據(jù)庫轉(zhuǎn)發(fā)的與所述只讀操作對應(yīng)的sql語句;執(zhí)行所述sql語句,完成所述只讀操作。
為了解決上述技術(shù)問題,本申請還公開了一種數(shù)據(jù)庫讀寫分離裝置,包括:第一接收模塊,用于接收來自客戶端的sql語句;解析模塊,用于解析所述sql語句以確定對應(yīng)的操作類型;檢測模塊,用于響應(yīng)于所述操作類型是只讀操作時,檢測所述只讀操作所讀取的數(shù)據(jù)是否已同步至第二數(shù)據(jù)庫;轉(zhuǎn)發(fā)模塊,用于響應(yīng)于所述只讀操作所讀取的數(shù)據(jù)已同步至第二數(shù)據(jù)庫時,轉(zhuǎn)發(fā)所述sql語句至所述第二數(shù)據(jù)庫,由所述第二數(shù)據(jù)庫完成執(zhí)行。
為了解決上述技術(shù)問題,本申請還公開了一種數(shù)據(jù)庫讀寫分離裝置,包括:第一發(fā)送模塊,用于向第一數(shù)據(jù)庫發(fā)送數(shù)據(jù)同步信息;第二接收模塊,用于當(dāng)只讀操作所讀取的數(shù)據(jù)已從第一數(shù)據(jù)庫同步至本地時,接收所述第一數(shù)據(jù)庫轉(zhuǎn)發(fā)的與所述只讀操作對應(yīng)的sql語句;執(zhí)行模塊,用于執(zhí)行所述sql語句,完成所述只讀操作。
為了解決上述技術(shù)問題,本申請還公開了一種數(shù)據(jù)庫讀寫分離系統(tǒng),包括:第一數(shù)據(jù)庫和第二數(shù)據(jù)庫;所述第一數(shù)據(jù)庫用于接收來自客戶端的sql語句,解析所述sql語句以確定對應(yīng)的操作類型;響應(yīng)于所述操作類型是只讀操作時,檢測所述只讀操作所讀取的數(shù)據(jù)是否已同步至第二數(shù)據(jù)庫;響應(yīng)于所述只讀操作所讀取的數(shù)據(jù)已同步至第二數(shù)據(jù)庫時,轉(zhuǎn)發(fā)所述sql語 句至所述第二數(shù)據(jù)庫;所述第二數(shù)據(jù)庫用于向第一數(shù)據(jù)庫發(fā)送數(shù)據(jù)同步信息;當(dāng)只讀操作所讀取的數(shù)據(jù)已從第一數(shù)據(jù)庫同步至本地時,接收所述第一數(shù)據(jù)庫轉(zhuǎn)發(fā)的與所述只讀操作對應(yīng)的sql語句;執(zhí)行所述sql語句,完成所述只讀操作。
與現(xiàn)有技術(shù)相比,本申請可以獲得包括以下技術(shù)效果:第一數(shù)據(jù)庫可根據(jù)其與第二數(shù)據(jù)庫之間的數(shù)據(jù)同步狀態(tài)來判定是否將只讀操作分離出去,實(shí)現(xiàn)讀操作與寫操作分離。
當(dāng)然,實(shí)施本申請的任一產(chǎn)品必不一定需要同時達(dá)到以上所述的所有技術(shù)效果。
附圖說明
此處所說明的附圖用來提供對本申請的進(jìn)一步理解,構(gòu)成本申請的一部分,本申請的示意性實(shí)施例及其說明用于解釋本申請,并不構(gòu)成對本申請的不當(dāng)限定。在附圖中:
圖1是本申請實(shí)施例的一種數(shù)據(jù)庫讀寫分離系統(tǒng)的架構(gòu)示意圖;
圖2是本申請實(shí)施例的一種數(shù)據(jù)庫讀寫分離方法的流程圖;
圖3是本申請實(shí)施例的sql語句對應(yīng)的執(zhí)行計(jì)劃的示意圖;
圖4是本申請實(shí)施例的sql語句對應(yīng)的執(zhí)行計(jì)劃的示意圖;
圖5是本申請實(shí)施例的一種數(shù)據(jù)庫讀寫分離方法的流程圖;
圖6是本申請實(shí)施例的一種數(shù)據(jù)庫讀寫分離裝置的框圖;
圖7是本申請實(shí)施例的一種數(shù)據(jù)庫讀寫分離裝置的框圖。
具體實(shí)施方式
以下將配合附圖及實(shí)施例來詳細(xì)說明本發(fā)明的實(shí)施方式,藉此對本發(fā)明如何應(yīng)用技術(shù)手段來解決技術(shù)問題并達(dá)成技術(shù)功效的實(shí)現(xiàn)過程能充分理解并據(jù)以實(shí)施。
本申請實(shí)施例,第一數(shù)據(jù)庫接收客戶端的sql語句,如果對應(yīng)的是只 讀操作則檢測所讀取的數(shù)據(jù)是否已同步到第二數(shù)據(jù)庫,當(dāng)所讀取的數(shù)據(jù)已同步到第二數(shù)據(jù)庫時,將sql語句轉(zhuǎn)發(fā)至第二數(shù)據(jù)庫,由第二數(shù)據(jù)庫來執(zhí)行只讀操作,將讀操作轉(zhuǎn)移到第二數(shù)據(jù)庫,實(shí)現(xiàn)讀操作與寫操作的分離,在正常數(shù)據(jù)庫主備架構(gòu)基礎(chǔ)上,將主數(shù)據(jù)庫的sql請求轉(zhuǎn)發(fā)到備份數(shù)據(jù)庫執(zhí)行,不依賴第三方代理程序,主數(shù)據(jù)庫能夠?qū)崟r了解主備之間的數(shù)據(jù)同步狀態(tài),可以更合理地選擇是否將sql進(jìn)行轉(zhuǎn)發(fā)至備用數(shù)據(jù)庫。
圖1是本申請實(shí)施例的數(shù)據(jù)庫讀寫分離系統(tǒng)的架構(gòu)示意圖,包括第一數(shù)據(jù)庫11和第二數(shù)據(jù)庫12。其中,第一數(shù)據(jù)庫11為主數(shù)據(jù)庫,第二數(shù)據(jù)庫12為備份數(shù)據(jù)庫,第一數(shù)據(jù)庫11用于接收客戶端13的sql。
對第一數(shù)據(jù)庫11建立虛擬ip地址(virtualipaddress,vip),并向客戶端公開虛擬ip地址和端口,用于客戶端13訪問。在一個實(shí)施例中,可以在第一數(shù)據(jù)庫11建立多個虛擬機(jī)并分別設(shè)置對應(yīng)的虛擬ip地址和端口。例如,真正應(yīng)用集群1(realapplicationcluster1,rac-1)的虛擬ip地址及端口號為:tcp:\\192.168.57.221:1522;真正應(yīng)用集群2的虛擬ip地址及端口號為:tcp:\\192.168.57.222:1522。那么,對客戶端13開放這兩個虛擬ip地址,客戶端13可以分別訪問第一數(shù)據(jù)庫11的真正應(yīng)用集群1和真正應(yīng)用集群2。
第一數(shù)據(jù)庫11與第二數(shù)據(jù)庫12之間通過日志來同步狀態(tài),日志是由第一數(shù)據(jù)庫11主動發(fā)送至第二數(shù)據(jù)庫12,第二數(shù)據(jù)庫12同步更新日志后,會向第一數(shù)據(jù)庫11發(fā)送反饋信息,故第一數(shù)據(jù)庫11能夠了解第二數(shù)據(jù)庫12的同步狀態(tài)。因此,第一數(shù)據(jù)庫11可以根據(jù)第二數(shù)據(jù)庫12的同步狀態(tài)來判定是否將接收到的sql只讀操作轉(zhuǎn)移至第二數(shù)據(jù)庫12來執(zhí)行。第一數(shù)據(jù)庫11接收第二數(shù)據(jù)庫12的執(zhí)行結(jié)果,并將執(zhí)行結(jié)果返回至客戶端13。
下面對第一數(shù)據(jù)庫11和第二數(shù)據(jù)庫12的處理過程分別進(jìn)行說明。如圖2所示的一種數(shù)據(jù)庫讀寫分離方法,適用于第一數(shù)據(jù)庫,包括以下步驟s10-s13。
s10,接收來自客戶端的sql語句。
s11,解析sql語句以確定對應(yīng)的操作類型。
判定sql語句對應(yīng)的是只讀操作(查詢)還是寫入操作(包括更新、添加、刪除記錄等操作)。例如,可以對sql語句進(jìn)行詞法分析,根據(jù)sql語句中出現(xiàn)的關(guān)鍵字識別出sql的操作類型。
s12,響應(yīng)于操作類型是只讀操作時,檢測只讀操作所讀取的數(shù)據(jù)是否已同步至第二數(shù)據(jù)庫。
根據(jù)第二數(shù)據(jù)庫返回的日志同步狀態(tài)來檢測該只讀操作所要讀取的數(shù)據(jù)是否已經(jīng)同步到第二數(shù)據(jù)庫,即判定從第二數(shù)據(jù)庫是否能夠讀取相應(yīng)的數(shù)據(jù)。這種方式是根據(jù)最終的同步結(jié)果進(jìn)行判定的方式。而在一個實(shí)施例中,還可以根據(jù)第一數(shù)據(jù)庫與第二數(shù)據(jù)庫之間日志同步的延遲狀態(tài)來確定是否將sql語句轉(zhuǎn)發(fā)至第二數(shù)據(jù)庫執(zhí)行。該延遲可以通過以下方式確定,從第一數(shù)據(jù)庫向第二數(shù)據(jù)庫發(fā)送更新的日志數(shù)據(jù)時開始起算,直到第一數(shù)據(jù)庫接收到第二數(shù)據(jù)庫返回的日志同步狀態(tài)為止,這期間的時間長度即為日志同步的延遲。例如,可以為第一數(shù)據(jù)庫與第二數(shù)據(jù)庫之間日志同步的延遲時長設(shè)置一預(yù)設(shè)閾值(例如2秒);當(dāng)?shù)谝粩?shù)據(jù)庫與第二數(shù)據(jù)庫之間日志同步的延遲時長大于或等于預(yù)設(shè)閾值時,不會將sql語句轉(zhuǎn)發(fā)到第二數(shù)據(jù)庫執(zhí)行,而在第一數(shù)據(jù)庫本地執(zhí)行;當(dāng)?shù)谝粩?shù)據(jù)庫與第二數(shù)據(jù)庫之間日志同步的延遲時長小于預(yù)設(shè)閾值時,將sql語句轉(zhuǎn)發(fā)到第二數(shù)據(jù)庫執(zhí)行。這樣,能夠維持對只讀操作的快速響應(yīng),防止在日志同步狀態(tài)延遲過高時轉(zhuǎn)發(fā)只讀操作而不能得到及時響應(yīng)。
如果sql語句對應(yīng)的操作類型是寫操作,則會在第一數(shù)據(jù)庫繼續(xù)執(zhí)行。
s13,響應(yīng)于只讀操作所讀取的數(shù)據(jù)已同步至第二數(shù)據(jù)庫時,轉(zhuǎn)發(fā)sql語句至第二數(shù)據(jù)庫,由第二數(shù)據(jù)庫完成執(zhí)行。
只讀操作被轉(zhuǎn)移到第二數(shù)據(jù)庫,實(shí)現(xiàn)讀操作與寫操作分離。第一數(shù)據(jù)庫可根據(jù)其與第二數(shù)據(jù)庫之間的數(shù)據(jù)同步狀態(tài)來判定是否將只讀操作分離出去;或者根據(jù)其與第二數(shù)據(jù)庫之間的數(shù)據(jù)同步的延遲來判定當(dāng)前是否適合將只讀操作分離出去。
第一數(shù)據(jù)庫對sql語句進(jìn)行解析并判定為只讀操作時,將sql語句轉(zhuǎn)發(fā)至第二數(shù)據(jù)庫。而第二數(shù)據(jù)庫在執(zhí)行前還需要對sql語句再次進(jìn)行解析,會出現(xiàn)重復(fù)解析的情況,影響sql執(zhí)行效率。因此,在一個實(shí)施例中,步 驟s11還可進(jìn)一步實(shí)施為以下步驟s111-s112。
s111,對sql語句進(jìn)行語法分析,生成執(zhí)行計(jì)劃。
通過語法分析得到sql語句的業(yè)務(wù)處理邏輯,由該業(yè)務(wù)處理邏輯組成sql語句對應(yīng)的執(zhí)行計(jì)劃(explainplan)。
例如,從一個表中查詢所有名字為“張三”的人,對應(yīng)的sql語句為:
select*frompersonwherename='張三';
解析后生成的執(zhí)行計(jì)劃如圖3所示,sql的執(zhí)行計(jì)劃從右側(cè)開始,先進(jìn)行表掃描,從person列中查詢名字為“張三”的人,再將結(jié)果輸出。
再例如,從一個表中查詢年齡最大的人,對應(yīng)的sql語句為:
selectmax(age)fromperson;
解析后生成的執(zhí)行計(jì)劃如圖4所示,先進(jìn)行表掃描,由于max()函數(shù)屬于聚合函數(shù),因此在執(zhí)行計(jì)劃中會有流聚合(aggregate)出現(xiàn),用于計(jì)算匯總值,這里用于找到年齡(age)這一列的最大值,最后輸出結(jié)果。
s112,根據(jù)執(zhí)行計(jì)劃確定對應(yīng)的操作類型。
通過執(zhí)行計(jì)劃來判定sql語句對應(yīng)的操作是否都是只讀操作。
在這個實(shí)施例中,步驟s13相應(yīng)的進(jìn)一步實(shí)施為以下步驟s131。
s131,轉(zhuǎn)發(fā)sql語句對應(yīng)的執(zhí)行計(jì)劃至第二數(shù)據(jù)庫。
第二數(shù)據(jù)庫直接按照執(zhí)行計(jì)劃來執(zhí)行只讀操作,讀取對應(yīng)的數(shù)據(jù)并返回執(zhí)行結(jié)果至第一數(shù)據(jù)庫。這樣,第二數(shù)據(jù)庫就無需再對sql語句再進(jìn)行一次解析,提升了sql執(zhí)行效率。
此外,第一數(shù)據(jù)庫還可以進(jìn)一步對自身的負(fù)載情況進(jìn)行判定,在自身負(fù)載較高時,將只讀操作轉(zhuǎn)移到第二數(shù)據(jù)庫。此時步驟s12可進(jìn)一步實(shí)施為以下步驟s121-s122。
s121,響應(yīng)于操作類型是只讀操作時,檢測本地的負(fù)載信息是否大于或等于第一預(yù)設(shè)門限。
s122,響應(yīng)于本地的負(fù)載信息大于或等于第一預(yù)設(shè)門限時,檢測只讀操作所讀取的數(shù)據(jù)是否已同步至第二數(shù)據(jù)庫。
本地的負(fù)載信息包括cpu使用率、輸入/輸出(i/o)次數(shù)、內(nèi)存使用率等信息,可以分別針對上述信息設(shè)置閾值,當(dāng)其中任意一個或多個大于或等于對應(yīng)的預(yù)設(shè)閾值時,判定需要將sql語句或者執(zhí)行計(jì)劃發(fā)送至第二數(shù)據(jù)庫,從而繼續(xù)檢測只讀操作所讀取的數(shù)據(jù)是否已同步至第二數(shù)據(jù)庫。而上述負(fù)載信息都小于對應(yīng)的預(yù)設(shè)閾值時,判定不需要將sql語句轉(zhuǎn)發(fā)給第二數(shù)據(jù)庫,在第一數(shù)據(jù)庫本地繼續(xù)執(zhí)行。這樣,在第一數(shù)據(jù)庫負(fù)載較低時,不進(jìn)行讀寫分離,在第一數(shù)據(jù)庫負(fù)載較高時進(jìn)行讀寫分離,以保證讀操作和寫操作各自的執(zhí)行效率。
第一數(shù)據(jù)庫還可以對第二數(shù)據(jù)庫的負(fù)載情況進(jìn)行判定,在第二數(shù)據(jù)庫負(fù)載較低時,將只讀操作轉(zhuǎn)移到第二數(shù)據(jù)庫。此時步驟s13可進(jìn)一步實(shí)施為以下步驟s132-s133。
s132,響應(yīng)于只讀操作所讀取的數(shù)據(jù)已同步至第二數(shù)據(jù)庫時,檢測第二數(shù)據(jù)庫的負(fù)載信息是否小于第二預(yù)設(shè)門限;
s133,響應(yīng)于第二數(shù)據(jù)庫的負(fù)載信息小于第二預(yù)設(shè)門限時,轉(zhuǎn)發(fā)sql語句至第二數(shù)據(jù)庫,由第二數(shù)據(jù)庫完成執(zhí)行。
第二數(shù)據(jù)庫會實(shí)時的將其負(fù)載信息發(fā)送至第一數(shù)據(jù)庫,同樣包括cpu使用率、輸入/輸出(i/o)次數(shù)、內(nèi)存使用率等信息。當(dāng)其中任意一個或多個大于或等于對應(yīng)的預(yù)設(shè)閾值時,第一數(shù)據(jù)庫不會將只讀操作轉(zhuǎn)移到第二數(shù)據(jù)庫,而繼續(xù)在本地執(zhí)行;當(dāng)上述負(fù)載信息都小于對應(yīng)的預(yù)設(shè)閾值時,判定第二數(shù)據(jù)庫當(dāng)前負(fù)載較低,可以將只讀操作轉(zhuǎn)移到第二數(shù)據(jù)庫執(zhí)行,此時將sql語句或者執(zhí)行計(jì)劃轉(zhuǎn)發(fā)至第二數(shù)據(jù)庫。這樣,在第二數(shù)據(jù)庫負(fù)載較高時,不進(jìn)行讀寫分離,在第二數(shù)據(jù)庫負(fù)載較低時,進(jìn)行讀寫分離,以保證讀操作和寫操作各自的執(zhí)行效率。
同理,上述第一數(shù)據(jù)庫對本地負(fù)載信息的檢測和對第二數(shù)據(jù)庫負(fù)載信息的檢測也可以合并同時進(jìn)行,所能達(dá)到的效果是,在第一數(shù)據(jù)庫負(fù)載較高并且第二數(shù)據(jù)庫負(fù)載較低時,進(jìn)行讀寫分離,其他情況都不進(jìn)行讀寫分離,使第一數(shù)據(jù)庫能夠更加合理的判定是否將只讀操作轉(zhuǎn)移到第二數(shù)據(jù)庫。
圖5是本申請實(shí)施例提供的一種數(shù)據(jù)庫讀寫分離方法,適用于第二數(shù)據(jù)庫,包括以下步驟s20-s22。
s20,向第一數(shù)據(jù)庫發(fā)送數(shù)據(jù)同步信息。
將已同步到本地的日志信息返回給第一數(shù)據(jù)庫,使第一數(shù)據(jù)庫能夠得知第一數(shù)據(jù)庫與第二數(shù)據(jù)庫之間的同步狀態(tài)或者推算出第一數(shù)據(jù)庫與第二數(shù)據(jù)庫之間日志同步的延遲。
s21,當(dāng)只讀操作所讀取的數(shù)據(jù)已從第一數(shù)據(jù)庫同步至本地時,接收第一數(shù)據(jù)庫轉(zhuǎn)發(fā)的與所述只讀操作對應(yīng)的sql語句。
或者,在只讀操作所讀取的數(shù)據(jù)已從第一數(shù)據(jù)庫同步至本地,并且與第一數(shù)據(jù)庫的日志同步延遲小于預(yù)設(shè)閾值時,接收第一數(shù)據(jù)庫轉(zhuǎn)發(fā)的與所述只讀操作對應(yīng)的sql語句。
s22,執(zhí)行所述sql語句,完成所述只讀操作。
第二數(shù)據(jù)庫做為備份數(shù)據(jù)庫在只讀操作所讀取的數(shù)據(jù)已同步至本地時,接收第一數(shù)據(jù)庫的轉(zhuǎn)移的只讀操作,實(shí)現(xiàn)讀寫分離,為第一數(shù)據(jù)庫分擔(dān)只讀操作的執(zhí)行任務(wù)并返回執(zhí)行結(jié)果至第一數(shù)據(jù)庫,保證讀寫任務(wù)的高效執(zhí)行。
在一個實(shí)施例中,第二數(shù)據(jù)庫還會向第一數(shù)據(jù)庫發(fā)送負(fù)載信息,由第一數(shù)據(jù)庫對第二數(shù)據(jù)庫的負(fù)載情況進(jìn)行判定。如果第一數(shù)據(jù)庫判定第二數(shù)據(jù)庫的負(fù)載情況過高,則將不會讓第二數(shù)據(jù)庫執(zhí)行只讀操作,在判定第二數(shù)據(jù)庫負(fù)載較低時,再進(jìn)行讀寫分離,由第二數(shù)據(jù)庫執(zhí)行只讀操作,保證讀操作和寫操作各自的執(zhí)行效率。
在一個實(shí)施例中,步驟s21可進(jìn)一步實(shí)施為:當(dāng)只讀操作所讀取的數(shù)據(jù)已從第一數(shù)據(jù)庫同步至本地時,接收所述第一數(shù)據(jù)庫轉(zhuǎn)發(fā)的與只讀操作對應(yīng)的執(zhí)行計(jì)劃;步驟s22可進(jìn)一步實(shí)施例為:根據(jù)執(zhí)行計(jì)劃完成只讀操作。
這樣,第二數(shù)據(jù)庫就不需要再對sql語句重新做一次解析,而直接按照來自第一數(shù)據(jù)庫解析后得到的執(zhí)行計(jì)劃來執(zhí)行只讀操作,從而有助于提高讀操作在第二數(shù)據(jù)庫的執(zhí)行效率。
對于圖1所示的數(shù)據(jù)庫讀寫分離系統(tǒng),如果第二數(shù)據(jù)庫12出現(xiàn)了宕機(jī),那么第一數(shù)據(jù)庫11不會再進(jìn)行讀寫分離,讀操作和寫操作都會在第一數(shù)據(jù)庫執(zhí)行。而如果第一數(shù)據(jù)庫出現(xiàn)了宕機(jī),那么系統(tǒng)會對第一數(shù)據(jù)庫11和第二數(shù)據(jù)庫12進(jìn)行主備切換處理,將第二數(shù)據(jù)庫12臨時作為主數(shù)據(jù)庫,在主 備切換期間(第一數(shù)據(jù)庫11恢復(fù)之前),讀操作和寫操作都會在第二數(shù)據(jù)庫12中執(zhí)行。
以下是本申請的裝置實(shí)施例,用于執(zhí)行本申請的方法實(shí)施例。
圖6是本發(fā)明實(shí)施例提供的一種數(shù)據(jù)庫讀寫分離裝置,包括:
第一接收模塊30,用于接收來自客戶端的sql語句;
解析模塊31,用于解析sql語句以確定對應(yīng)的操作類型;
檢測模塊32,用于響應(yīng)于操作類型是只讀操作時,檢測只讀操作所讀取的數(shù)據(jù)是否已同步至第二數(shù)據(jù)庫;
轉(zhuǎn)發(fā)模塊33,用于響應(yīng)于只讀操作所讀取的數(shù)據(jù)已同步至第二數(shù)據(jù)庫時,轉(zhuǎn)發(fā)sql語句至第二數(shù)據(jù)庫,由第二數(shù)據(jù)庫完成執(zhí)行。
在一個實(shí)施例中,該解析模塊31進(jìn)一步包括:
分析子模塊,用于對所述sql語句進(jìn)行語法分析,生成執(zhí)行計(jì)劃;
確定子模塊,用于根據(jù)所述執(zhí)行計(jì)劃確定對應(yīng)的操作類型;
該轉(zhuǎn)發(fā)模塊33進(jìn)一步包括:
第一轉(zhuǎn)發(fā)子模塊,用于轉(zhuǎn)發(fā)所述sql語句對應(yīng)的執(zhí)行計(jì)劃至所述第二數(shù)據(jù)庫。
在一個實(shí)施例中,該檢測模塊32進(jìn)一步包括:
第一檢測子模塊,用于響應(yīng)于所述操作類型是只讀操作時,檢測本地的負(fù)載信息是否大于或等于第一預(yù)設(shè)門限;
第二檢測子模塊,用于響應(yīng)于所述本地的負(fù)載信息大于或等于第一預(yù)設(shè)門限時,檢測所述只讀操作所讀取的數(shù)據(jù)是否已同步至第二數(shù)據(jù)庫。
在一個實(shí)施例中,該轉(zhuǎn)發(fā)模塊33進(jìn)一步包括:
第三檢測子模塊,用于響應(yīng)于所述只讀操作所讀取的數(shù)據(jù)已同步至第二數(shù)據(jù)庫時,檢測所述第二數(shù)據(jù)庫的負(fù)載信息是否小于第二預(yù)設(shè)門限;
第二轉(zhuǎn)發(fā)子模塊,用于響應(yīng)于所述第二數(shù)據(jù)庫的負(fù)載信息小于第二預(yù)設(shè)門限時,轉(zhuǎn)發(fā)所述sql語句至所述第二數(shù)據(jù)庫,由所述第二數(shù)據(jù)庫完成執(zhí)行。
圖7是本發(fā)明實(shí)施例提供的一種數(shù)據(jù)庫讀寫分離裝置,包括:
第一發(fā)送模塊40,用于向第一數(shù)據(jù)庫發(fā)送數(shù)據(jù)同步信息;
第二接收模塊41,用于當(dāng)只讀操作所讀取的數(shù)據(jù)已從第一數(shù)據(jù)庫同步至本地時,接收所述第一數(shù)據(jù)庫轉(zhuǎn)發(fā)的與所述只讀操作對應(yīng)的sql語句;
執(zhí)行模塊42,用于執(zhí)行所述sql語句,完成所述只讀操作。
在一個實(shí)施例中,該裝置還包括:
第二發(fā)送模塊,用于向所述第一數(shù)據(jù)庫發(fā)送負(fù)載信息;
該第二接收模塊41進(jìn)一步包括:
第一接收子模塊,用于當(dāng)只讀操作所讀取的數(shù)據(jù)已從第一數(shù)據(jù)庫同步至本地時,并且所述負(fù)載信息小于第二預(yù)設(shè)門限時,接收所述第一數(shù)據(jù)庫轉(zhuǎn)發(fā)的與所述只讀操作對應(yīng)的sql語句。
在一個實(shí)施例中,該第二接收模塊41進(jìn)一步包括:
第二接收子模塊,用于接收所述第一數(shù)據(jù)庫轉(zhuǎn)發(fā)的與所述只讀操作對應(yīng)的執(zhí)行計(jì)劃;
所述執(zhí)行模塊包括:
執(zhí)行子模塊,用于根據(jù)所述執(zhí)行計(jì)劃完成所述只讀操作。
在一個典型的配置中,計(jì)算設(shè)備包括一個或多個處理器(cpu)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。
內(nèi)存可能包括計(jì)算機(jī)可讀介質(zhì)中的非永久性存儲器,隨機(jī)存取存儲器(ram)和/或非易失性內(nèi)存等形式,如只讀存儲器(rom)或閃存(flashram)。內(nèi)存是計(jì)算機(jī)可讀介質(zhì)的示例。
計(jì)算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術(shù)來實(shí)現(xiàn)信息存儲。信息可以是計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計(jì)算機(jī)的存儲介質(zhì)的例子包括,但不限于相變內(nèi)存(pram)、靜態(tài)隨機(jī)存取存儲器(sram)、動態(tài)隨機(jī)存取存儲器(dram)、其他類型的隨機(jī)存取存儲器(ram)、只讀存儲器(rom)、電可擦除可編程只讀存儲器(eeprom)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲 器(cd-rom)、數(shù)字多功能光盤(dvd)或其他光學(xué)存儲、磁盒式磁帶,磁帶磁磁盤存儲或其他磁性存儲設(shè)備或任何其他非傳輸介質(zhì),可用于存儲可以被計(jì)算設(shè)備訪問的信息。按照本文中的界定,計(jì)算機(jī)可讀介質(zhì)不包括非暫存電腦可讀媒體(transitorymedia),如調(diào)制的數(shù)據(jù)信號和載波。
如在說明書及權(quán)利要求當(dāng)中使用了某些詞匯來指稱特定組件。本領(lǐng)域技術(shù)人員應(yīng)可理解,硬件制造商可能會用不同名詞來稱呼同一個組件。本說明書及權(quán)利要求并不以名稱的差異來作為區(qū)分組件的方式,而是以組件在功能上的差異來作為區(qū)分的準(zhǔn)則。如在通篇說明書及權(quán)利要求當(dāng)中所提及的“包含”為一開放式用語,故應(yīng)解釋成“包含但不限定于”。“大致”是指在可接收的誤差范圍內(nèi),本領(lǐng)域技術(shù)人員能夠在一定誤差范圍內(nèi)解決所述技術(shù)問題,基本達(dá)到所述技術(shù)效果。此外,“耦接”一詞在此包含任何直接及間接的電性耦接手段。因此,若文中描述一第一裝置耦接于一第二裝置,則代表所述第一裝置可直接電性耦接于所述第二裝置,或通過其他裝置或耦接手段間接地電性耦接至所述第二裝置。說明書后續(xù)描述為實(shí)施本發(fā)明的較佳實(shí)施方式,然所述描述乃以說明本發(fā)明的一般原則為目的,并非用以限定本發(fā)明的范圍。本發(fā)明的保護(hù)范圍當(dāng)視所附權(quán)利要求所界定者為準(zhǔn)。
還需要說明的是,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的商品或者系統(tǒng)不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種商品或者系統(tǒng)所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的商品或者系統(tǒng)中還存在另外的相同要素。
上述說明示出并描述了本發(fā)明的若干優(yōu)選實(shí)施例,但如前所述,應(yīng)當(dāng)理解本發(fā)明并非局限于本文所披露的形式,不應(yīng)看作是對其他實(shí)施例的排除,而可用于各種其他組合、修改和環(huán)境,并能夠在本文所述發(fā)明構(gòu)想范圍內(nèi),通過上述教導(dǎo)或相關(guān)領(lǐng)域的技術(shù)或知識進(jìn)行改動。而本領(lǐng)域人員所進(jìn)行的改動和變化不脫離本發(fā)明的精神和范圍,則都應(yīng)在本發(fā)明所附權(quán)利要求的保護(hù)范圍內(nèi)。