【内容共创】表的“前世今生”(空间使用与MVCC)

举报
龙哥手记 发表于 2022/09/27 16:01:12 2022/09/27
【摘要】 帮助同学用数仓,可能出现的各种问题给出解决方法及思路,也了解下DB基础原理攒下姿势

本文主要内容有

  • 一 数仓这有啥用
  • 二 表的“前十今生”
  • 三 我的仓库我做主
  • 四 把风险关进笼子

一 数仓这有啥用

1.1 搞清楚定义

或者叫DWS,是一种基于华为云基础架构和平台的在线数据处理数据库,提供即开即用、可扩展且完全托管的分析型数据库服务。GaussDB(DWS)是基于华为融合数据仓库GaussDB产品的云原生服务 ,兼容标准ANSI SQL 99和SQL 2003,并兼容PostgreSQL/Oracle数据库生态,为各行业PB级海量大数据分析提供有竞争力的解决方案;

1.2 结构是什么


是GaussDB(DWS) 基于Shared-nothing分布式架构,具备大规模并行处理引擎,由众多拥有独立且互不共享的CPU、内存、存储等系统资源的逻辑节点来组成的。架构中,业务数据被分散存储在多个节点上,数据分析任务被推送到数据所在位置就近执行,并行地完成大规模的数据处理工作,来对数据处理的快速响应过程;

1.3 如何分层

应用层

数据加载工具、ETL(Extract-Transform-Load)工具、以及商业智能BI工具、数据挖掘和分析工具,均可以通过标准接口与GaussDB(DWS) 集成。GaussDB(DWS)兼容PostgreSQL生态,且SQL语法进行了兼容MySQL、Oracle和Teradata的处理。应用只需做少量改动即可向GaussDB(DWS)平滑迁移;

接口

支持应用程序通过标准JDBC 4.0和ODBC 3.5连接GaussDB(DWS) 。

MPP大规模并行处理集群

一个GaussDB(DWS) 集群由多个在相同子网中的相同规格的节点组成,共同提供服务。集群的每个DN负责存储数据,其存储介质是磁盘。协调节点(Coordinator)负责接收来自应用的访问请求,并向客户端返回执行结果,此外,协调节点还负责分解任务,并调度任务分片在各DN上并行执行;

自动数据备份

支持将集群快照自动备份到EB级对象存储服务OBS(Object Storage Service)中,方便利用业务空闲期对集群做周期备份以保证集群异常后的数据恢复;

快照是GaussDB(DWS) 集群在某一时间点的完整备份,记录了这一时刻指定集群的所有配置数据和业务数据;

工具链

它提供了数据并行加载工具GDS、SQL语法迁移工具DSC、SQL开发工具Data Studio,并支持通过控制台对集群进行运维监控。

1.4 集群逻辑架构

GaussDB(DWS)集群逻辑架构如下,实例的详细介绍请参见下表


集群的每个DN上负责存储数据,其存储介质也是磁盘。下图从逻辑上介绍了每个DN上都有哪些对象,以及这些对象之间的关系,都非常清楚

  • Database,即数据库,用于管理各类数据对象,各数据库间相互隔离;
  • Datafile Segment,即数据文件,通常每张表只对应一个数据文件。如果某张表的数据大于1GB,则会分为多个数据文件存储;
  • Table,即表,每张表只能属于一个数据库;
  • Block,即数据块,是数据库管理的基本单位,默认大小为8KB;
    数据有三种分布方式,可以在建表的时候指定:REPLICATION、ROUNDROBIN 、HASH;

二 张表的“前世今生”(空间使用与MVCC)

我们从一张表的创建,插入数据,更新数据,删除数据,truncate,drop来直观感受DWS的空间存储。下图表示的是,左边语句大家应该比较熟悉,当我们执行 创建一个table的语句时,语句本质来讲,右边是结构图,上一排是协调节点,下一排是数据节点;好了当语句执行事务也跟着执行,协调点叫CN,数据点叫DN,语句执行会生成它对应文件它会占用左边节点一些空间;另外还有辅助表,索引表都会生成Relation这张表;create table也会更新数据字典;总的来说,用户创建一张表时,这张表会在集群的每个“实例”进行CREATE动作,因此所有Coordinator与Datanode都会“存在”这张表。

接下来咱们用三个岔路口讲下三种类型的表

2.1 岔路口1(RoundRobin表)


