前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >打造次世代分析型数据库(二):这,不只是列存表

打造次世代分析型数据库(二):这,不只是列存表

作者头像
腾讯云大数据
发布于 2022-08-26 08:13:53
发布于 2022-08-26 08:13:53
7550
举报
文章被收录于专栏:腾讯云大数据腾讯云大数据

作者介绍

作者介绍:marklv(吕夫洋),腾讯云数据库高级工程师,专注于数据库存储、事务、高可用方向,具有多年的数据库内核研发经验。曾供职于华为2012高斯实验室;加入腾讯后负责CDW PG数据库全新存储引擎的设计和研发工作。

Effective Storage Engine设计背景

传统数据库按行进行表的存储和访问。由于表中每行的数据连续地存储在一起,对于交易性业务(OLTP)这样频繁以行作为单位存储表中数据的负载,行存储性能较好。

但是对于分析性业务(OLAP)这种经常对表中某些列进行查询计算的负载,行存储会将不相关的列数据读入内存中,导致性能欠佳。列存储模型通过将表中的列连续地存储在一起,能够很好地解决这个问题,减少不必要数据的读取与解析带来的磁盘I/O代价、数据压缩解压代价以及CPU执行代价,提高磁盘存储和使用效率,从而提升查询性能。

在混合的业务负载(Hybrid transaction/analytical processing,HTAP)场景下,针对OLTP优势的行存与针对OLAP优势的列存都无法很好地同时应对两种类型的业务,大多需要牺牲其中一种场景下的表现,或是最终造成两种场景下的能力都无法达到业务的预期。

应对两种完全不同的业务负载的实现往往无法避免以下问题:

  • 需要额外的系统资源(存储资源、计算资源);
  • 难以兼顾数据的实时性和强一致性;
  • 需要业务/应用层面针对特殊配置进行识别和适配。

为了满足CDW PG在OLAP传统数仓场景超大集群下的目标业务负载,并且具备能够良好处理数据混合负载的能力,Effective Storage Engine(下文简称“Estore”存储引擎)应运而生。

Effective Storage Engine基础架构设计

Estore的基础“三角形”组

Estore表基础架构由元信息表(“registry”表)、列文件(”silo”组成的文件)以及临时区表(”stash”表)组成。

在创建表create table时于reloptions “orientation”处填写”column”即可创建,创建后以上基础组成部分会自动创建。

  1. Silo是Estore表中基本的数据存储单元,承载存储数据的基本职责。 每个Silo包含一组数据中其中一列的数据,方便系统对其进行批量操作、压缩、存储。Silo自身存储与行存储的数据页面不同,不是固定的存储空间,而是存储固定的行数,实际存储空间大小可变。 Silo存储的是一组数据中的一列内容,同列数据能够提供更接近的数据特征以及更好的数据筛选,进而提供更好的压缩率。同时由于Silo的概念是固定行数而不是固定空间的概念,因此在尽量满足Silo填充至上限的情况下,Silo可以为压缩提供更大的上下文空间,以便提高数据的压缩率。 同时,Silo可以根据自身的数据类型、数据特征以及表级别/列级别,指定使用最合适的压缩算法或压缩算法的组合。
  2. registry表实际上是一张行存表,承担一张Estore表的存储引擎的主体组织结构与核心角色,存储了一张表中承载数据的各个Silo的相关信息。
  3. stash则是为了应对碎片数据、流数据以及混合负载下OLTP负载而准备的一张行存表,也可以认为是一个使用行存储承载数据的临时区域。

Effective Storage Engine 混合负载

混合负载设计背景

在分析性数据库的使用场景中,除去分析型业务常见的大数据量批量导入操作(bulkload)之外,数据库也常常会承接来自用户应用逻辑、数据管道或者ETL工具端的碎片化增量数据,亦或是流数据的持续输入。不同于批量数据操作中单个事务内GB-TB数量级的数据规模,碎片化的增量数据往往由多个小事务组成,每个事务中仅含有KB以下的数据量。

