天天看點

Vertica: 基于DBMS架構的列存儲資料倉庫介紹優勢架構性能管理總結

和傳統關系型資料庫系統以及其他列式資料(倉)庫相比,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部署對硬體沒有特殊要求,能夠線性擴充。

全文完 :)