姬渭孟,于雪蓮
(1.吉林移動業(yè)務(wù)支撐中心,長春 130000 ;2.中國聯(lián)通吉林省公司,長春 130000)
隨著MySQL 開源軟件的發(fā)展,由于其使用方便、安全維護(hù)簡單,越來越多的IT 系統(tǒng)開始采用MySQL 作為自己的數(shù)據(jù)庫,存儲系統(tǒng)數(shù)據(jù)。但此數(shù)據(jù)庫產(chǎn)品由于性能、安全等方面限制,一般來說建議單個(gè)數(shù)據(jù)庫容量不能過大(一般在1-2T 左右),單個(gè)數(shù)據(jù)庫表記錄數(shù)不能過多(建議單表數(shù)量不高于500萬),而在IT 系統(tǒng)中,往往有大量的數(shù)據(jù),常常單個(gè)數(shù)據(jù)庫達(dá)到10T 以上,單表超過一億條。目前通用的方法是采用分庫、分表的方式,通過對數(shù)據(jù)進(jìn)行分區(qū),將一個(gè)大數(shù)據(jù)庫分為多個(gè)小的數(shù)據(jù)庫,對于分表的方式,多通過表字段取模等方法,將一個(gè)數(shù)據(jù)庫表拆分成多個(gè)數(shù)據(jù)庫表。業(yè)務(wù)系統(tǒng)應(yīng)用程序在訪問和操作數(shù)據(jù)時(shí),在應(yīng)用程序側(cè)進(jìn)行判斷,確定要訪問和操作的數(shù)據(jù)庫和數(shù)據(jù)庫表,然后進(jìn)行訪問和操作。此方案的問題是應(yīng)用和數(shù)據(jù)耦合度高,應(yīng)用需要清楚了解自己所操作數(shù)據(jù)的位置(哪個(gè)分庫、哪個(gè)分表),當(dāng)數(shù)據(jù)量增加,數(shù)據(jù)庫、數(shù)據(jù)庫表進(jìn)行擴(kuò)展時(shí),如增加新數(shù)據(jù)庫、增加新數(shù)據(jù)庫表,都需要對應(yīng)用程序進(jìn)行改造,以訪問和操作新增加的數(shù)據(jù)庫、新的數(shù)據(jù)庫表,改造的工作量較大、工期長、風(fēng)險(xiǎn)較高。
本方案提出一種數(shù)據(jù)庫代理裝置,它由幾部分組成:(1)數(shù)據(jù)庫掃描模塊;(2)分庫分表策略存儲模塊;(3)SQL 語句接收和解析模塊;(4)SQL 語句執(zhí)行模塊;(5)結(jié)果返回模塊。
數(shù)據(jù)庫掃描模塊通過數(shù)據(jù)庫連接池訪問底層的多個(gè)數(shù)據(jù)庫,將掃描結(jié)果進(jìn)行分析處理,形成數(shù)據(jù)庫分庫、分表信息,將這些信息存儲到分庫分表策略存儲模塊。前端應(yīng)用需要進(jìn)行SQL 語句執(zhí)行時(shí),首先訪問數(shù)據(jù)庫代理裝置的SQL 語句接收和解析模塊,提供需要執(zhí)行的SQL 語句,此模塊通過對SQL 語句進(jìn)行解析,獲取要訪問的數(shù)據(jù)庫對象信息,通過與分庫分表策略存儲模塊進(jìn)行交互,轉(zhuǎn)化成具體要訪問的實(shí)體數(shù)據(jù)庫和表,將解析結(jié)果傳遞給SQL 語句執(zhí)行模塊,通過數(shù)據(jù)庫連接池,連接到具體的分?jǐn)?shù)據(jù)庫,完成SQL 的執(zhí)行,將執(zhí)行結(jié)果記錄,并通過結(jié)果返回模塊與前端應(yīng)用進(jìn)行交互,將SQL 語句執(zhí)行結(jié)果返回給前端應(yīng)用。
詳細(xì)處理步驟如下:
步驟101:為數(shù)據(jù)庫代理裝置中數(shù)據(jù)庫掃描模塊創(chuàng)建連接池,與底層多個(gè)小的分?jǐn)?shù)據(jù)庫進(jìn)行鏈接,能否進(jìn)行訪問。
步驟102:數(shù)據(jù)庫掃描模塊通過連接池,能夠訪問底層的各個(gè)小的數(shù)據(jù)庫,并可以訪問各個(gè)小的數(shù)據(jù)庫的數(shù)據(jù)庫對象(如數(shù)據(jù)庫表)。
步驟103:數(shù)據(jù)庫掃描模塊掃描底層數(shù)據(jù)庫,獲取分庫分表信息。
如一個(gè)完整的數(shù)據(jù)庫對象,通過之前人為定義的分庫分表路由策略,數(shù)據(jù)庫掃描模塊按照策略進(jìn)行掃描,最終確定每一個(gè)數(shù)據(jù)庫對象保存在哪幾個(gè)數(shù)據(jù)庫,或者保存在哪些分表中,包括數(shù)據(jù)庫名稱、分表的名稱。
步驟104:數(shù)據(jù)庫掃描模塊掃描的結(jié)果與上次相比是否發(fā)生了變化?如新增數(shù)據(jù)庫、新增數(shù)據(jù)庫對象等。
步驟105:如果發(fā)生了變化,則由數(shù)據(jù)庫掃描模塊更新分庫、分表信息到分庫分表策略存儲模塊。同時(shí)也提供手工訪問更新的功能。
步驟106:如未發(fā)生變化,則記錄掃描日志記錄后,不再進(jìn)行處理。
步驟107:當(dāng)應(yīng)用程序需要訪問數(shù)據(jù)庫執(zhí)行SQL 語句時(shí),首先訪問數(shù)據(jù)庫代理層的SQL 語句接收和解析模塊。
步驟108:SQL 語句接收和解析模塊接收SQL 語句,應(yīng)用程序不再需要指明要訪問哪個(gè)分庫、哪個(gè)分表,只要指明訪問的數(shù)據(jù)即可。
步驟109:SQL 語句接收和解析模塊與分庫分表策略存儲模塊通信,獲取實(shí)時(shí)的數(shù)據(jù)庫分庫、分表策略信息。
步驟110:SQL 語句接收和解析模塊對SQL 訪問數(shù)據(jù)庫及表進(jìn)行解析匹配,將訪問對象轉(zhuǎn)換成具體訪問的數(shù)據(jù)庫名、數(shù)據(jù)庫分表名稱等信息。
步驟111:SQL 語句接收和解析模塊將SQL 解析結(jié)果傳遞給SQL 執(zhí)行模塊。
步驟112:SQL 執(zhí)行模塊通過數(shù)據(jù)庫連接池,訪問具體的分?jǐn)?shù)據(jù)庫和分表,將SQL 語句完整執(zhí)行,獲取最終執(zhí)行結(jié)果。
并將執(zhí)行結(jié)果傳遞給結(jié)果返回模塊,由結(jié)果返回模塊與應(yīng)用進(jìn)行通信,并將具體的SQL 執(zhí)行結(jié)果返回給前端應(yīng)用,由應(yīng)用進(jìn)行處理。
本方案的優(yōu)點(diǎn):應(yīng)用程序側(cè)不再需要指定要訪問的哪個(gè)數(shù)據(jù)庫,哪個(gè)具體的表,只需要明確訪問的數(shù)據(jù)內(nèi)容,由數(shù)據(jù)庫代理層通過內(nèi)部的相關(guān)模塊,獲取訪問數(shù)據(jù)庫、表的策略,獲取訪問路徑,這樣當(dāng)分?jǐn)?shù)據(jù)庫、數(shù)據(jù)庫分表發(fā)生變化時(shí),也不再需要通知應(yīng)用程序,由策略存儲模塊提供訪問策略,進(jìn)行訪問及操作。
在IT 軟件系統(tǒng)中,針對某些數(shù)據(jù)庫表數(shù)據(jù)量過大的情況,分散存儲在不同的數(shù)據(jù)庫,不同的表中。本方法通過提出一套數(shù)據(jù)庫代理裝置,有效解決了應(yīng)用軟件與數(shù)據(jù)庫耦合性高的問題。