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异步做的,在归并阶段控制应该比較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部署对硬件没有特殊要求,可以线性扩展。
全文完 :)
Vertica: 基于DBMS架构的列存储数据仓库的更多相关文章
- HUABASE :基于列存储的关系型数据库系统
摘要 HUABASE 是基于列存储的关系型数据库系统.列存储技术的特点是数据查询效率高,读磁盘少,存储空间少,是构建数据仓库的理想架构. HUABASE 实现了多种数据压缩机制.查询优化和稀疏索引 ...
- 应运而生! 双11当天处理数据5PB—HiStore助力打造全球最大列存储数据库
阿里巴巴电商业务中历史数据存储与查询相关业务, 大量采用基于列存储技术的HiStore数据库,双11当天HiStore引擎处理数据记录超过6万亿条.原始存储数据量超过5PB.从单日数据处理量上看,该系 ...
- 在SQL Server 2014里可更新的列存储索引 (Updateable Column Store Indexes)
传统的关系数据库服务引擎往往并不是对超大量数据进行分析计算的最佳平台,为此,SQL Server中开发了分析服务引擎去对大笔数据进行分析计算.当然,对于数据的存放平台SQL Server数据库引擎而言 ...
- SQL Server 2014 聚集列存储
SQL Server 自2012以来引入了列存储的概念,至今2016对列存储的支持已经是非常友好了.由于我这边线上环境主要是2014,所以本文是以2014为基础的SQL Server 的列存储的介绍. ...
- SQL Server 列存储索引概述
第一次接触ColumnStore是在2017年,数据库环境是SQL Server 2012,Microsoft开始在SQL Server 2012中推广列存储索引,到现在的SQL Server 201 ...
- SQL Server 2014聚集列存储索引
转发请注明引用和原文博客(http://www.cnblogs.com/wenBlog) 简介 之前已经写过两篇介绍列存储索引的文章,但是只有非聚集列存储索引,今天再来简单介绍一下聚集的列存储索引,也 ...
- SQL Server 列存储索引强化
SQL Server 列存储索引强化 SQL Server 列存储索引强化 1. 概述 2.背景 2.1 索引存储 2.2 缓存和I/O 2.3 Batch处理方式 3 聚集索引 3.1 提高索引创建 ...
- Oracle 12.1.0.2 New Feature翻译学习【In-Memory column store内存列存储】【原创】
翻译没有追求信达雅,不是为了学英语翻译,是为了快速了解新特性,如有语义理解错误可以指正.欢迎加微信12735770或QQ12735770探讨oracle技术问题:) In-Memory Column ...
- SQL Server 列存储性能调优(翻译)
原文地址:http://social.technet.microsoft.com/wiki/contents/articles/4995.sql-server-columnstore-performa ...
随机推荐
- hdu4151(二分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4151 题意:找出比n小的没有重复数字的总个数,例如12以内11不符合,1~10都符合. 分析:直接利用 ...
- 安装 MYSQL exec: g++: not found 报错
解决办法: yum install -y gcc-c++
- (转)ikvmc的使用
IKVM.NET是一个针对Mono和微软.net框架的java实现,其设计目的是在.NET平台上运行java程序.本文将比较详细的介绍这个工具的原理.使用入门(如何java应用转换为.NET应用.), ...
- Android 监听SMS短信
当设备接收到一条新的SMS消息时,就会广播一个包括了android.provider.Telephony.SMS_RECEIVED动作的Intent. 注意,这个动作是一个字符串值,SDK 1.0不再 ...
- 关于IE打印预览内容显示不全的问题解决
眼下在调整一个页面打印功能的时候,发现多行文本框TextArea在页面显示的时候,多行文本能够正常显示,可是在打印页面的时候.部分内容就被遮挡住了, 苦思冥想不得其解,后来还是请教了美工. 首先查了下 ...
- 从零开始学Xamarin.Forms(三) Android 制作启动画面
原文:从零开始学Xamarin.Forms(三) Android 制作启动画面 Xamarin.Forms 在启动的时候相当慢,必须添加一个启动界面,步骤如下: 1.将启动画面的图片命名为:s ...
- MD5加密,解密
using System; using System.Collections.Generic; using System.Text; using System.Globalization; using ...
- 上门洗车APP --- Androidclient开发 之 项目结构介绍
上门洗车APP --- Androidclient开发 之 项目结构介绍 前言 尽管公司项目较紧,但还是抽空给大家继续更新. o_O"~ 欢迎大家的关注,非常高兴和大家共同学习.前面给大家分 ...
- Android四个存储数据的SharedPreferences
除了SQLite外部数据库.SharedPreferences它是一个轻量级的数据存储,其本质是基于XML文件存储key-value键值数据,通过定期用它来存储一些简单的配置信息.它的存储位置/dat ...
- USACO sprime
/* ID:kevin_s1 PROG:sprime LANG:C++ */ //N = 1仅仅可能为2,3,5,7.N > 1仅仅可能为1,3,7.9. N = i,到N = i + 1递推假 ...