我们叫它轮询表,意思是还是存储方式有关系,当创建表指定DISTRIBUTE BY ROUNDROBIN这种关键词,接下来我们会向集群插两组数据,第二组数据跟第一组都相同,也就是三行数据按顺序插入时,数据会均匀的分布在三个Datanode上,分布只和插入有关,二和数据特征无关,每个Datanode上面保存当前表总数据量的1/3。

2.2 岔路口2(哈希表)


这个用的多,这个表在创建在红色语句指定哈希分布键,如果不指定会取第一列指定,第一行数据插入到Datanode1后面也是一样哈,第二组数据插入时因为哈希都是4所以都会插入Datanode1,明显数据全部倾斜在D1上,结论是合理选分布键来规划自己业务;

来讲下数据倾斜危害,如下描述


负载不均衡咋理解呢,因为我们是MPP架构,处理DN节点包括其数据量,算力尽可能均匀,这样性能更优;结论是哈希表设计原则数据离散度大的列(组),会产生下面问题?

这时你不知道哈希键怎么选对吧?先大概有个评估,数据量上来发现不合理可用ALTER TABLE这种语法来改变分布列;当如果是迁移过来集群,选就很轻松;数据特点在源库你是可以知道的,还有种压根不知道咋选?没事,你可用第一种表;

2.3 岔路口3(REPLICATION表)


就是复制表,在每个DN上复制就行,所以空间占比就是原来三倍;

好了,接下来如何选表?看以下特点

接下来,讲下select这个过程,这个是哈希表比较简单,下一个是RoundRobin表是去所有都去排,使用起来没约束每一列都可以更新;复制表适合量不大,平时也不怎么更新这种;

有了相关的表,接下来我们看下“脏数据”是怎么来的

如图,首先来看DELETE还是上面那组数据,Datanode1上有id为1数据,我们要删掉id为1,原理是事务可变性,事务发生之前slect可以看到id为1原子的;另外mysql等主流数据库都有MVCC,大规模提高并发性能,结论是空间不会变化;

下个update,更新就是两个结合起来,但是整个过程只占一个事务id,执行之后dest_use会变成2,空间持续变大,也就是出现脏数据;

造成空间膨胀,我们有两种解决空间膨胀问题

VACUUM是从逻辑上回收空间,并且这部分可复用,只要复用速度比他快解决了膨胀;先提个概念,就是脏数据占比,高了查语句就会慢;右边语句是彻底回收脏页,它特点把数据做了整理,数据抽出来放到一个新表,它在整理过程会空间膨胀,也就是有效数据需要额外空间做整理的动作;有效空间咋算,用整个表大小乘以(1-脏率);小技巧优先清理脏率高的表;

总结下空间清理一共四种,下面都写得很清楚;

imagepng

这上面打下基础,后面才是硬菜

三 我的仓库我做主

3.1 哈希表倾斜问题

还是之前那个例子就会分布在Datanode1上,通过右边视图语句,我们优先过滤大表,并且视图会对所有表做查询,当库中的表超过5万就想其他办法,大仓不要用右边那样去查;

现在解决哈希表倾斜,通过ALTER TABLE,上面例子是改变分布列,左边明显是第二列离散度是很好作为分布列,重新选择右边列更加均匀了;

3.2 空间回收与脏数据

如图,左边语句执行消耗比较小,然后我们会对各字段排序把倾斜率大的重点关注,尤其是新业务上线;

3.3 仓库管理-自助清理

左边是Autovacuum原理,就是它只能影响对应DN范围,右边是智能调度包含如下


如果磁盘膨胀很快,我们可以配置多个策略,然后每天清理比如60%,这种清理技术是排他锁,建议调度周期是业务低峰;

总结下

四 把风险关进笼子

4.1 磁盘告警与订阅(提前感知到来的风险)

有各种告警配置,一般空间维持安全区间,接下来配置之后一定要订阅才能收到报警,并把告警级别进行订阅,华为云消息通知哪里也要配置;上面10分钟是为了持续10分钟在低阈值报警;

4.2 空间管控/单语句管控

比如有同学想插入数,下班时间上游供数供多了很可能爆磁盘,根据下图我们来配置下;如果是当天用法是要看下DN数是3,我要插12G,所以预估每天设置成不超过5G,还有隐含功能,如果来的是倾斜数据同样把倾斜数据清理掉;

总结下





关注下上面公众号,其实你可以提各种各样问题,就会回答语法或业务问题;

本文参与华为云社区【内容共创】活动第20期。
https://bbs.huaweicloud.com/blogs/374925

任务16: 理论+实操,轻松解决云数仓常见问题:玩转PB级数仓磁盘空间使用

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。