云原生数据库系列谈(贰):Vertica 核心架构揭秘
上回书(云原生数据库系列谈(壹):节点越多,性能越高?)我们说到,提升MPP数据库性能的关键在于Micro Focus Vertica 中的Eon模式。从宏观上来说,它是未来大数据&云计算时代中,数据库未来的发展方向;从微观上来说,它让我们基本上远离了曾经让我们苦不堪言的“宕掉”二字。
我相信小伙伴一定跟我一样对这个神奇的Vertica充满了好奇,它到底是何方神圣,能让桀骜不驯的数据们变得瞬间乖巧呢?这,就要先从它的物理设计谈起了。
Vertica是一个基于无共享分布式开放平台构建的列式存储和计算的关系SQL分析数据库。它支持多种机制,通过良好的物理设计来提高查询性能。
关键词:分布式
Vertica将表数据物理组织成投影(Projection),这些投影将表的部分属性子集有序、分布式存储。
如图所示,每个投影都有一个特定的排序顺序,数据完全按此排序。具有适当排序顺序的投影起到了传统索引的作用。有序的数据通常会取得更好的压缩效果,从而提高 I/O 性能,并有效减少CPU周期开销,提高了系统的处理能力。
表和投影之间的关系:销售表有2个投影:(1)按date排序、按HASH(sale_id)分段的全列投影,
和(2)仅包含(customer, price)属性、按customer排序、按HASH(customer)分段。
关键词:聚合投影
除了普通投影之外,Vertica还支持可选的实时聚合投影(Live Aggregate Projections),如图所示。它可以维护预先计算的部分聚合表达式,但会对基表的更新方式施加限制。
实时聚合可用于显著加快各种聚合,top-K和去重(Distinct)操作的查询性能。实时聚合投影甚至可以通过用户自己提供的基于SDK自定义转换函数(UDTF)来构建。
关键词:扁平表
另外,Vertica支持如图所示的“扁平表”(Flattened Table,宽表)的机制,可在加载时对增量数据使用连接执行任意逆范式化操作。扁平表还提供刷新机制,用于在连接的维度表更改时更新逆范式表中的列。
Vertica采用分布式存储系统,以便与节点内分区(Partition)区别开来。每个投影会指定分段方式,分段方式确定了元组值与节点的映射关系,从而为实现许多重要的优化提供了基础。例如,Vertica使用分段信息来执行完全本地执行的分布式关联和高效的分布式聚合,这对计算高基数去重聚合尤其有效。
投影可以在集群节点之间复制或分段
分段型投影(Segmented Projection)将每个元组地存储在某个特定的节点上
存储元组的节点由投影定义中的分段子句确定
具有高基数和值相对均匀分布的一个或多个列组合就可以用来分段
Vertica会自动创建采用相同分段表达式的第二个“伙伴”投影("Buddy" projection)以支持容错。当某个节点宕掉时,优化器会从互为副本的适当节点上的伙伴投影中获取缺少的数据
Vertica有读优化存储(Read Optimized Store, ROS)和写入优化存储(Write Optimized Store, WOS)。
“读”优:ROS
ROS中的数据实际存储在标准文件系统中的多个ROS容器中。因为其存储在物理上是分开的,Vertica可以独立检索列数据:所以说Vertica是真正的列式存储。
Vertica写出的实际列数据后面会跟随包含位置索引的页脚,如下图所示:
ROS具有以下特性:
位置索引将容器中的元组偏移映射到文件中的块,和块元数据(如小值和大值)一起来加速执行引擎
如果列数据很少,Vertica会将多个列文件合并在一起存储以减少文件总数,减轻文件系统的负担
从ROS容器内的每个列文件中获取具有相同位置的值,就可以得到完整的元组
ROS文件一旦写入就不会被修改
“写”优:WOS
WOS的主要目的是在内存中缓冲小量数据的插入、删除和更新,以便有足够行数的数据成批写入磁盘,分摊写入成本。
WOS具有以下特性:
数据在WOS中不进行编码或压缩,但会根据投影的分段表达式进行分段
提交的数据可以驻留在WOS中
Vertica使用伙伴投影的复制机制来解决单个节点故障问题
在面对所有节点的灾难性故障时,会使用更复杂的事务回滚机制将数据库恢复到一致的快照上
Vertica编录(Catalog)存储并提供对数据库元数据的访问。其他数据库通常使用他们自己的表结构和B-树来进行元数据维护。
由于Vertica的表结构用来对十亿行以上的数据进行优化的,因此Vertica采用定制的机制来管理元数据。编录在内存中采用多版本并发控制(MVCC)机制,为数据库读取操作提供一致的快照,并为写入操作提供写时复制(Copy-On-Write)语义。
一套完整的编录流程是这样的:
提交至日志:事务提交会导致事务日志附加到重做日志中。事务日志只包含元数据,因为数据在提交之前已经完成写入操作。
日志分流检测:事务日志被分成多个文件,但整体上按照增量版本计数器排序。
检查点计数标记:当总事务日志大小超过阈值时,编录将写出一个检查点,该检查点反映写出检查点时所有对象的当前状态
注1:检查点用版本计数器来标记,确保检查点按照事务日志相应的顺序来排序。
注2:Vertica会保留两个检查点,之前的所有检查点和事务日志都可以删除。
更新状态:在Vertica启动时,编录将读取新的有效检查点,然后应用所有后续事务日志以达到新的编录状态。
来源 https://mp.weixin.qq.com/s/h16OYrpWPNurFhsRdmmLcA
相关文章