同时,在部分客户的应用场景中,用户逻辑会针对特定数据/近期数据/部分热数据进行类交易型的调用与处理,包括频繁的增删改;在完成相关业务后,又希望针对这部分数据或针对全部历史数据进行进一步的BI分析

业界常见的支持混合负载的数据库,大部分都是采用两套或更多套存储引擎或组件来实现,中间通过COW或Raft协议副本的方式来进行数据的同步。有没有办法可以用一份数据搞定两种业务呢?

以Stash表为核心的混合负载基础理念

Stash表的设计初衷即是应对以上场景。Stash表是Estore表创建后同步创建的一张行存表,与原表有着相同的表定义,但使用行存表作为存储。Stash表的作用是充当Estore表的“临时区“角色,针对单次行数在一定阈值下的操作,其相关数据会先被放入Stash表中,以行存储的形式存储起来,避免碎片化数据对Estore表的registry/silo存储模式的直接冲击。

同时,由于放在Stash表中的都是近期单条/小批量插入或更新的数据,Stash表也就在实际上起到了Estore表类似“热数据分片”的概念。通过Stash表作为行存储的机制支持,Estore存储引擎自身就可以为混合负载中的OLTP部分提供良好的支持,而不需要额外在其他存储方式上创建副本。后续按照用户配置或通过用户主动执行,用户可以按照自己的应用逻辑将Stash表数据合并入registry/silo的存储模式中,获得更好的分析性业务负载性能。

用户操作中对数据的归属性质不进行感知,即发起query或DML时无需对stash进行特殊处理,底层逻辑会自动扫描registry/silo以及stash中的数据。

Stash表的“自动沉降“ —— Auto Stashmerge

为了保证表中数据能够借助高效存储组织结构以及各类优化对应用提供优秀的分析性业务负载性能,Estore存储引擎在数据库实例中实现并封装了Estore表的自动合并机制,定期合并stash数据至silo中。用户可以根据不同应用场景对“沉降”进行配置,业务无需感知, 后台进程的动作也不会影响用户对表正常的增删改查。

Stash表的“手动沉降” —— Vacuum Stashmerge

适用于部分用户或业务在交易性与分析性间存在较为明确的分水岭的场景,执行时会将指定表或库中所有Estore表的Stash全量数据合并至其对应的registry/silo存储结构中,可以近似地理解为系统中“flush buffer”一样的操作。

总结

综上,为大家介绍了CDW PG的新型列存储引擎Effective Storage Engine的整体设计,以及Estore引擎如何同时为传统的OLAP数仓场景以及HTAP混合负载的业务提供稳定且优质的存储支持与保障。

推荐阅读

关注腾讯云大数据公众号

邀您探索数据的无限可能

点击“阅读原文”,了解相关产品最新动态

