石明翔 田濟瑋 李文齊 郭學節
摘? 要: 為了解決企業中由于異構數據庫增多而帶來的管理難度增加、運維成本高漲等問題,設計實現了基于云服務的異構數據庫管理系統,采用面向服務的SOA架構,分為應用層、云數據庫應用服務接口、任務調度層、云數據庫數據處理接口和云數據庫等五層,能夠對Docker環境下的異構數據庫完成創建、管理、讀寫、分析等操作,為用戶提供了一種高效方便的異構數據庫管理工具。
關鍵詞: 云服務; 異構數據庫; Docker; 數據庫管理系統
中圖分類號:TP391? ? ? ? ? 文獻標志碼:A? ? ?文章編號:1006-8228(2018)12-25-04
Abstract: In order to solve the problems such as increased management difficulty and high operation and maintenance cost caused by the increase of heterogeneous databases in enterprises, this paper designed and implemented a cloud service based heterogeneous database management system. The system adopts a service-oriented SOA architecture, which is divided into five layers, namely, application layer, cloud database application service interface, task scheduling layer, cloud database data processing interface and cloud database. It is able to complete the creation, management, reading and writing, analysis and other operations of heterogeneous database in Docker environment, providing users with an efficient and convenient heterogeneous database management.
Key words: cloud service; heterogeneous database; Docker; DBMS
0 引言
近年來,隨著信息化建設不斷深入,各企事業單位的數據信息呈幾何倍數增長,從一兩個數據庫增長為多個甚至幾十個不同種類、不同結構的數據庫,而庫與庫之間又有很多業務交叉點,一個數據庫的數據更新可能會影響到多個數據庫。同時,數據庫的多樣化帶來了諸多問題:一是不同種類的數據庫對系統的軟硬件環境有著不同要求;二是數據庫的異構也增加了管理難度,要求管理人員不僅要熟悉多種數據庫的接口,而且在管理不同數據庫時也要投入大量時間。這些問題導致了數據庫運維成本不斷增加,異構數據庫的整合和管理變得迫在眉睫。
本文主要依托于Docker技術,將多種不同種類的主流數據庫(Oracle、SqlServer、Mysql)部署在云平臺上,并開發基于云服務的異構數據庫管理系統,能夠對異構數據庫完成快速創建、表數據快速錄入、全文檢索、一鍵查詢、查詢模版管理、多表查詢、統計分析、導入導出等操作。系統還設置了用戶管理、權限管理、選擇數據管理、分級數據管理等主要模塊,增加了系統安全性,不但為用戶提供了一種清晰、方便的異構數據庫管理分析工具,還對提高數據庫的使用效率,降低企業人工成本有著很高的實際意義。
1 關鍵技術研究與介紹
本系統利用Java語言進行開發,采用面向服務的SOA架構,主要涉及云數據庫虛擬化、數據交換格式、云數據庫服務應用接口開發等技術。
1.1 云數據庫虛擬化
將多種異構數據庫部署到云端一般使用虛擬化技術,傳統是將不同的數據庫安裝到對應的虛擬機中,但虛擬機技術實際上是在原有操作系統中安裝獨立的OS并利用Hypervisor技術虛擬出CPU、內存、IO等設備來達到資源隔絕的目的,因此,存在耗費資源較大、訪問內存效率較低等問題[1-2]。
而近年出現的虛擬容器與虛擬機有著完全不同的實現原理,以Docker為例,它不必再安裝獨立的OS,而是使用更輕量級的LXC(Linux Containers)將虛擬機進程偽裝為HOST進程,并利用命名空間(NameSpace)和群組控制(Cgroups)完成各個Docker進程間的隔離及資源分配,并且所有Docker共享宿主機的內核與硬件[3]。虛擬容器相比虛擬機有著讀寫內存效率高、啟動時間快及資源利用率高等優勢,同時獨有的鏡像發布也使應用的安裝、備份和遷移變得更為便捷[4],因此本文使用Docker技術將Mysql、Oracle、SqlServer三種數據庫部署到云端。
1.2 數據交換格式
JSON(JavaScript Object Notation)是由歐洲計算機協會于1999年制定的ECMAScript中的一個子集,采用輕量級的“名值對”集合來表示和存儲數據[5],具備跨平臺、跨語言、易解析、體積小等優點,比傳統的XML更適合大數據量的網絡傳輸[6],因此本文選用JSON作為異構數據庫結果的表示格式。
1.3 云數據庫服務接口開發
本文使用基于HTTP協議的輕量級架構Restful WebService開發應用服務層接口,相比于傳統的SOAP WebService具有簡潔、高效、操作性強等優勢[7],并且Restful是一種面向資源的服務,其創建、獲取、修改、刪除資源的操作對應著HTTP協議提供的PUT、GET、POST及DELETE方法,這種針對WEB應用的設計方式,可以減小系統復雜度和耦合性,提升軟件的可擴展性[8]。
2 系統架構及工作流程
本系統由應用服務層、云數據庫應用服務接口、任務調度層、云數據庫處理接口和Docker化的云數據庫層等三層兩個接口構成,系統架構如圖1所示。
<E:\方正創藝5.1\Fit201812\圖\smx圖1.tif>
圖1? 系統架構圖
用戶從應用層發出的操作請求首先提交到云數據庫應用服務接口,該接口會利用異構語義解析技術將用戶請求解析成不同的邏輯操作集合并發送到任務調度層。任務調度層會將這些集合轉換為對應的處理任務后發送給云數據庫處理接口,該接口會將不同的子任務按對應數據源分發到不同數據庫進行執行,最后將返回結果利用異構結果合成技術進行轉換后以JSON格式發送至客戶端。
3 系統實現
3.1 應用層
應用層為系統前端,主要負責與用戶進行直接交互,包括創建服務、創建數據庫、創建數據表、數據管理、分級表管理、選擇表管理、數據查詢、多表查詢、統計分析、用戶角色管理等功能,可以把用戶的操作請求通過Http協議發送到云數據庫應用服務接口進行處理,并將反饋結果呈現給用戶。
3.2 云數據庫應用服務接口
云數據庫應用服務接口位于服務器端,以Restful WebService形式統一向外提供調用服務,主要包括用戶操作語句解析和查詢結果表示等功能。本接口的核心為操作語句解析模塊,當模塊收到應用層發來的操作請求后,會根據不同的數據源將請求解析成對應的邏輯操作子集合(例如:選擇、連接、聚合等),并發送到任務調度層進行執行,待執行結果返回后再以JSON格式回傳給應用層。其工作流程如圖2所示。
3.3 任務調度層
任務調度層為系統緩沖層,主要負責接收云數據庫應用服務接口發送來的邏輯操作子集合,并根據對應的數據源將其轉換為處理任務后進行判斷:如果是非實時任務則放入緩沖區等待;如果是實時任務則放入執行區,并依據先到先服務原則(FIFO)交由下一層進行處理。其處理流程如圖3所示。
任務調度層的主要功能有以下。
⑴ 任務區管理
任務區主要包括執行區(實時任務排隊)和緩沖區(非實時任務排隊)。操作任務被分類后加入相應任務區中排隊等待,如有新的任務提交或處理,任務管理模塊會更新隊列結構。
⑵ 任務提取
任務區中的數據結構采用隊列(先進先出)結構,每當有新的請求到來時,任務管理模塊會從對應的隊列頭部提取任務并提交。
⑶ 處理非實時任務
所有的非實時任務都會有時間戳屬性,當執行時間到達時,任務管理模塊會將該任務轉換為實時任務后提交給判斷模塊進行處理。
⑷ 處理實時任務
為了降低下層數據庫處理接口的負載,所有實時任務在被處理前會加入任務執行區,任務管理模塊會依據下層接口的處理速度,從執行區取出待處理任務進行提交。
3.4 云數據庫數據處理接口
該層為整個系統的核心,負責將上層執行任務解析成不同數據庫的sql語句并執行,再將執行結果合成后上傳到任務調度層。主要有異構語義映射和查詢結果合成兩個模塊。
⑴ 異構語義映射
目前對關系數據庫的操作主要通過結構化查詢語言(SQL)來完成,但是不同數據庫產商在實現時并沒有嚴格執行ANSI(美國國家標準化組織)標準,這就導致不同數據庫所支持的SQL語句在很多細節方面有所差異,以查看表結構為例,SqlServer語法是exec sp_help @tablename,Oracle語法為desc @tablename,MySql語法為describe @tablename。此外,三種數據庫還在修改表名、修改列名、添加約束以及各種函數使用上存在諸多差異[9]。
為了能讓用戶操作被不同數據庫正確執行,異構語義映射模塊可以將上層傳入的操作任務通過識別后轉換為對應數據庫所支持的sql語句,并交由相應的數據源進行執行。其核心類圖如圖4所示。
① DBConnection類:數據庫連接類。getConnection方法用于返回不同數據庫的連接。
② DBOperate接口:數據庫操作接口。convertSql用法用于將操作任務轉換為不同數據庫的sql語句,execQuery方法用于執行查詢操作,execNonQuery方法用于執行刪除、更新等非查詢操作。DBOperate接口的實現類為MySqlOperate、OracleOperate和SqlServerOperate,主要用于對MySql、Oracle、SqlServer等數據庫進行操作。
③ SemanticMapping類:異構語義映射類。receiveTask方法用于接收上一層發送的數據庫操作任務,operate方法用于執行操作任務,sendResult方法用于將數據庫查詢結果返回任務調度層。
⑵ 查詢結果合成
查詢結果合成模塊主要將異構數據庫返回的結果合成為具有相同格式的結果集,再以JSON形式返回給任務調度層。其主要步驟如下。
① 查詢結果合成模塊通過MySqlOperate、OracleOperate、SqlServerOperate等數據庫操作類獲取異構數據源數據。
② 利用Mybatis框架中的ORM技術將數據庫表映射為Java的POJO對象,其中數據表的列被映射為對象屬性,數據表的各行記錄被轉換為各個持久化對象。
③ 利用基于哈希表的集合差集算法去除記錄集中的重復值并進行合并。算法的核心代碼如下:
HashMap differenceFilter(HashMap<String, String>
map1,HashMap
HashMap resultMap=(HashMap)map1.clone();
//將map1中的所有記錄拷貝至resultMap
Iterator<Entry<String, Integer>> it1=
map1.entrySet().iterator();
while(it1.hasNext()) { //通過遍歷,找出存在于map2但不
存在于map1中的所有記錄,并添加到resultMap中
Entry<String, String> entry1=it1.next();
String value2=tempMap.get(entry1.getKey());
if(value2==null||(!value2.equals(entry1.getValue()))) {
resultMap.put(entry1.getKey(),entry1.getValue());
}
}
return resultMap;
}
④ 將最終結果表示為JSON格式,返回給任務調度層。
4 結束語
本文依托于云計算平臺,利用Docker虛擬容器技術將三種不同的異構數據庫部署到云端,并綜合應用Java、JSON、Restful Webservice和Mybatis等技術設計并實現了“基于云服務的異構數據庫管理系統”,用于對異構數據庫管理和操作。在系統實現過程中,重點解決了異構語義映射、異構結果合成、異構數據信息表示等技術難題。通過測試對比分析證明了系統無論是在運行效率還是可擴展性上都有良好的表現。
參考文獻(References):
[1] 柯偉.異構數據庫中表的相似性查詢系統設計與實現[D].華中科技大學,2016.
[2] 汪青峰.面向多業務的異構數據庫中間件的設計與實現[D].北京郵電大學,2016.
[3] 杜寶麗.基于Docker的云數據庫服務系統的設計與實現[D].西安電子科技大學,2015.
[4] 王男.面向證券業務系統的虛擬化測試平臺的研究[D].吉林大學,2015.
[5] JSON[EB/OL].http://json.org/json-zh.html
[6] XML[EB/OL].https://en.wikipedia.org/wiki/XML
[7] 王曉瑞.基于SOA的分布式異構數據庫數據信息同步系統的研究與應用[D].河南大學,2016.
[8] 萬一東,謝俊岱.云計算環境下異構數據庫整合技術的研究與實現[J].電腦知識與技術,2013.5:3232-3235
[9] 熊現.基于JAVA_XML 的異構數據同步系統的設計和實現[D].上海交通大學,2007.