开发者学堂课程【AnalyticDB PostgreSQL 产品调优及最佳实践:核心能力介绍】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1232/detail/18393
核心能力介绍
内容介绍:
一、ADBPG 产品介绍
二、ADB PG 权限管理
一、ADBPG 产品介绍
线上 ADBPG 是兼容性仓库
阿里云自研云原生MPP数据仓库,强兼容PG/Greenplum开源生态,兼容Oracle/TD语法生态:自研云原生存算分离架构,具备秒级弹性和数据共享等国内领先的产品能力:拥有完整的企业级分析能力,融合阿里云产品生态,可打造全场景覆盖的一站式数据平台;
优点如下:
(1)云原生架构存算分离
全新自研云原生架构,解耦计算和存储,支持秒级扩缩容,按需存储付费:默认支持行列混存,使用分层存储架构,设置缓存加速:面向多实例,开放数据共享,实现云原生实例间数据一写多读架构。
(2)TB~PB级数据实时响应
MPP水平扩展架构,TB-PB级数据查询秒级响应:向量化计算,及列存储智能索引,领先传统数据库引擎性能3x;新一代SQL优化器,实现复杂分析语句免调优
(3)稳定可靠、简化运维
飞天平台基于阿里多年大规模集群系统构筑经验打造,智能硬件管理,故障监控诊断自恢复,支持MPP数据库实现复杂集群系统高可靠,自运维。
(4)企业级分析能力
支持SQL 2003,强兼容PG/Greenplum开源生态,部分兼容Oracle语法,支持PL/SQL存储过程,OLAP窗口函数,触发器,视图等,完备功能和生态,实现应用快速适配,支持主流数仓迁移上云
(5)数据多模分析
通过PostGIS插件支持地理信息数据分析;内置100+机器学习算法库,实现数据智能探索;高性能向量检索算法,支持视频/图像检索以搜图。
ADP PG发展历程
整个发展历程从17年正式上线,到版本的引进,再到云原生架构、存算分离都做了大量的工作,整个过程是技术的引进也是产品的发展历程
ADB PG生态集成
因为ADB PG也兼容PG/Greenplum,所以无论是外围生态,PG/Greenplum对接云上有QACS和RDS产品。OACS移线Maccompute、OACS、Flink。同步服务有DTS,通过联邦分析可以对接叶梦,主要是对接hadupe的生态系统,所以整个外围生态,包括PG的生态,大数据的生态,还是比较丰富的。
ADBPG产品架构
MPP水平扩展,海量数据实时分析,兼容Oracle语法生态,高可用HA架构,支持分布式事务。MPP数据库,支持一写多读,底层存储目前只有行存列存,执行层为自己重新写的现代化执行引擎。连接外部可以直接访问ODCS和ODPS。
特点如下:
多活协调节点:
·Cascade 架构 SQL 优化器
·全局分布式事务管理
计算节点水平扩展:
·计算任务全并行执行·
新一代向量化计算引擎·
非结构化数据检索
高可靠存储引擎:
·本地数据双副本·
支持行存储/列存储·
高吞吐导入/导出
分布式事务支持:
·支持分布式事务,保证强一致性
·支持SI/RC隔离级别
丰富的字段类型
如今公测已经是ADB PG7,内核已经升级到了PG12.ADB PG6内核是9.4。可以理解为9.4的生态类型都支持。目前ADB PG 12前的所有生态数据类型都支持。数字类型,日期,字符串,几何类型,向量范围称为数组类型。
ADB PG支持丰富的数据类型,您还可以使用CREATE TYPE命令定义新的数据类型
数值类型:
smalint,bigint,bigserial,bit[{n}],bit varying[(n)],Boolean,bytea,decimal[(p,s)],double precision,
real,serial,money
字符串类型:
character[(n)],character varying[(n)]
text,xml,json
范围类型:
int4range int8range numrangetsrange tstzrange daterange
日期/时间类型:
timestamp[(p)] [without time zone]
timestamp[(p)] with time zone
time[(p)] without time zone]
time[(p)] with time zone
interval [fields][(p)]
date
几何类型:
path,point,polygon
向量类型:
float[]
完整&标准的SQL语法
函数、存储过程、过程化语言
ADB PG 支持丰富的函数及运算符,如 JSON 函数和操作符、窗口函数、高级聚合函数、文本搜索函数和操作符、范围函数和运算符等等。
目前来说语音上,不管是 PO JAVA 还是 POpython的沙箱机制都没有很健全,一般都是客户申请工单不会默认开放给客户,一般推荐用户用POP circle。在写circle写存储过程的时候会用UDF来写。开工单可以用C或Java或Python,但由于安全隐患,默认没有打开。
ADB PG实例逻辑架构
整个逻辑架构为一个实例可以建很多个数据库,并且为相对传统的数据库,如MY SQL、PG
都是可以建库,库里面有Schema,Schema下面有表。一般建表要指定分布键,也可以使用分布键Hash值,随机Random,或复制Replication三种方式,但一般线上客户使用的最多的是MPP分布键的分布方式。也支持压缩和分区表。一般来说客户用的是一个MPP,因为购买的时候会买ADB PG几个节点,数据肯定分布在节点上,所以需要选择分布键,若不选
数据库实例:
云平台上的一个MPP数据库集群,创建时分配固定资源,包含一组模式、表对象和数据以及用户
模式(SCHEMA):
逻辑概念,数据库中的一组逻辑空间,包含一系列表,视图等对象。
表定义选项:
数据分布定义:按分布键Hash值,随机Random,或复制Replication三种方式,进行节点间数据分布。
存储格式定义:支持指定按行存储,或者按列存储。
压缩算法定义(可选):支持多种高性能数据压缩算法,包括LIZ4,ZSTD,RLE等。
分区表支持(可选):对于大表,支持按区间Range,或值LIST进行分区,且支持多级分区。
ADB PG 表结构定义
分布键一般会默认第一列,容易造成数据倾斜。比如按照分布键 OrderID ,选择组件或unique会比较好,若没有组件可以拿符合的分布键就行。
如今ADB PG6在建表时客户需要选择表的类型。传统是行存表和列存表。
行存表:高吞吐更新写入,点查询
数据按行存储,操作某列必须读入整行
适合较多数据更新操作场景
通过索引,支持高并发的点查询
列存表:
批量加载,全表聚合,压缩率高
数据按列存储一每一列单独存放,数据即是索引
只访问查询涉及的列-大量降低系统IO
数据类型一致,数据特征相似-实现高压缩率
适合更新少,全表聚合操作
向量化计算引擎
新一代计算引整Laser,消除火山模型碎片化内存分配
采用LLVM进行动态代码生成(CodeGen),提升表达式计算性能
利用CPU的SIMD技术,指令级并行,进一步提升性能
Cascade 框架 SQL 优化器,复杂查询免调优
新一代 cascade 框架的 SQL 优化器,面向全并行执行架构,代价优化 CBO 和规则优化RBO相结合,实现复杂 SQL 免调优。优化系统还增加了实时物化视图的功能。感兴趣的可以去官网查看详细文档。
特点:
(1)Top-Down 路径搜索框架,搜索和路径选择更全面精准,避免出现局部查询路径最优解
(2)子查询自动改写为分布式 JOIN 实现并行计算,规避手工改写调优
(3) SQL 优化阶段定义动态分区裁剪,即支持确定性过滤条件,也支持参数化的过滤条件,减少 I/O
外部数据源—OSS
ADB PG 对接的云上的QSS可以作外表的导入导出,还可以联邦分析查询。
1、适用场景
(1) OSS 数据导入到本地表(行存表/列存表)
(2)直接查询分析 OSS 海量数据
(3)OSS外表与本地表关联分析
2、OSS外表分类
(1) OSS 普通外表
(2) OSS 分区外表,例如,适用于 SLS 归档日志
OSS外表数据来源
(1)酒业务应用APP写入到 OSS
(2)阿里云 SLS 的日志日档
(3)阿里云 DLA 的ETL输出
具体操作请参考官网文件:http//help.aliyun.com/document detail/445437.html
外部数据源-ODPS(现在交MaxComputer)
适用场景
(1)ODPS 数据同步至 ADB PG
(2)直接查询分析 ODPS 表
(3)ODPS 表与 ADBPG 表关联直询
ODPS外表分类
(1)普通外表,对应ODPS非分区表
(2)末级分区外表,对应ODPS未级分区表
(3)分区外表,对应ODPS分区表
异构数据源导入与联邦分析
联邦分析即不光能访问ODPS,还能访问OSS,还有Haddoop生态系统
通过部署PXF服务进行外表访问:
Hadoop HDFS(Text|Avro|JSONIORCIParquet)
SQL Databases(Oracle|MySQL|PostgresQL)
查询性能加速:
列过滤
谓词下推
通过外表加载的方式,可实现高性能数据导入,加载性能随节点数线性扩展:
INSERT INTO<目标表>SELECT*FROM<外部表>
二、ADB PG权限管理
1、ADB PG 权限体系
ADB PG权限体系继承了 PG社区的权限体系,它包括以下权限:
(1)实例权限
实例权限可以理解为能否连接的问题,当我们买了一个产品后,上面云数据有一个安全性白名单控制,能够允许某一个IP访问,允许某个客户能够访问或不能访问,都是在PG的hba文件控制。
即能修改pg_hba.conf
(2)数据库权限
grant赋予是否允许连接成创建schema的权限
revoke回放
数据库级别的权限包括:
是否允许连接数据库
是否允许在数据库中创建schema
默认情况下,数据库在创建后:
允许public角色连接,即允许任何人连接。
不允许除了超级用户和owner之外的任何人在数据库中创建schema
会自动创建名为public的schema.这个schema的alI权限已经腻子给public角色,即允许任何人在里面创建对象。
(3)schema权限
grant赋予允许查询schema中的对象或在schema中创建对象
revoke回收
schema级别的权限包括:
是否允许查看schema中的对象
是否允许在schemm中创建对象
默认情况下新建的schema的权限不会赋予给public角色,因此除了超级用户和owner,任何人都没有权限查看schema中的对象或者在schema中新建对象。
(4)object权限
grant赋予
revoke回收
数据库里object一般指表、视图和列等。
(5)表空间
grant赋予允许在对应表空间创建表,物化视图,索引,临时表
revoka回收
表空间意味着每个数据库都可以建在不同的数据目录下面,但如今云上安全把控比较重,还未开放。
对象级别的权限每种型的对象权限都一样,相对来说PG的社区语法是很完备的,想要的功能几乎都可以在文档中找到权限控制体系。
具体请参考文档 https//www.postqresql ora/docs/9.4/sql-grant_html
赋予权限语句
GRANT权限ON对象类型对象名TO用户名如:
GRANT SELECT ON TABLE table TO userl; --.允许user1 select table
GRANT SELECT ON TABLE table TO publlc;--允许所有人select table
撤销权限
REVOKE权限ON对象类型对象名FROM用户名如:
REVOKE SELECT ON TABLE table FROM userl:--不再允许user1 select table
查看权限
可以用 select查也可用快捷命令查
默认权限
如果你是用户建的表不把权限给其他人,则其他人是无法查看的,默认权限,控制着以后在sehema下创建的对象所具有的默认权限相当于schema下创建的新对象都会首先执行一组gant/revoke语句对 schema中已有对象无效。
默认权限遵循的原则是最小原则,创建后不给其他人看其他人是无法查看的,除非在public下面,public schema其他人都可以访问,但其他人也只能进入public schema,如果不允许访问,其他人也是不能查看表。
2、资源管理
ADB PG 弹性存储形态
弹性存储实例在购买的时候会每个节点附带共享盘,一个默认规则,如果并发很高的话建议节点计算规格的时候靠数相对选择多一点,如今节点规格支持升降配。计算节点用MBP,数据选的越多,单条查询就越短,可以增缩选择4-8或8-4都可以。云盘可以无感知扩容,但目前云盘并不支持缩。
Segment :数量越多,单条查询性能越好;CPU核数越多,并发能力越好,目前Segment计算节点数支持扩容、缩容
ECS:CPU内存资源规格支持垂直升降配
云盘:云盘目前支持ESSD/高效云盘,支持ESSD云盘扩容(用户无感知)
在单个 ECS 上资源是如何划分
ADBPG计算节点资源管理
ADBPG是一个重计算和重资源的MPP数据库,可谓有多少资源就能消耗多少资源,带来的好处是处理速度变快了,坏处就是容易超过系统总量。
系统资源包括:CPU、内存、网络、磁盘IO、文件句柄,其中最重要的是内存、一旦内存分配超限,容易导致各种系统问题:
如果不进行管理变化变高不限流会占用很多内存,运行会比较慢。带来危害
ADBPG资源管理的两个方案:Resource Queue和Resource Group
目前公有云Resource Group由于安全问题,暂不支持
ADBPG 资源管理-Resource Queue
支持自定义执行队列,根据用户角色,其执行任务进入对应资源管控队列。任务队列支持设定:
并行执行任务数
CPU优先级
内存资源上限
示例:定义三个队列
ETL队列:赋予资源获取最低优先级
BI报表队列:赋予资源获取最高优先级
数据探索队列:赋予资源获取中间优先级
建三个Q,一个是ETL角色人物,一个是BI报表角色人物,一个是数据探索角色人物。可以设定每个Q的朝位如一个5个,一个10个,一个2个,ETL角色发动查询的时候最多只有5个朝位,只有它的朝位出来了,其他的角色才能进入查询。
Resourc Queue 简介
Resource Queue是ADBPG最早的资源管理方式,支持通过SQL配置
Resource Queue支持进行四种类型的资源限制:并发限制、CPU限制、内存限制和查询计划限制。
超级用户可以通过SOL在数据库内定义多个资源队列,并设置每个资源队列的资源限制。在一个数据库中,每个资源队列可以关联一个或多个数据库用户,而每个数据库用户只能归属于单个资源队列。资源队列支持的资源限制配置如下:
CREATE FESOURCE QUEUE name WITH (queue_attribute=value [ ... ])
where queue_attribute is:
ACTIVE_STATEMENTS=integer
[ MAX_COST=float[COST_OVERCOMMIT=(TRUEIFALSE)]]
[ MIN_COST=float ]
[ PRIORITY=(MINLOWMEDIUMHIGHIMAX)]
[ MEMORY_LMIT='memory_units’]
说明:
MEMORY_LIMIT(内存限制)
队列中所有查询所使用的的内存的量。例如,对ETL查询设置2GB的MEMORY LIMIT,这样每个Segment里的ETL查淘最多使用2GB的内存。
ACTIVE STATEMENTS(一般用这个设置并发比较多)
队列中槽位的数量;一个队列中最大可并行数,当所有槽位都占用时,新的查询必须等待,默认每个查询使用等量的内存。
PRIORITY
查询使用的相对CPU使用量,可以设置为以下级别:BOW、MEDIUM、HIGH 和MAX,默认级别是MEDUM,查询优先权的机制会监控系统中所有正在运行的查询的CPU使用量,并根据其优先权别来调整其CPU使用量,例如,你可以为执行各源队列设置MAX优先权,为其他 查询设置MEDIUM优先权,确保执行查询可以获得比较多的CPU资源。
MAX COST(估算)
查询计划消耗限制。数据库优化器会为每个查询计算消耗,如果该消耗超过了资源队列所设定的的MAX COST的值,该查询就会被拒绝
Resource Queue使用:创建资源队列
创建资源队列一般如下三个并发,优化级一般估的不是很准。创建一个队列将队列给某一个角色即可,因为创建队列以后肯定需要绑定到一个客户上去,然后客户用这个队列。
创建带有并发限制的队列
带有ACTIVE_STATEMENTS设置的资源队列会限制指派给该队列的角色所执行的并发查询数量例如,要创建一个名为adhoc且并发限制为3的资源队列:
=# CREATE RESOURCE QUEUE adhoc WITH (ACTIVE _STATEMENTS=3);
创建带有内存限制的队列
,带有MEMORY_LIMIT设置的资源队列控制所有通过该队列提交的查询的总内存。总内存不应超过每个Segment可用的物理内存。以每个Segment为基础,设置MEMORY_LIMIT为90%的可用内存.
例如,如果一台主机有48GB物理内存和6个Segment实例,那么每个Segment实例可用的内存是8GB,可以为单个队列按照0.90*8=72GB来计算推荐的MEMORY_LIMIT。如果在系统上创建有多个队列,它们的总内存限制加起来也必须为7.2GB
=#CREATE RESOURCE QUEUE myqueue WITH (ACTIVE_STATEMENTS-20,
MEHORY LIMIT-"2000HB”):
设置优先级
为了控制一个资源队列对可用CPU资源的消耗,管理员可以指派一个合适的优先级。当高并发导致对CPU资源的竞争时,与较高优先权资源队列相关的查询和语句将会比较低优先权的查询和语句得到更大份额的可用CPU。优先级有几种设置: LOW、MEDIUM、HIGH、MAX在创建队列后,可以通过ALTER语句重新设置优先级
=#P CREATE RESOURCE QUEUE executive WITH (ACTIVE STATEMENTS=),PRIORITY=MAX);
=#ALTER RESOURCE QUEUE adhoc WITH (PRIORITY=LOW):
=#ALTER RESOURCE QUEUE reporting WUTB(PRIORITY=BIGB)
Resource Queue 使用:状态监控
ADB PG 资源队列监控指标
队列如今支持在控制台上进行云监控
rsqHolders代表当前运行的SQL并发数rsqWaiters代表正在排队的SQL,若rsqWaiters不等于0则代表在排队。资源队列并发超过当前设置因此需要排队。