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

介紹

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


優點

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

 

列存儲算法

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

 

AggressiveCompression緩存

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


多備份併發

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

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異步作的,在歸併階段控制應該比較easy控制。在查詢的時候,也會預讀取查詢量比較大的大塊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部署對硬件沒有特殊要求,能夠線性擴展。



全文完 :)

相關文章
相關標籤/搜索