唐亞男
(亞信聯(lián)創(chuàng)科技(中國)有限公司,北京 100086)
與以往常見的行式關(guān)系型數(shù)據(jù)庫不同,Vertica是一種基于列存儲(Column-Oriented)的數(shù)據(jù)庫體系結(jié)構(gòu),這種存儲機構(gòu)更適合在數(shù)據(jù)倉庫存儲和商業(yè)智能方面發(fā)揮特長。
常見的RDBMS都是面向行(Row-Oriented Database)存儲的,在對某一列匯總計算的時候幾乎不可避免的要進行額外的I/O尋址掃描,而面向列存儲的數(shù)據(jù)庫能夠連續(xù)進行I/O操作,減少了I/O開銷,從而達到數(shù)量級上的性能提升。同時,Vertica支持海量并行存儲(MPP)架構(gòu),實現(xiàn)了完全無共享,因此擴展容易,可以利用廉價的硬件來獲取高的性能,具有很高的性價比。
如圖1,展示的是單節(jié)點上的Vertica的基本體系結(jié)構(gòu)。
圖1 體系結(jié)構(gòu)
作為關(guān)系型數(shù)據(jù)庫,Vertica的查詢SQL也是在前端被解析和優(yōu)化的。但與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫有所不同,Vertica內(nèi)部是混合存儲的,包括兩種不同的存儲結(jié)構(gòu):寫優(yōu)化器(WOS)和讀優(yōu)化器(ROS)。
(1)寫優(yōu)化器WOS(W rite-Optim ized Store)
是位于主存儲器上的一個數(shù)據(jù)結(jié)構(gòu),用于有效的支持數(shù)據(jù)插入和更新操作;數(shù)據(jù)的存放是無序的,非壓縮的。
(2)讀優(yōu)化器ROS(Read-Optimized Store)
是磁盤物理存儲,存放的是排序和壓縮后的數(shù)據(jù)庫大塊數(shù)據(jù),因此這里的查詢相比于WOS性能更好。
(3)Tuple Mover進程
是Vertica內(nèi)部的一個進程,定期的以大數(shù)據(jù)塊的形式把數(shù)據(jù)從WOS移到ROS,由于是對整個WOS操作,Tuple Mover一次能非常有效的排序很多記錄,最后批量把它們寫入磁盤。
在Vertica內(nèi)部,不論是WOS還是ROS都是按列存儲的。
舉個例子:
表Sales包含字段(order-id、product-id、sales-date、customerid、sales-price),Vertica會存儲至少五個不同的列(邏輯上展示給用戶的是一張表)。通過分開存儲這些列,Vertica能夠只返回用戶特定查詢的列。
在Vertica中,每一列可以存在于不同的Projections中,如可以給Sales表建立兩個Projection:其中sales-prices包含order-id、product-id、sales-date、sale-price四 列 , 另 一 個salescustomers包含了order-id、product-id、customer-id三列。每個projection都可以指定單獨的排序,例如:命名為salescustomers的projection可能會按custmoer_id排序存儲,這對于“統(tǒng)計某個客戶訂購了哪些產(chǎn)品”這類查詢就非常有效。借助于這種存儲方式,對每個查詢Sql,Vertica的Database Designer工具會自動使用最優(yōu)的projections,從而能很快地響應(yīng)用戶的請求。
當然,這種多個projections冗余存儲的方式會占用更多的磁盤空間,對此,Vertica也給出了很好的解決方案。高效的列壓縮模式能夠最多把數(shù)據(jù)壓縮掉90%,不但大大減少了磁盤的使用,同時由于Vertica能夠直接處理壓縮數(shù)據(jù),這樣查詢性能和查詢時的CPU負載都大大降低了。
在數(shù)據(jù)倉庫領(lǐng)域,人們會更多的關(guān)注數(shù)據(jù)庫的查詢性能。Vertica的查詢響應(yīng)受到多個因素的影響。
舉個簡單的例子,如上提到的Sales表,如果要計算出商品的平均銷售價格,可以用:
SELECT date,AVG(sales-price)FROM sales GROUPBY sales-date這樣的語句來實現(xiàn)。對于這樣的典型查詢語句,系統(tǒng)的主要開銷在磁盤訪問(disk I/O)和CPU處理兩個方面(分布式的情況下還需考慮網(wǎng)絡(luò)I/O),通常情況下disk I/O和CPU計算是同時進行的,這樣我們不難得出結(jié)論:如果disk I/O用了D秒,CPU處理用了C秒,則整個查詢的響應(yīng)時間是D和C兩者中的最大值。
理解了以上一般SQL語句的處理過程,我們就可以進一步的分析一下Vertica數(shù)據(jù)庫在查詢方面的優(yōu)勢在哪里。
由于大多數(shù)的查詢都是要從磁盤讀取數(shù)據(jù),因此可以說disk I/O在很大程度上決定了一個查詢的最終響應(yīng)時間。從上面的示例可以看出,Vertica只需要讀取sales-date,sales-price兩列,而行式存儲的數(shù)據(jù)庫則要讀取全部的5列,列式數(shù)據(jù)庫的優(yōu)勢不言而喻。
在數(shù)據(jù)存儲方面,Vertica利用內(nèi)部的特定算法對數(shù)據(jù)進行壓縮處理。這樣的機制會大大減少disk I/O的時間(D),同時由于Vertica對掃描和聚合等操作也在內(nèi)部進行了優(yōu)化,可以直接處理壓縮后的數(shù)據(jù),這樣CPU的工作負載(C)也減少了。如上例中的AVG聚合函數(shù),Vertica是不需要將壓縮數(shù)據(jù)先做類似解壓這種處理的,因此查詢性能得到優(yōu)化。
Vertica的數(shù)據(jù)庫存儲容器ROSContainer專門為讀操作進行了優(yōu)化設(shè)計,且其中的數(shù)據(jù)是經(jīng)過了排序和壓縮處理的,即每個磁盤頁上不會有空白空間,而傳統(tǒng)的數(shù)據(jù)庫一般會在每頁上預留空間以便日后的insert操作來使用。
為了高可用性和備份恢復的需要,Vertica會按照不同的排序方式對數(shù)據(jù)做冗余存儲,這不但避免了大量的日志操作,也為查詢帶來了便利。Vertica的查詢優(yōu)化器會自動選擇最優(yōu)的排序方式來完成特定的查詢。
Vertica支持完全無共享海量并行存儲(MPP)架構(gòu),隨著硬件Server的增加,多個CPU并行處理,性能也可以得到線性的擴展,這樣用戶使用廉價的硬件就可以獲得較高的性能改善。
除了有優(yōu)越的性能以外,Vertica在數(shù)據(jù)庫管理方面也進行了非常人性化的設(shè)計。
Vertica Database Designer是一個界面化的日常管理工具,并且能為用戶作出詳盡的DB層物理設(shè)計方案,大大減少了日后的性能調(diào)優(yōu)方面的開銷。
Vertica通過K-Safety值的設(shè)置,完成了數(shù)據(jù)庫的備份恢復機制,并保證了高可用性。
對于數(shù)據(jù)庫中的每個表每個列,Vertica都會在至少K+1個節(jié)點上存儲,如果有K個節(jié)點宕機,依然能夠保證Vertica DB是完整可用的;當損壞的節(jié)點恢復時,Vertica自動完成節(jié)點間的熱交換,把其他節(jié)點上的正確數(shù)據(jù)恢復過來。通過這種機制也保證了Vertcia庫的節(jié)點數(shù)目可以自由伸縮而不會影響到數(shù)據(jù)庫的操作。
Vertica通過兩種技術(shù)來實現(xiàn)在線的持續(xù)數(shù)據(jù)裝載而不會影響到數(shù)據(jù)庫的訪問。
首先,Vertica通常運行在快照隔離(Snapshot Isolation)模式下,該模式下查詢讀取的是最近的一致的數(shù)據(jù)庫快照,這個快照是不能被并發(fā)的update或delete操作更改的,因此查詢操作也不需要占用鎖,這種方式保證了數(shù)據(jù)裝載(insert)和其他查詢能互不干擾。另外,Vertica可以把數(shù)據(jù)直接裝載到WOS結(jié)構(gòu)中,WOS中的數(shù)據(jù)是不排序或索引的,所以裝載速度會很快,然后再由Tuple Mover進程在后臺把數(shù)據(jù)移入ROS中,由于TupleMover的操作是大塊讀?。╞ulk-load)的,所以性能也很好。
綜上所述,Vertica在設(shè)計上充分考慮和利用了列式存儲的優(yōu)越性,使數(shù)據(jù)庫的整體性能、易用性及可靠性方面都達到了較高的水平,同時Vertica提供了大量的管理監(jiān)控工具及APIs接口等,給使用者帶來了方便,因此這幾年的發(fā)展速度也很快,值得我們關(guān)注。
[1]程瑩.云計算時代的數(shù)據(jù)庫研究[J],電信技術(shù),2011,(01).
[2]尹東方.列式存儲在知識發(fā)現(xiàn)系統(tǒng)中的應(yīng)用與實現(xiàn)[D].中國優(yōu)秀碩士學位論文全文數(shù)據(jù)庫,2010,(07).
[3]石菲.列式數(shù)據(jù)庫持續(xù)突破[J].中國計算機用戶,2009,(09).
[4]Pedro Furtado.Model and procedure for performance and availability-w ise parallel warehouses,Distributed and Parallel Databases,2009,(02).
[5]Zack Jourdan;R.Kelly Rainer;Thomas E.Marshall.Business Intelligence:An Analysis of the Literature,Information Systems Management,2008,(03).
[6]Willian H.Inmon.Building the Data Warehouse,4 edition,Wiley Education,2005:327-389.