↓↓↓

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云大数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SQL面试 100 问
本文介绍并分析了 100 道常见 SQL 面试题,主要分为三个模块:SQL 初级查询、SQL 高级查询以及数据库设计与开发。
FunTester
2022/12/09
2.6K0
MySQL面试题
DML数据操作语言,负责对数据访问工作的指令集,例如inser,update,delete语句
用户10175992
2023/10/17
3120
MySQL面试题
100道MySQL数据库经典面试题解析(收藏版)
可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数,为什么不是二叉树,为什么不是平衡二叉树,为什么不是B树,而偏偏是B+树呢?
捡田螺的小男孩
2020/05/26
2.7K0
100道MySQL数据库经典面试题解析(收藏版)
MySQL面试题
(a) 有一新记录(小王 13254748547 高中毕业 2007-05-06)请用SQL语句新增至表中
用户7657330
2020/08/14
1.1K0
面试必备!91 道 MySQL 面试题(含答案)
结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询语言。
Python进击者
2020/03/26
1K0
精选MySQL面试题[111题](附刷题小程序)
MySQL内建的复制功能是构建大型,高性能应用程序的基础。将 MySQL 的数据分布到多个系统上去,这种分布的机制,是通过将 Mysql 的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。
一行Java
2022/04/07
8040
精选MySQL面试题[111题](附刷题小程序)
常见公司MySQL面试题全集
事务:事务是访问和更新数据库的程序执行的一个逻辑单元;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行。作为一个关系型数据库,MySQL支持事务。
用户1685462
2021/07/16
4210
DBA-MySql面试问题及答案-上
数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
鱼找水需要时间
2023/12/24
4270
DBA-MySql面试问题及答案-上
MySQL面试题 硬核47问
在这个例子中,9(precision)代表将被用于存储值的总的小数位数,而2(scale)代表将被用于存储小数点后的位数。
小熊学Java
2022/09/16
1.6K0
MYSQL面试常考知识点总结
第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
Java帮帮
2019/05/08
8070
MYSQL面试常考知识点总结
理解SQL原理SQL调优你必须知道的10条铁律
原文地址: http://www.nowamagic.net/librarys/veda/detail/1502 我们做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员流动大,那么我们还能保证下一段时间系统还能流畅的运行吗?我们还能保证下一个人能看懂我们的存储过程吗? 要知道sql语句,我想我们有必要知道sqlserver查询分析器怎么执行我么sql语句的,我么很多人会看执行计划,或者用profile来监视和调优查询语句或
Albert陈凯
2018/04/04
1.3K0
数据库面试题汇总
1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引。
用户4283147
2022/10/27
5830
数据库面试题汇总
SQL岗位30个面试题,SQL面试问题及答案「建议收藏」
SQL(结构化查询语言)是一种设计用于检索和操作数据的数据库。它属于美国国家标准协会(ANSI)的一种标准,可用于执行Select(选择)、Update(更新)、Delete(删除)和Insert(插入)等数据任务。
全栈程序员站长
2022/09/27
4.7K0
mysql面试题目及答案_docker 面试题
原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。
全栈程序员站长
2022/09/27
1.1K0
mysql面试题总结[通俗易懂]
1)超键(super key) :在关系中能唯一标识元组的属性集称为关系模式的超键
全栈程序员站长
2022/09/27
1.3K0
mysql面试题总结[通俗易懂]
MySQL优化20招
比如,存储字符串“101”,对于char(10),表示你存储的字符将占10个字节(包括7个空字符),在数据库中它是以空格占位的,而同样的varchar2(10)则只占用3个字节的长度,10只是最大值,当你存储的字符小于10时,按实际长度存储。
Maynor
2022/10/27
6310
sql优化的几种方法面试题_mysql存储过程面试题
(1)索引一旦建立,** Oracle管理系统会对其进行自动维护**, 而且由Oracle管理系统决定何时使用索引
全栈程序员站长
2022/09/27
8500
.NET面试题解析(11)-SQL语言基础及数据库基本原理
转自:http://www.cnblogs.com/anding/p/5281558.html
莫问今朝
2018/08/31
6840
.NET面试题解析(11)-SQL语言基础及数据库基本原理
数据库常见的面试题
我们现在需要建立一个描述学校教务的数据库,该数据库涉及的对象包括学生的学号(Sno)、所在系(Sdept)、系主任姓名(Mname)、课程号(Cno)和成绩(Grade),假设我们使用单一的关系模式 Student 来表示,那么根据现实世界已知的信息,会描述成以下这个样子:
Java3y
2019/10/17
1K0
【21】进大厂必须掌握的面试题-65个SQL面试
一个 数据库管理系统 (DBMS)是一个软件应用程序与用户,应用程序和数据库本身交互,以捕获和分析数据。
全栈程序员站长
2021/04/07
7.8K0
相关推荐
SQL面试 100 问
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档