Vertica: 基於DBMS架構的列存儲數據倉庫

介紹

Vertica(屬於HP公司),是一個基於DBMS架構的數據庫系統,適合讀密集的分析型數據庫應用,比如數據倉庫,白皮書中全名稱爲VerticaAnalytic Database。從命名中也可以看到,Vertica代表它數據存儲是列式的,Analytic代表適合分析型需求,DB代表本身是數據庫,支持SQL。


優勢

和傳統關係型數據庫系統以及其他列式數據(倉)庫相比,Vertica存在下面三點最關鍵的優勢。

 

列存儲

Vertica對磁盤上的數據採用列式存儲,顯而易見,列存儲可以在數據讀取的時候避免不需要的列,減少IO帶寬,而且列存儲配合壓縮算法可以節省磁盤存儲量。Vertica的列存儲在壓縮方面還有其優化之處,見下文。

 

AggressiveCompression

這個姑且理解爲侵略性壓縮好了。其實在壓縮方面,Vertica針對不同的數據類型,採用了多種不同的壓縮方式,讓原本磁盤上大量IO開銷與CPU的壓縮工作達到比較好的tradeoff。壓縮率大致是高達90%。此外,Vertica 的寫數據和讀數據是分開進行的,讀的數據以壓縮的狀態存在磁盤上,寫的數據先緩存在內存裏,異步合併到磁盤上,這個下文還會提到。


多備份

由於壓縮比率很高(90%),所以能夠騰出足夠的磁盤空間來做備份。這點很關鍵。首先,備份讓Vertica具備容錯性,且多機器上的備份還能提升ad-hoc查詢性能。其次,能夠通過備份來容錯這點,區別了Vertica與傳統數據庫通過logging和二階段提交這種方式來做容錯的做法。而能做多備份的原因是由於其列存儲壓縮做的優化比較好,這點又是比其他列式存儲的數據倉庫有優勢的地方。

table被拆分後存儲的每個單元叫projection,每個projection按某個或某些attribute進行排序,而且不同的副本排序方式還會不同,所以這對查詢又是有幫助的,這點下文也會提到。

 

當然,Vertica的壓縮,面向列的存儲以及table拆解後的存儲對用戶來說是透明的。Vertica對前端用戶提供的是標準的SQL接口,而且兼容現有的ETL,reporting,BI工具,所以這點使得其他業務系統可以更方便遷移到Vertica上。


Vertica對硬件也沒有特殊要求,可以跑在廉價的集羣上,或是任何現成的linux機器上,使用本地磁盤做存儲。

 

除了上面說的幾點優勢之外,Vertica還在性能,可擴展性,可用性以及使用便利性方面有以下優勢。

 

shared-nothing,grid-based 數據庫架構

Vertica可以高效的在普通的機器上擴容。事實上,在數據備份這塊,Vertica提供k-safety的方式,k+1是備份數,可調,且每一份是完全的數據,後面會提到。


混合數據存儲

這裏的混合指的是內存和磁盤。一方面,新插入的數據是寫入針對寫做了優化的內存結構裏,所以支持持續的,高性能的併發寫入操作;另一方面,不影響實時的查詢性能,因爲讀的數據來自於磁盤。事實上,寫數據在內存裏是亂序的,所以寫吞吐會比較高,而讀數據在磁盤上是有序的。

 

物理數據庫設計工具

這說的是在使用Vertica的時候,提供了比較方便的工具,能幫助用戶設計物理表,下文會提到。而且提供k-safety的機制保證容錯。

 

高性能兼容ACID數據庫

有輕量級的事務和併發控制scheme,針對查詢和數據載入。並且具備基於k-safety的失敗恢復模型,而不是傳統的基於日誌的。

 

方便的部署、監控、管理


架構


上圖爲Vertica單個節點的架構,我們看到查詢和更新是走的所謂的混合存儲,即write-optimizedstore(以下簡稱WOS)和read-optimized store(以下簡稱ROS)。WOS在內存裏,對應數據寫入,裏面的數據不排序也不壓縮。ROS是被排序和壓縮過了的數據,存在磁盤上,提供了支持高效查詢的格式。Tuple Mover負責把WOS的數據遷移到ROS上,以批的形式把WOS內存裏的數據排序和壓縮後移到ROS,即磁盤上,也是保證高效的。在WOS和ROS內部,數據都是面向列存的。

 

