劉小春
(信息工程大學(xué),河南 鄭州 450052)
從1970 年美國(guó)IBM 公司的E.F.Codd 提出關(guān)系模型以來(lái),關(guān)系數(shù)據(jù)庫(kù)以其具有概念單一、存取路徑對(duì)用戶透明、數(shù)據(jù)獨(dú)立性好等優(yōu)勢(shì),在各個(gè)應(yīng)用領(lǐng)域都為數(shù)據(jù)庫(kù)用戶提供了對(duì)結(jié)構(gòu)化數(shù)據(jù)的簡(jiǎn)單、健壯、靈活、高效的組織和管理方法,對(duì)于空間數(shù)據(jù)的存儲(chǔ)和管理,又催生出許多對(duì)象關(guān)系數(shù)據(jù)庫(kù),如Oracle11g 提供了管理多維矢量數(shù)據(jù)和柵格數(shù)據(jù)的對(duì)象機(jī)制,使用戶對(duì)復(fù)雜空間數(shù)據(jù)的管理像對(duì)關(guān)系數(shù)據(jù)的管理一樣簡(jiǎn)單易用,基于數(shù)據(jù)庫(kù)也易于滿足網(wǎng)絡(luò)應(yīng)用的共享性、保密性和并發(fā)性。
目前,情形有些變化,在分布式環(huán)境下,對(duì)于數(shù)量不斷增長(zhǎng)的應(yīng)用程序而言,應(yīng)用和數(shù)據(jù)的可伸縮性日益重要,對(duì)非結(jié)構(gòu)和半結(jié)構(gòu)數(shù)據(jù)的管理要求越來(lái)越高,在Internet 網(wǎng)絡(luò)空間應(yīng)用環(huán)境中,應(yīng)用服務(wù)器、數(shù)據(jù)服務(wù)器承受大規(guī)模工作負(fù)荷的應(yīng)用的情況下,數(shù)據(jù)服務(wù)器負(fù)載不斷提升的情況下,采用諸如Oracle 數(shù)據(jù)庫(kù)服務(wù)器會(huì)遇到越來(lái)越多的困難,需要解決越來(lái)越多的難題,如海量空間數(shù)據(jù)中心有1 臺(tái)負(fù)載均衡數(shù)據(jù)庫(kù)服務(wù)器和20 臺(tái)數(shù)據(jù)庫(kù)服務(wù)器,負(fù)載每日劇增,如何快速升級(jí)硬件及重新部署數(shù)據(jù)以滿足快速增長(zhǎng)數(shù)據(jù)需求的需要。
關(guān)系數(shù)據(jù)庫(kù)的可伸縮性在單臺(tái)服務(wù)器上能較好地得到體現(xiàn),但一旦單服務(wù)器的負(fù)載達(dá)到極點(diǎn),必須通過(guò)多臺(tái)數(shù)據(jù)庫(kù)服務(wù)器來(lái)提供服務(wù),這時(shí)多節(jié)點(diǎn)服務(wù)器會(huì)遇到管理復(fù)雜性、數(shù)據(jù)一致性復(fù)雜性、數(shù)據(jù)共享復(fù)雜性、數(shù)據(jù)存儲(chǔ)復(fù)雜性等問(wèn)題,這些問(wèn)題嚴(yán)重影響了數(shù)據(jù)庫(kù)應(yīng)用規(guī)模。在分布式網(wǎng)絡(luò)環(huán)境中,對(duì)關(guān)系數(shù)據(jù)庫(kù)的要求更高,要能支持分布式事務(wù)管理、分布式并行操作和分布式存儲(chǔ)等。對(duì)于海量空間數(shù)據(jù)的組織管理,需要高效強(qiáng)大的存儲(chǔ)和管理機(jī)制,有效實(shí)現(xiàn)空間數(shù)據(jù)的組織、存儲(chǔ)、管理和檢索,以滿足分布式網(wǎng)絡(luò)環(huán)境中大量用戶的并發(fā)頻繁訪問(wèn)。
Google Earth 在應(yīng)用中沒(méi)有使用傳統(tǒng)的對(duì)象關(guān)系數(shù)據(jù)庫(kù)部署數(shù)據(jù),而是開發(fā)了一個(gè)用于滿足大規(guī)模的分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)BigTable,用于存儲(chǔ)海量數(shù)據(jù)和高校檢索數(shù)據(jù),BigTable 是基于鍵/值的一種新的數(shù)據(jù)模型,有效解決了Google 應(yīng)用環(huán)境下的海量數(shù)據(jù)存儲(chǔ)和高效服務(wù),對(duì)各種海量多源空間數(shù)據(jù)進(jìn)行了科學(xué)的組織[1]。為此,本文研究了數(shù)據(jù)在Oracle 和BigTable 中的存儲(chǔ)結(jié)構(gòu),并對(duì)兩種結(jié)構(gòu)各自的優(yōu)缺點(diǎn)進(jìn)行了分析。
Oracle 系統(tǒng)是分布式對(duì)象關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),對(duì)于空間位置數(shù)據(jù)和屬性數(shù)據(jù)可以以面向?qū)ο蟮姆绞揭惑w化存儲(chǔ)、組織管理,支持在Windows、Linux、Unix 多種操作系統(tǒng)環(huán)境下使用,支持Oracle SQL* NET TCP/IP 的通信模式[2]。Oracle RDBMS可以部署在分布式網(wǎng)絡(luò)環(huán)境中,通過(guò)結(jié)點(diǎn)事務(wù)一致性和全局事務(wù)一致性,可以實(shí)現(xiàn)結(jié)點(diǎn)自治和全局同步[3]。
Oracle 的邏輯結(jié)構(gòu)由表空間、數(shù)據(jù)段、數(shù)據(jù)區(qū)間和數(shù)據(jù)塊組成。一個(gè)Oracle 數(shù)據(jù)庫(kù)從邏輯上說(shuō)是由一個(gè)或多個(gè)表空間所組成,每個(gè)表空間包含多個(gè)數(shù)據(jù)文件,每一個(gè)數(shù)據(jù)文件僅能屬于一個(gè)表空間,Oracle 的邏輯對(duì)象保存在表空間中,表空間是數(shù)據(jù)庫(kù)中的數(shù)據(jù)倉(cāng)庫(kù),數(shù)據(jù)庫(kù)的表、索引、視圖等邏輯對(duì)象均保存在表空間中,表空間的大小取決于所屬的數(shù)據(jù)文件大小,每一個(gè)表空間由若干段(segment)組成,一個(gè)段由一組區(qū)(extent)組成,一個(gè)區(qū)又由一組連續(xù)的數(shù)據(jù)塊組成,數(shù)據(jù)塊的大小一般是操作系統(tǒng)數(shù)據(jù)塊大小的整數(shù)倍。
圖1 是Oracle 邏輯結(jié)構(gòu)與物理結(jié)構(gòu)的對(duì)應(yīng)關(guān)系,物理結(jié)構(gòu)是邏輯結(jié)構(gòu)在物理上的體現(xiàn),主要包括數(shù)據(jù)庫(kù)、物理文件和物理塊。
圖1 Oracle 數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)Fig.1 The logical and physical structure of Oracle database
表1 和表2 描述了以道路表為例的數(shù)據(jù)庫(kù)的存儲(chǔ)模型,道路表中按行存儲(chǔ)有道路的道路類型、寬度、小巷數(shù)量、道路名等屬性數(shù)據(jù),幾何數(shù)據(jù)字段中存儲(chǔ)有道路的矢量數(shù)據(jù),而道路表中的道路類型ID 列是外鍵字段。道路表和道路類型表構(gòu)成主外鍵關(guān)系,在道路表中既存儲(chǔ)有道路的幾何位置數(shù)據(jù),又存儲(chǔ)有道路的屬性數(shù)據(jù),實(shí)現(xiàn)了空間位置數(shù)據(jù)和屬性數(shù)據(jù)的一體化存儲(chǔ)。
表1 道路表Tab.1 Road table
表2 道路類型表Tab.2 Road type table
基于數(shù)據(jù)庫(kù)的分布式應(yīng)用中,可以采用負(fù)載均衡服務(wù)器、多數(shù)據(jù)服務(wù)器、分區(qū)表及分區(qū)表索引、數(shù)據(jù)庫(kù)鏈路、分區(qū)內(nèi)空間聚簇[4]等方法解決海量空間數(shù)據(jù)的海量存儲(chǔ)和高效檢索問(wèn)題。
BigTable 數(shù)據(jù)模型是一個(gè)有序的分布式多維表結(jié)構(gòu),能滿足結(jié)構(gòu)化或半結(jié)構(gòu)化的海量數(shù)據(jù)存儲(chǔ),提供了從關(guān)鍵字到數(shù)據(jù)值的映射關(guān)系,用行關(guān)鍵字、列關(guān)鍵字、時(shí)間戳三元組和內(nèi)容來(lái)表示,可利用行關(guān)鍵字、列關(guān)鍵字和時(shí)間戳對(duì)數(shù)據(jù)進(jìn)行索引[5]。
BigTable 按照行關(guān)鍵字對(duì)表的行進(jìn)行排序,并且動(dòng)態(tài)將數(shù)據(jù)行分割成若干個(gè)行空間,一個(gè)行區(qū)間稱作一個(gè)Tablet,由專門的服務(wù)器對(duì)多個(gè)Tablet 進(jìn)行管理。
圖2 是BigTable 的體系結(jié)構(gòu)。BigTable 主要包括3 部分[6]:一個(gè)ClientLib 組件部署在客戶端;一個(gè)主服務(wù)器(Master);多個(gè)Tablet 服務(wù)器(TabletServer)。BigTable 不支持完整的關(guān)系模型,但是建立在GFS 文件系統(tǒng)上容易實(shí)現(xiàn)分布式存儲(chǔ)海量數(shù)據(jù),存儲(chǔ)數(shù)據(jù)文件和日志文件,使用Chubby 提供鎖服務(wù),Chubby 是一個(gè)序列化的分布式鎖組件,使用Paxos 算法保證數(shù)據(jù)副本的一致性,系統(tǒng)根據(jù)負(fù)載變化,動(dòng)態(tài)添加或者刪除Tablet 服務(wù)器。
圖2 BigTable 體系結(jié)構(gòu)圖Fig.2 BigTable architecture chart
ClientLib 部署在客戶端,通過(guò)API 向客戶端程序提供統(tǒng)一操作的調(diào)用接口,并且在客戶端緩存讀到的數(shù)據(jù),以加快處理速度。每個(gè)Tablet 服務(wù)器對(duì)一組Tablet 進(jìn)行管理,Tablet 服務(wù)器主要是處理客戶端對(duì)Tablet 的讀寫請(qǐng)求,并對(duì)Tablet 進(jìn)行分割。Master 服務(wù)器中存儲(chǔ)Tablet 服務(wù)器的狀態(tài),通過(guò)狀態(tài)可判斷哪些Tablet 服務(wù)器活躍,進(jìn)而獲得哪些Tablet 分配給哪些Tablet服務(wù)器,哪些Tablet 沒(méi)有分配。Master 實(shí)現(xiàn)了均衡Tablet 服務(wù)器的負(fù)載,對(duì)Tablet 進(jìn)行有效的管理,并對(duì)垃圾GFS 文件進(jìn)行回收管理。
在BigTable 系統(tǒng)中,每個(gè)表由多個(gè)數(shù)據(jù)塊(Tablet)和結(jié)構(gòu)信息(Schema)組成,如圖3 所示。主服務(wù)器Master 負(fù)責(zé)管理表結(jié)構(gòu)信息,Chubby 組件對(duì)其進(jìn)行存儲(chǔ),保證數(shù)據(jù)一致性,Tablet服務(wù)器負(fù)責(zé)管理數(shù)據(jù)塊,GFS 文件系統(tǒng)用于管理數(shù)據(jù)塊的內(nèi)容。
圖3 BigTable 表的結(jié)構(gòu)圖Fig.3 The structure chart of BigTable table
表數(shù)據(jù)以Tablet 數(shù)據(jù)塊的形式分布在不同的服務(wù)器上,Tablet 的位置信息保存在元數(shù)據(jù)表中,這既實(shí)現(xiàn)了數(shù)據(jù)的分布存儲(chǔ),也提高了數(shù)據(jù)并發(fā)訪問(wèn)性能。在讀寫數(shù)據(jù)操作之前需要查找元數(shù)據(jù)表,確定數(shù)據(jù)塊的位置,然后再進(jìn)行讀寫,如果查詢涉及多個(gè)位置的Tablet 服務(wù)器,需要將結(jié)果整合后提供給用戶使用,當(dāng)然這個(gè)過(guò)程對(duì)用戶是完全透明的。BigTable 使用類似B+樹的3 層結(jié)構(gòu)[5]來(lái)存儲(chǔ)Tablet 的位置信息,如圖4 所示。
圖4 Tablet 位置層次結(jié)構(gòu)圖Fig.4 Tablet location hierarchy chart
圖4 中元數(shù)據(jù)表以分層的形式存儲(chǔ)Tablet 的位置信息,圖中方框部分是BigTable 集群中的分層元數(shù)據(jù)表。每個(gè)元數(shù)據(jù)塊保存著一組下層數(shù)據(jù)塊的位置信息。
BigTable 鍵/值數(shù)據(jù)庫(kù)應(yīng)用越來(lái)越廣泛,但是關(guān)系數(shù)據(jù)庫(kù)還在大量使用,兩種存儲(chǔ)模型各有優(yōu)劣,主要表現(xiàn)在這些方面:
1)BigTable 鍵/值存儲(chǔ)模型簡(jiǎn)單,從可伸縮性上比關(guān)系模型要好很多,但是值數(shù)據(jù)不區(qū)分,全部作為字符串來(lái)存儲(chǔ),為用戶程序解析帶來(lái)了較大的麻煩。
2)從面向?qū)ο蠼嵌瓤?,關(guān)系數(shù)據(jù)庫(kù)逐漸支持面向?qū)ο髷?shù)據(jù)存儲(chǔ),而鍵/值的存儲(chǔ)模型面向?qū)ο笮暂^差,在存儲(chǔ)有面向?qū)ο筇攸c(diǎn)的海量空間上支持較弱,不利于空間分析和空間索引的創(chuàng)建。
3)鍵/值數(shù)據(jù)庫(kù)目前主要用于更新操作少、查詢操作多的應(yīng)用,并且在連接查詢上支持較弱,相比較而言,基于數(shù)據(jù)庫(kù)存儲(chǔ)結(jié)構(gòu)在連接查詢和數(shù)據(jù)更新方面都比較方便。
4)BigTable 數(shù)據(jù)模型具有較強(qiáng)大的擴(kuò)充能力,提供了基于相對(duì)廉價(jià)的存儲(chǔ)設(shè)備實(shí)現(xiàn)高效存儲(chǔ)的方案,基于BigTable 容易實(shí)現(xiàn)根據(jù)用戶需求分配存儲(chǔ)和計(jì)算資源,實(shí)現(xiàn)了按需分配,隨著用戶需求增長(zhǎng),配額能隨之而增,整個(gè)存儲(chǔ)空間的大小基本不受限制。而對(duì)于Oracle 等對(duì)象關(guān)系數(shù)據(jù)庫(kù),雖然可以分布式部署,但是當(dāng)單個(gè)的數(shù)據(jù)庫(kù)服務(wù)器不能滿足劇增的用戶需求時(shí),配備硬件和軟件環(huán)境都需要付出高額費(fèi)用,并且隨之而來(lái)的還有管理復(fù)雜性等問(wèn)題的出現(xiàn)。
5)關(guān)系數(shù)據(jù)庫(kù)通過(guò)設(shè)立主鍵、外鍵等完整性約束機(jī)制基本能保證數(shù)據(jù)在最低層次擁有完整性一致性。違反完整性約束的數(shù)據(jù)不能存入數(shù)據(jù)庫(kù)中,更新的數(shù)據(jù)違反完整性約束也不能更新,刪除數(shù)據(jù)違反完整性約束也不能刪除,這些機(jī)制較好地保障了數(shù)據(jù)庫(kù)中數(shù)據(jù)的完整性一致性。但在鍵/值數(shù)據(jù)庫(kù)中不存在這些機(jī)制,需要通過(guò)應(yīng)用程序進(jìn)行控制,但是程序往往是不健全的,或者部分用戶提交的代碼是不健全的,沒(méi)有考慮完備的數(shù)據(jù)完整性機(jī)制,難以確保入庫(kù)數(shù)據(jù)的完整性,并且從應(yīng)用程序的角度來(lái)考慮,提高了軟件開發(fā)的難度和代碼量。
6)關(guān)系數(shù)據(jù)庫(kù)的建立往往基于數(shù)據(jù)建模,而數(shù)據(jù)建模在很大程度上對(duì)應(yīng)用程序開發(fā)是獨(dú)立的,這意味著多個(gè)應(yīng)用程序可以使用同一數(shù)據(jù)集,應(yīng)用邏輯的改變也不影響底層的數(shù)據(jù)模型,但是鍵/值數(shù)據(jù)庫(kù)要想實(shí)現(xiàn)這種獨(dú)立性,顯然比較困難。
7)BigTable 不是行存儲(chǔ),而是列存儲(chǔ),以道路表的數(shù)據(jù)存儲(chǔ)為例,對(duì)于傳統(tǒng)的DBMS,它在磁盤上是按照記錄存儲(chǔ)數(shù)據(jù),格式如下:
Table 中的每一行(即每一條記錄)在磁盤上是緊密排列的,也就是按行進(jìn)行存儲(chǔ)的。一般最常用的Database,如MySQL,Oracle 等,都屬于此類。
而在列存儲(chǔ)方式中則不同,對(duì)于道路表,它的列存儲(chǔ)邏輯結(jié)構(gòu),如表3 所示。它將表中的每一列的數(shù)據(jù)項(xiàng)放在了一起。實(shí)際中列存儲(chǔ)會(huì)更復(fù)雜一些,還要存儲(chǔ)行關(guān)鍵字、列關(guān)鍵字、時(shí)間戳及列的內(nèi)容,早期的數(shù)據(jù)庫(kù)主要為滿足OLTP 的需求,大部分的操作都是插入刪除,行存儲(chǔ)自然成為最適合的方案,因?yàn)椴捎眯写鎯?chǔ)可以很容易的找到一個(gè)記錄所包含的所有數(shù)據(jù)。但是,在當(dāng)前海量數(shù)據(jù)的情況下,OLAP 的需求越來(lái)越大,相當(dāng)多復(fù)雜的查詢,列存儲(chǔ)在這種情況下就很有優(yōu)勢(shì)。
表3 BigTable 中的道路表Tab.3 Road table in BigTable
表3 在磁盤上按列存儲(chǔ)的結(jié)構(gòu)如下:
1 水泥
2 柏油
3 土路
1 60
2 40
3 30
…
8)BigTable 數(shù)據(jù)庫(kù)不像關(guān)系數(shù)據(jù)庫(kù),并沒(méi)有多少辦法去共享標(biāo)準(zhǔn)。BigTable、Hyptertable、HBase 這些鍵/值數(shù)據(jù)庫(kù)都相似,但是API 卻不同,均具有特定的訪問(wèn)接口。這種情況下,你選用哪種數(shù)據(jù)庫(kù),主要依賴于你對(duì)于哪類數(shù)據(jù)庫(kù)的信任程度,另外,從成熟度來(lái)說(shuō),成熟的關(guān)系數(shù)據(jù)庫(kù)比鍵/值數(shù)據(jù)庫(kù)可靠性更強(qiáng)些。
通過(guò)研究空間數(shù)據(jù)在關(guān)系數(shù)據(jù)庫(kù)和BigTable 數(shù)據(jù)庫(kù)中的存儲(chǔ)模型,以及兩種存儲(chǔ)模型的優(yōu)缺點(diǎn),可以看出:目前BigTable數(shù)據(jù)存儲(chǔ)機(jī)制并不能完全替代關(guān)系數(shù)據(jù)庫(kù),對(duì)象關(guān)系數(shù)據(jù)庫(kù)以其使用簡(jiǎn)單,容易共享、并發(fā)等特性,在許多應(yīng)用中還有其獨(dú)特的優(yōu)勢(shì),但BigTable 作為一種鍵/值數(shù)據(jù)庫(kù)代表,在大規(guī)模分布式應(yīng)用環(huán)境下將會(huì)大放光彩。
[1] 蔡磊,龔健雅.分布式海量空間數(shù)據(jù)的組織與網(wǎng)絡(luò)可視化[J]. 測(cè)繪信息工程,2009,34(6):28 -30.
[2] 劉勇,壽春法,印潔,等.城市GIS 社會(huì)化應(yīng)用中的分布式數(shù)據(jù)組織方法研究[J].測(cè)繪科學(xué),2007(11):96 -98.
[3] 羅艷秋,張書艷. 基于Oracle 的GIS 數(shù)據(jù)庫(kù)的分布式設(shè)計(jì)與實(shí)現(xiàn)[J].中國(guó)科技信息,2005(9):18 -20.
[4] 馮杭建,劉南,劉仁義.Linux 環(huán)境下基于Oracle Spatial 的分布式海量空間數(shù)據(jù)處理平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 計(jì)算機(jī)應(yīng)用研究,2004(7):111 -113.
[5] 費(fèi)江濤,張曉清,潘清.基于表結(jié)構(gòu)的海量數(shù)據(jù)管理系統(tǒng)技術(shù)綜述[J].計(jì)算機(jī)與現(xiàn)代化,2010(1):166 -168.
[6] 張曉清,費(fèi)江濤,潘清.分布式海量數(shù)據(jù)管理系統(tǒng)BigTable 數(shù)據(jù)服務(wù)器設(shè)計(jì)[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2009(3):56 -57.