全景图 | Vertica技术原理与实践.xmind
Vertica全景图
Vertica是一款基于列存储MPP/大规模并行处理(massively parallel processing) 架构的数据库,它可以支持存放多至PB级别的结构化数据。
一、Vertica架构特点
Vertica采用无共享的MPP架构,拥有高扩展性。
Vertica集群中所有节点对等,集群中没有主节点或其他共享资源,通过增加节点,就可以线性扩展季军的计算能力和数据处理容量。
Vertica是纯列式数据库,优化器和执行引擎可以忽略表中与查询无关的列,Vertica不仅仅按列式存储数据,还主动地根据列数据的特点和查询的要求选用佳的算法对数据进行排序和编码压缩,会大大地降低磁盘I/O消耗,同时Vertica的执行引擎和优化器也是基于列式数据库设计的,编码压缩过的列数据在Vertica的执行引擎中进行过滤、关联、分组等操作不需要解反编码,从而降低了CPU和内存消耗。
Vertica充分利用列式存储的优点,在保持对前端应用透明的前提下,把数据在集群中的所有节点进行均匀分布的同时,还在多个节点上对同一份数据维护了多个拷贝,确保任意一个或几个节点出现故障或进入维修状态都不会影响集群的健康状态。提高了Vertica的高可靠性。
无共享的MPP架构和真正的列式数据库特性,使Vertica拥有高性能、高扩展性、高压缩率、高健壮性的特点。和传统的解决方案相比,Vertica可以以30%的成本实现50倍-1000倍的性能提高。
二、Vertica技术体系原理
列存储 Vertica以列格式存储数据,因此可以查询以获得佳性能,与基于行的存储相比,列存储减少了磁盘I/O,Vertica仅读取查询所需要的列。如:select name from t_table where school_id = ‘1’and class_code = ‘1’; 针对这个查询,列存储只读取3列,行存储读取所有列。
数据编码和压缩 Vertica使用编码和压缩来优化查询性能并节省存储空间。编码将数据转换为标准格式,Vertica使用多种不同的编码策略,具体取决于列数据类型,表基数和排序顺序。编码提高了其性能,因为在查询执行I/O较少,还可以在更小的空间存储更多的数据。压缩将数据转换为紧凑格式,Vertica使用多种不同的压缩方法,并自动为压缩数据选择佳压缩方法,使用压缩,Vertica可以存储更多数据,提供更多视图,并且使用的硬件比其他数据库少,可以在物理存储中保留更多的数据。
集群 集群支持扩展和冗余,可以通过添加更多节点来扩展数据库集群,并可以通过在集群中分发和复制数据来提高可靠性。k-safe技术:保证在Vertica集群内,每一个数据库的每一个表的每一个列被存储在至少K+1台机器上,当K台机器不可用,仍然有一个完整的数据库备份可用。列数据分布在集群中的节点上,因此如果一个节点变的不可用,则数据库继续运行,将节点添加到集群或在不可用后重新联机时,会自动查询其他节点以更新其本地数据。
Projections 和传统数据库中的索引或物化视图一样,projections可加速查询处理(同一张表的多个projection可按不同排序方式、压缩模式以及数据分布满足查询的多样性),根据原始表写查询时,查询使用projections返回查询结果。projections在集群中的节点之间分布和复制,确保如果一个接地那不可用,则另一个数据副本仍然可用。通过自动数据复制,故障转移和恢复提供了主动冗余,从而提高了性能,节点通过查询系统自动恢复。Vertica数据库中的表只是一个逻辑概念,实际存储在磁盘上的是projection,当创建一张表,没有创建projection时,插入数据时会自动创建一个projection,如果运行中发现projection不合适,可以进行dbd进行优化,参考来重建projection。
5.Logical and Physical Schema Vertica将有关数据库对象的信息存储在逻辑架构和物理中,两种模式之间的差异一级它们与数据存储的关系是Vertica体系结构的一个重要且独特的方面。逻辑架构包括表、约束、视图。物理架构实际为projections(A physical schema consists of collections of table columns called projections. A projection can contain some or all of the columns of a table)。
三、Vertica建表及实践
四、Vertica数据加载
1.使用copy加载是Vertica独有的,copy命令默认是自动commit的,也可以在copy语句后指定no commit来不自动提交。可以加载格式化的数据也可以过滤某些字段,在加载日志过程中会有两个日志,一个是数据没有被加载的原因,另一个是被拒绝的数据
2.加载半结构化数据:
五、Vertica优化总结
explain命令
在一个大SQL执行之前,使用profile来查看资源的预期消耗,vertica执行计划除了有普通文本格式,还有graphviz格式的文本输出,可以使用一些graphviz viewer网站或工具将这些文本以流程图的形式呈现. 比如这个网站 <http://webgraphviz.com/>
2.v_monitor schema 下有很多监控类表, 可以查看内存/执行时间等消耗.
select * from v_monitor.query_requests ;
select * from v_monitor.query_profiles ;
select * from v_monitor.query_metrics ;
select * from v_monitor.memeory_usage ;
select * from v_monitor.cpu_usage ;
select * from v_monitor.io_usage ;
select * from v_monitor.network_usage ;
3.profile命令
除了 v_monitor.query_requests 给出的时间和内存消耗, 还可以使用 profile 语句获取SQL的执行成本.该命令结果可以在vsql 命令行工具看到, 或使用 dbeaver的"输出"tab页查看。
4.数据表 (包括临时表) 建表语句需要重点关注数据的分布
具体分布情况 的指令有order by,SEGMENTED by , PARTITION by从句。UNSEGMENTED ALL NODES;SEGMENTED BY HASH(EID) ALL NODES ;
5、收集统计信息
如果在执行计划中, 看到 "NO STATISTICS" 字眼, 可以试试收集一下统计信息.SELECT ANALYZE_STATISTICS('');
尽量避免使用 merge 和 update 语句, 使用 Delete+Insert 代替.
Delete 虽然性能比 Update 要好, 但大量数据的删除操作, Vertica 也需 要很长时间, 尽量使用 truncate 或 分区删除.
对于复杂的子查询语句,使用临时表来代替。
两个表关联避免不同数据类型之间做"隐式转换", 必要时候先使用临时 表转成同样数据类型(包括精度), 然后再做join.根本点是建模时, 同一个 domain在不同表中的类型要保持一致.
重建或新建Projection.
如果在执行计划中, 看到 "BROADCAST Join" 字眼, 有可能关联条件写的不合适, 有可能projection建的不合适.
大数据量的操作(Insert/Update/Delete/CTAS 语句), 要善用 /*+ DIRECT */
Group by
如果查询包含groupby子句,那么Vertica要么使用groupby pipelined或者groupby hash算法进行处理,如果处理的结果是生成一小部分distinct数据(比如集群的每个节点1千个),两种算法性能和结果表现差异不大,但是对于处理大量数据来说,groupby pipelined使用较少内存,性能更高,但要求数据必须事先排序。
六、Vertica存储过程
直接上代码demo:
七、扩展技能
大数据生态
Flink全景图
来源 https://mp.weixin.qq.com/s/T2_gyyaycuU2-l3sus7pRQ
相关文章