发布于

ODCP第四期:OushuDB学习心得

第一章 初识 OushuDB:
数据库的发展
1、第一代(1980s)共享存储架构 share storage:Oracle,IBM DB2,基于专有高端存储,价格昂贵,可扩展性差,十几个节点会遇到存储瓶颈。
2、第二代(1980s-2000s)大规模并行处理架构 MPP,无共享架构 share nothing:Teradata,greenplum,基于 x86 架构服务器,可扩展到百节点规模。
3、第三代(2000s)SQL on Hadoop:cloudera,spark,存储计算分离,可扩展到几千节点,性能一般,对 update/delete 和混合负载支持的不好。
4、第四代(2015)云原生架构:snowflake,oushudb,SIMD 执行器优化,支持 update/delete 和混合负载,存算分离架构,可扩展到上万节点,可基于云基础设施构建,实现弹性扩缩容。
oushudb 特点:云原生、高性能、强兼容、纯国产、应用广。
应用场景:核心数仓、数据集市、实时数仓、湖仓一体数据平台,支持 BI、即席查询、实时指标等分析应用
基本原理:
1、基础架构
OushuDB 基础架构分为:客户端、主节点、虚拟计算集群、虚拟存储集群
架构特点:
1)存算分离
多个 Master 处理用户请求,处理用户认证,协调分布式执行计划引擎
2)分布式执行计划引擎
负责 SQL 解析,语义分析,基于代价的查询优化,产生分布式查询任务
3)分布式任务调度引擎 QD
负责执行计划分发、状态跟踪,节点间数据分发
4)SIMD 向量化执行引擎
逻辑计划转化为物理计划,完成资源分配,启动并控制查询计划的执行,并将执行结果回传
5)分布式可插拔存储引擎
支持 HDFS/S3/本地表,支持行存/列存,数据编码,压缩,存储和读写
6)分布式事务管理
提供 ACID 机制,支持分布式锁,支持并发读写
7)元数据管理
数据库对象管理与存储、基于 MVCC 的事务处理机制
8)全局资源管理
多租户、多级资源队列的资源统一分配
2、基本组件
1)Master 节点:接收客户端查询,分解任务,分派到 segment 节点,汇总 Segment 节点执行结果并返回客户端
2)Segment 节点:接收到任务,fork 出 QE 进程,协同完成任务,结果返回 master 节点
3)Standby 节点(5.0 版本之前):保证集群高可用
4)Magma:OushuDB4.0 时引入的分布式存储,在主节点配置 observer 用来提供 magma 的可用节点,magma node 用于提供读写服务,支持数据增删改,支持索引,行列混存,
5)HDFS:主节点配置 namenode,数据节点配置 datanode
6)运行模式:standalone,独占系统资源,自己管理资源;yarn,OushuDB 作为应用注册到 yarn,由 yarn 做资源管理和分配,在主节点配置 resource manager,在各个子节点配置 node manager
7)interconnect:节点间的数据传输服务
组件间运行模式:
1)元数据存储在 Master 节点本地(5.0 版本之前)
2)Master 节点认证和接受客户端请求
3)解释器生成语法树,优化器生成执行计划,从资源管理器得到可用节点资源
4)从 HDFS Catalog 获取存储在 HDFS 上的数据的分布,生成最优查询计划,决定在哪些节点访问哪些数据
5)QD 将查询计划分派给各个 segment 节点
6)处理事务
计算节点:
1)物理节点就是一个 segment 节点
2)segment 节点可分为多个 vsegment 节点,一般为 2、4、6、8,缺省 8
3)vsegment 是并行查询的基本计算单元,container
3、部署架构
OushuDB Master:配置 Magma observer,Standby Namenode
OushuDB Standby:配置 Magma observer,Active Namenode
Zookeeper node:3 个,有两个尽量在 Master 和 Standby 节点上
segment 与 hdfs 的 datanode 混布可以利用到本地读提高性能
4、进程架构
1)postmaster:监听用户请求的守护进程,为每个用户 fork 单独的 postgres 服务
2)logger:收集各个子进程的输出,写到 pg_log
3)stats collect:收集统计信息写入。stat 文件
4)Writer:共享内存数据刷到磁盘
5)resource manager:资源管理,segment 可用性检查
6)DFS metadata cache:缓存 block 信息
7)checkpoint:周期性 checkpoint 或 checkpoint 请求
8)sequenceserver:生成序列
9)Wal send server/sync agent:发送 WAL 日志,接收并执行 WAL 日志
5、计算引擎,执行器,优化器
优化器:
启发式规则优化 RBP(Rule Based Optimization)
基于代价的优化 CBO(Cost Based Optimization)
提升执行器性能:
向量计算 Vectorized Execution:snowflake,oushudb
代码生成 Code Generation:impala
spark 两者都有使用
两种技术侧重点不同,但都可以提升性能,不同的语句也会有不同程度的性能提升,向量计算更适合并行处理数据
SIMD(single instruction multi-data)单指令多数据流
SISD 单指令单数据流
Orc 存储格式
列式存储、可压缩
提供多种索引:row group index, bloom filter index
支持复杂数据结构,例如 Map
新执行器支持 TPC-H/TPC-DS
TPC-H 比 Greenplue 快 5-10 倍,比 sparksql3.0 以上版本快几十倍
6、查询执行过程
client 连接 master 节点的 postmaster 进程
Master 节点的 postmaster 进程 fork 出 QD 进程
client 连接 QD 进程
QD 进程将 SQL 通过解析器生成语法树,通过优化器生成查询计划
查询计划分派到各个 segment
segment 的 postmaster 进程 fork 出 QE 进程
QE 进程执行查询计划,并将结果返回 Master 的 QD 进程
QD 进程汇总结果,并返回给 client
Motion 的种类
1)Redistribution Motion:数据重分布
2)Broadcast Motion:小表广播到所有节点
3)Gather Motion:Master 节点收集汇总 segment 的执行结果
按 Motion 划分 slice,每个 slice 对应一个 QE 进程
QE 进程数=vseg 的数量 * slice 数
vseg 数量的确定:
Hash 表由桶数确定
Random 表由 guc 值和 SQL 的复杂度决定
7、外部接口
PSQL:PostgreSQL 的命令行交互工具
JDBC:提供 JDBC jar
ODBC:兼容 pg 官方 ODBC
pgadmin:postgres 官方 UI 客户端
8、Magma
存储结构化数据
支持增删改查
基于 Raft 协议数据复制实现存储和访问服务的高可用
支持基于多版本 MVCC 的分布式事务特性
行列混存
支持索引,主键索引和非主键索引
非纯粹的存储,具有内建的计算能力,支持算子下推
便捷的集群扩展
容错和负载均衡
主要功能:数据分布、负载均衡、数据副本、索引、事务、数据清理
节点启动 magma 进程,多个 magma 进程组成 magma 集群
RangeGroup 有多个副本,RangeGroup Leader 对外提供服务
每个 RG 包含多个 Range
每个 RG 包含数据缓冲、数据文件、统计数据、索引文件、删除数据 DBTFile
数据文件的结构:由多个 block 组成,按行切分,block 内按列存分页保存
数据结构:
每个节点有多个数据目录
每个数据目录有多个 RG
RG 下有 ap 数据目录、index 索引目录、rafelog 日志目录
ap 下分为多个 Table,每个 Table 下包含多个 Range 目录
Range 目录下是持久化文件、统计数据、索引文件、DBTFile
9、HDFS
Datanode 负责文件存储和读写,将文件分为多个 block 分布在 datanode 上,client 对 block 可并行访问
Namenode 负责文件元数据管理,文件路径名,数据块 ID 和存储位置
副本:一个 block 复制多份,存在不同 datanode 或不同机架,应对磁盘损坏、datanode 宕机、交换机宕机
高可用:
block 计算校验和 checksum,通过其他副本恢复
datanode 磁盘坏,将 blockid 上报 namenode,由 namenode 通过其他副本生成新副本
datanode 宕机,通过心跳发现,namenode 通过其他副本生成新副本
namenode 宕机,通过 namenode 主从热备高可用机制恢复,zookeeper 提供 znode 锁,共享存储系统 shared edits 同步元数据信息