下面這張圖展示了table存入到Vertica後,是怎麼轉變到物理存儲的column形態的,即被切成了Projections。


在切分成物理存儲這點上,Vertica的Database Designer會幫助選擇一個合理的切分方式,這是上面提到的使用上的便利性的優勢,下文還會簡單提到如何做到。

看上去,對每個projection在多機上冗餘備份存儲是種浪費磁盤的做法,但是Vertica的侵略性壓縮提供了90%的壓縮率,所以不用擔心。

 

下面展示的是從WOS到ROS,Tuple Mover如何做數據合併的大致流程。


具體不詳細解讀,大致是異步和批量的做merge,而且projection是被縱向切成segments,會方便高效的歸併。


性能

這一節稍微深入分析和對比下Vertica的性能優勢。

 

列存儲方面

對於普通的查詢來說,主要是磁盤訪問和cpu cycles佔據的時間,哪個時間長就是查詢時間,或者說是瓶頸。那列式存儲的話,通過壓縮來充分使用cpu資源,減少io開銷,在cpu和io上做到比較合理的tradeoff,這點是Vertica一個很重要的優勢。

其他數據庫系統會通過支持物化views或data cubes,來減少某些查詢場景下的時間,類似於做一些預計算和預處理來優化查詢速度。但是這點對查詢的場景支持有限,並且仍然不及Vertica提供的查詢性能。


壓縮方面

Vertica除了提供RLE(run-length encoding),還對連續的數據提供delta encoding和一個高效的LempelZiv實現,該實現很適合排過序的大多數值不相同的列數據,或未排序的數據。爲浮點和時間數據提供特殊的壓縮方式。

 

ROS方面

ROS本身的壓縮和排序處理,使得磁盤上的數據查詢比較高效。此外,ROS是dense packed不浪費disk pages。而傳統數據庫往往會讓page留很多空,以便在不重新整理的前提下繼續插入數據,磁盤空間利用率不是最高。ROS這部分工作是Tuple Mover異步做的,在歸併階段控制應該比較容易控制。在查詢的時候,也會預讀取查詢量比較大的大塊ROS。


排序方面

如前面提到,Vertica通過多備份來做HA和失敗恢復,有別於傳統數據庫基於日誌的失敗恢復方式,寫入過程相比Vertica的話代價更大些。此外,額外不同的排序方式加快了查詢速度,Vertica也會選擇最優的方式來做排序。

 

parallelshared-nothing on off-the-shelf hardware設計

不多說了,方便線性擴容,對硬件沒特殊要求。


Vertica的一個benckmark,如下圖。



管理

之前說的DB Designer會幫助使用者切分表,做比較好的物理存儲選擇,原理如下,


它參考邏輯schema,樣本數據和query語句三個東西來做決策的。而且DB Designer能夠增量地爲數據庫進行重新設計物理schema。

 

關於失敗恢復和k-safety的HA保障再提幾點。商業和傳統數據庫通過日誌記錄和二階段提交保證事務性的方式來做失敗恢復,回滾之類的事情,Vertica通過備份k+1份實現,只要有一臺沒有掛掉,就可以從它那全份拷貝恢復,容錯性是高的,而且基於壓縮率高,我們也不擔心磁盤因此喫緊。這一點還讓Vertica能夠提供hot-swapping(熱替換)節點,即比較方便地移除節點和新增節點。

 

傳統數據庫是record-at-a-time或bulk loading的方式來插入新數據,Vertica與此不同的是能夠提供持續載入功能,查詢的節點往往是以snapshot isolation的模式進行的,所以某種意義上是read-only的,因此在寫入的時候也不用上鎖。而且WOS裏的數據不需要排序也不壓縮,批量寫入吞吐是比較高的。


總結

Vertica與傳統數據庫系統和其他列式數據倉庫系統相比的話,在性能上有比較明顯的優勢,在設計上有一些異同,比較適合ad-hoc查詢,OLAP類型的作業。總的來說,Vertica通過列存儲減少了io開銷,再加上高效的壓縮手段,極大節省了磁盤空間,基於此Vertica採用多備份來保證高可用性,並且多備份又能夠增強查詢性能。在使用和運維角度了,Vertica自帶工具幫助用戶做物理表的存儲,能提供標準SQL接口,也兼容現有的BI、ETL工具方便作業往Vertica上遷移,而且Vertica部署對硬件沒有特殊要求,能夠線性擴展。



全文完 :)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章