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