892
技术社区[云栖]
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。