第二章:
(一)架构简介
1.OshuDb 特点:高并发、高吞吐、高性能的弹性计算能力。
2.主节点:资源管理器、查询解析器、优化器、容错服务、事务管理、权限安全、调度服务等重要组件。
3.组件的作用及其关系:
资源管理器:资源管理器负责整个集群的资源管理。
查询解析器:负责解析查询,并检查语法及语义。最终构成查询树传递给优化器。
分析器:针对语法树结构进行检查,对语法树进行数据补充或者必要的优化改进,在 OushuDB 中分析器和查询解析器是合并的。
优化器:负责接受查询树,构成查询计划。针对一个查询,可能有数亿个可能的等价的查询计划,但执行性能差别很大。优化器的作用是找出优化的查询计划。
容错服务:负责检测哪些节点可用,哪些节点不可可用。不可用的机器会被排除出资源池。
事务管理: 提供分布式事务的控制能力,OushuDB 能够提供基于多版本的事务隔离机制。
权限安全:负责控制用户的行为,对用户权限进行约束,保障数据库访问安全。
调度器:优化器优化完查询以后,查询派遣器派遣计划到各个节点上执行,并协调查询执行的整个过程。查询派遣器是整个并行系统的粘合剂。
计算层可以被划分为多个虚拟计算集群,每个虚拟集群相互独立,并且支持动态弹性扩展。
虚拟存储集群是 OushuDB 的存储层,由存储节点组成的多个可插拔存储集群组成。
(二)产品特性
1.存储与计算分离架构
2.分布式执行计划引擎
3.分布式任务调度引擎 QD
4.支持 SIMD 的极速执行引擎
5.分布式可插拔存储引擎
6.分布式事务管理
7.数据库元数据管理
8.全局资源管理
(三)部署架构
(四)进程架构
Master Standby N 个 Segment
(五)计算引擎及其执行器、优化器
1.优化器:基于代价的优化 CBO
2.执行器:向量计算外加 SIMD 优化技术
(1)SIMD(single instruction multi-data), 即单指令多数据流,以同步的方式在同一时间内执行同一条指令
(2)作为向量体系结构的一种,SIMD 使用一条向量指令开启一组数据操作,其中数据的加载、存储以及数据计算以流水线的形式进行
(3)新执行器全量支持 TPCH 和 TPCDS,TPCH 比 Greenplum 大约快 5-10 倍比 SparkSQL 3.0 以上的版本要快几十倍
(六)查询执行过程
1.在 Master 的节点启动 QD 进程,会有 N 个 Virtual Segment 进程,在每一个 Virtual Segment 进程里会起多个 QE 进程,其中还有每个 Slice 进程
(七)外部接口
兼容 PG 官方 JDBC,没有提供单独 ODBC。
(八)Magma
1.Magma 是存储,它是分布式的,高可用的,支持事务的
2.Magma 存储的数据是表数据,是结构化数据,不是简单的 KV
3.Magma 支持对表数据做更新和删除操作
4.它的高可用是通过 Raft 的协议数据复制来实现的。
它的事务特性是通过多版本来实现的。
它的高性能的是通过行列混合的存储格式来支持 OLAP 高性能查询。
它提供了数据索引功能,可以建立主键索引和非主键索引。
5.作为分布式的存储,它整合数据预处理技术,提供了便捷的集群扩展、集群容错以及负载均衡。
6.Magma 的功能,主要包括数据分布、数据清理、事务模型、索引、数据副本、负载均衡。
7.每个 range group 的数据包含了不同部分:数据缓冲、数据文件、统计数据、索引文件、删除数据。
(九)HDFS
关键组件:
1.DataNode:负责文件数据的存储和读写操作 HDFS 将文件数据分割成若干数据块(Block),每个 DataNode 存储一部分数据块,这样文件就分布存储在整个 HDFS 服务器集群中
2.NameNode:负责整个分布式文件件系统的元数据(MetaData)管理,也就是文件路径名、数据块的 ID 以及存储位置等信息,相当于操作系统中文件分配表(FAT)的角色
(十)对象存储
1.对象存储:面向对象的存储
2.综合了网络附加存储(NAS)和存储局域网(SAN)的优点,同时具有 SAN 的网速直接访问和 NAS 的分布式数据共享等优势,提供了具有高性能、高可靠性、跨平台以及安全的数据共享的存储体系结构
3.允许将计算基础架构与存储需求分离
4.本质上就是一个 key-value 结构,key 是文件的 URL 路径,value 是对应的文件,没有传统文件系统那种目录树的结构,不能直接打开修改文件,只能先下载、修改,再上传文件,所以不支持 append 和 truncate 操作,操作接口比较简单,主要接口命令有 PUT/GET/DELETE 等
5.优点
(1)无限存储 :服务商可以不停的往资源池里面增加资源
(2)数据安全可靠性高:多个数据中心间复制数据,至少可以保证 11 个 9 的数据持久性
(3)运维方便:客户不需要考虑硬件以及存储的运维工作,只要支付相应费用,这些都交由服务商处理
6.支持的对象存储类型
(1)Amazon Simple Storage Service (简称 S3)
亚马逊 AWS 服务在 2006 年正式对外推出的云计算对象存储服务。提供行可扩展性、数据可用性、安全性和性能
(2)腾讯云对象存储(Cloud Object Storage, COS)
腾讯云提供的一种用于存储海量文件的简单、可拓展、方便获取和分享数据的分布式存储服务,类似于网盘,可以存储任何类型的数据。腾讯云对象存储 COS 是简单、可拓展、方便获取和分享数据的云端存储服务。对象存储 COS 有费用低廉、零运维成本、弹性伸缩、安全可靠等优势
7.外表操作
8.内表操作
第三章:安装 OushuDB
第四章:用户指南
(一)数据定义
1.创建数据库
数据库是使用 CREATE DATABASE 命令创建的,可以通过 DROP DATABASE 命令删除。
查看现有数据库的集合:SELECT datname FROM pg_database;
创建数据库:CREATE DATABASE name; --当前角色自动成为此新数据库的所有者,且以后删除这个数据库也是这个用户的特权
在 shell 上创建新数据库:createdb dbname
为其它用户创建一个数据库,并且应该使他成为新数据库的所有者:CREATE DATABASE dbname OWNER rolename; 或 createdb -O rolename dbname
删除数据库: DROP DATABASE name;
在 shell 上可以通过 dropdb 删除数据库:dropdb dbname
2.创建数据表
CREATE TABLE my_first_table (
first_column text,
second_column integer
);
三种存储格式:row(行);orc(行列混合存储,不支持 index);magama(行列混合存储,自动选择压缩算法)
删除表:DROP TABLE my_first_table;
主键:
CREATE TABLE example (
a integer,
b integer,
c integer,
PRIMARY KEY (a, c)
) FORMAT 'MAGMAAP';
3.修改表
增加列:ALTER TABLE products ADD COLUMN description text DEFAULT value;
ALTER TABLE products ADD COLUMN description text DEFAULT value CHECK (description <>'');
删除列:ALTER TABLE products DROP COLUMN description;
增加约束:ALTER TABLE products ADD CHECK (name <> '');
不能写成表约束的非空约束:ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;
查看约束名字:\d tablename
删除约束:ALTER TABLE products DROP CONSTRAINT some_name;
删除非空约束:ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;
改变列的缺省值:ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
移除任何缺省值:ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
把 1 个列转换成另外 1 种数据类型:ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);
重命名 1 个列:ALTER TABLE products RENAME COLUMN product_no TO product_number;
重命名表:ALTER TABLE products RENAME TO items;
4.表分区
(1)表分区是把逻辑上的一个大表拆分成多个子表,这样不仅能带来访问速度的提升,更能带来管理和维护上的方便
优点:
查询优化器可以针对分区表进行优化,如果查询只涉及到某些分区,则查询计划只需要扫描这些分区,从而加速查询
如果我们按照日期进行分区的话,我们可以简单的加入分区和删除过期的分区。
(2)支持基于 Range 和 List 的两种分区方式
Range 分区:表被一个或者多个关键列分区成”范围”,这些范围在不同的分区里没有重叠。 比如依据日期、价格数值范围进行分区。
List 分区:依据一个值的列表进行分区,比如依据地区列表进行分区。
(3)创建新的分区表使用 CREATE TABLE … PATITION BY 语法实现,创建分区表步骤如下:
1.确定分区类型:范围分区 RANGE 或列表分区 List
2.选定分区字段:范围分区多为日期、数值类型字段;列表分区多为枚举类型的特定列表
3.确定分区级别:OushuDB 支持子分区 SUBPARTITION,可以按照不同维度实现多级分区
(4)分区现有表
4.按照现有大表结构创建一个新的分区表
5.将现有大表中的数据 load 到新创建的分区表中
6.删除原来的大表
7.按照原来大表名称重命名分区表名称
(5)查看分区:pg_partitions
(6)查看分区表使用的分区键列:pg_partition_columns
(7)提醒:
数据量达到千万记录以上时使用分区表。数据仓库中的事实表适合作为分区表。对于小于这个数量级的表通常不需要分区。因为系统管理与维护分区的开销会抵消掉分区带来的可见的性能优势。
只有当实施了其它优化手段后,响应时间仍然不可接受时,再考虑使用分区。
根据分区定义条件,分区条件应尽可能使数据平均划分。例如,将一个大表分成 10 个相等的分区,如果查询条件中带有分区键,那么理论上查询应该比非分区表快将近 10 倍。
分区数不要超过 128 个,太多的分区将会减慢管理和维护任务。如检查磁盘使用、集群扩展、释放剩余空间。其次,只有在查询条件可以利用分区消除时,性能才会得到提升。否则,一个需要扫描所有分区的查询会比非分区表还慢。
除非必要,少用多级分区。多级分区会使分区文件的数量快速增长。例如,如果一个表按日期和城市做分区,1000 天的 1000 个城市的数据,就会形成 100 万个分区。假设表有 100 列,并且假设表使用面向列的物理存储格式,那么系统为此表需要管理 1 亿个文件
(二)数据操纵
目前 oushudb 兼容的表格式中,目前只有 ORC 和 MAGMA 格式的表支持更新和删除操作,AO 格式的表不支持
(三)数据查询
从数据库中检索数据的过程或命令叫做查询
(四)数据类型
character(n), char(n) 定长
character varying(n), varchar(n) 不定长
text 长度无限制
(五)函数和操作符
用于表示真假的逻辑操作符
用于比较大小的比较操作符
常用的数学运算函数与操作符
用于日期时间处理的函数与操作符
用于检查和操作字符串数值的函数和操作符
以及常用于从一组输入值里计算结果的聚合函数
(六)索引
1.适合考虑使用索引:
2.对于查询返回小结果集的查询工作负载,索引可提升性能。
3.创建选择性的 B-tree 索引。
4.用于频繁连接的列索引可以通过为查询优化器启用更多的连接方法来提高连接性能。
5.WHERE 子句中经常引用的列适合作为索引。
创建索引:CREATE INDEX name_idx ON employee (e_name);
删除索引:DROP INDEX title_idx;
(七)别名与视图
别名:与 Oracle 一致
视图:CREATE [TEMP | TEMPORARY] VIEW view_name AS SELECT column1, column2..... FROM table_name WHERE [condition];
(八)自定义函数
基本语法:CREATE [OR REPLACE] FUNCTION function_name (arguments) RETURNS return_datatype AS variable_name DECLARE declaration; [...] BEGIN < function_body > [...] RETURN { variable_name | value } END; LANGUAGE lang_name;
SQL 函数的参数使用:
1.在函数参数声明时取一个名称,然后在函数体中只写该名称。如果参数名称与函数内当前 SQL 命令中的任意列名相同,列名将优先。
2.参数可以用语法 $n 引用:$1 指的是第一个输入参数,$2 指的是第二个,以此类推。不管特定的参数是否使用名称声明,这种方法都有效。
删除函数:DROP FUNCTION add_em(INTEGER,INTEGER);
(九)事务与锁
事务(TRANSACTION)是数据库管理系统执行过程中的一个工作单元,由一个或多个数据库操作序列构成。
通常,数据库事务会包含了一个序列的对数据库的读/写操作,包含有以下两个目的:
1.为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
2.当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
锁:
在多个用户访问数据库的时候若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。这个时候便可以通过锁来阻止用户修改一行或整个表,以保持数据库数据的一致性,锁一般用在并发较高的数据库中。
数据库中有两种基本的锁:排它锁(Exclusive Locks)和共享锁(Share Locks)。
如果数据对象加上排它锁,则其他的事务不能对它读取和修改。
如果加上共享锁,则该数据库对象可以被其他事务读取,但不能修改。
基本语法:LOCK [ TABLE ] name IN lock_mode
LOCK 语句只在事务模式下工作,所以我们要先通过 BEGIN 开始一个事务:BEGIN; LOCK TABLE department1 IN ACCESS EXCLUSIVE MODE;
第 5 章 管理指南
(一)集群监控
常用的状态监控一般包括如下几种:
命令行检测:oushudb state
SQL 检测:
SELECT * FROM gp_segment_configuration; 我们可以通过这条命令所查询的表来查看节点的状态数据库连接数检查
select count(1) from pg_stat_activity ; 来查看当前正在活跃任务的情况
select count(1) from pg_stat_activity where current_query<>'' and procpid<>pg_backend_pid();
可视化监控:
通过偶数云平台可视化监控,我们可以查询的信息包括
1.集群信息:在图中我们可以看到当前集群包括了 Kafka、LittleBoyServer、Spark、Hawk 以及 HDFS 等等
2.其次,我们可以看到每个集群的详细信息。包括集群的节点数、创建者、状态,以及关联的集群等等
3.然后,我们还可以看到集群的设备 CPU 状态、内存状态、磁盘 IO 状态、网络 IO 状态的监测情况。CPU、内存等状态,还可以查询使用 TOP5 的情况。
(二)数据库角色和权限
创建角色:CREATE ROLE name;
删除角色:DROP ROLE name;
shell 操作:createuser name dropuser name
检查现有角色的集合:SELECT rolname FROM pg_roles;
权限:grant
(三)资源队列
资源队列的概念和行为特点:
客户端登陆 master 后,其提交的 SQL 资源分配方案由对应的一个 OushuDB 资源队列决定,对应的资源队列是基于 Role 定义
每个 Role 只能选择一个资源队列
每个资源队列可以为多个 Role 的多个并发的客户端提供资源分配服务
优化器申请资源时会同时提供 SQL 执行目标表规模和数据分布特征,资源队列跟踪并行使用资源的动态状况,
因此 OushuDB 资源分配就能够实现
1.能够根据计算或 IO 成本弹性选择 SQL 运行的并行度
2.能够选择距离访问数据最近的 Segment 分配 Virtual Segment 提高 IO 效率
3.能够考虑并行的资源使用申请,公平分配资源给并行运行的 SQL 语句
4.能够针对并行计算特点均衡 Segment 间资源消费,优化并行计算吞吐
5.能够自动实现资源队列间资源调动
通常一个资源队列固定了其分配的所有 Virtual Segment 的资源指标,因此一个 SQL 运行得到的资源分配方案表现为实际分配得到的每个 Segment 上的 Virtual Segment 数量
第 6 章 数据备份恢复
通过 gpfdist 外部表导入数据
使用 gpfdist 进行数据加载通常有四个步骤,分别是:
1.启动 gpfdist 文件服务器
2.把需要加载的数据文件放到 gpfdist 数据目录
3.定义外部表
4.加载数据
通过 gpfdist 外部表导出数据
1.启动 gpfdist 文件服务器
2.准备导出的表
3.定义外部表
4.导出数据
hdfs 外部表导入数据
使用 hdfs 外部表进行数据加载有三个步骤。
1.把需要加载的数据文件放到 hdfs 数据目录
2.定义外部表
3.加载数据
hdfs 外部表导出数据
1.准备导出的表
2.定义外部表
3.导出数据
第 7 章:编程接口

评论
    test