OushuDb笔记
第二章:
(一)架构简介
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 语法实现,创建分区表步骤如下:
- 确定分区类型:范围分区 RANGE 或列表分区 List
- 选定分区字段:范围分区多为日期、数值类型字段;列表分区多为枚举类型的特定列表
- 确定分区级别:OushuDB 支持子分区 SUBPARTITION,可以按照不同维度实现多级分区
(4)分区现有表 - 按照现有大表结构创建一个新的分区表
- 将现有大表中的数据 load 到新创建的分区表中
- 删除原来的大表
- 按照原来大表名称重命名分区表名称
(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 函数的参数使用:
- 在函数参数声明时取一个名称,然后在函数体中只写该名称。如果参数名称与函数内当前 SQL 命令中的任意列名相同,列名将优先。
- 参数可以用语法 $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();
可视化监控:
通过偶数云平台可视化监控,我们可以查询的信息包括
- 集群信息:在图中我们可以看到当前集群包括了 Kafka、LittleBoyServer、Spark、Hawk 以及 HDFS 等等
- 其次,我们可以看到每个集群的详细信息。包括集群的节点数、创建者、状态,以及关联的集群等等
- 然后,我们还可以看到集群的设备 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 资源分配就能够实现
- 能够根据计算或 IO 成本弹性选择 SQL 运行的并行度
- 能够选择距离访问数据最近的 Segment 分配 Virtual Segment 提高 IO 效率
- 能够考虑并行的资源使用申请,公平分配资源给并行运行的 SQL 语句
- 能够针对并行计算特点均衡 Segment 间资源消费,优化并行计算吞吐
- 能够自动实现资源队列间资源调动
通常一个资源队列固定了其分配的所有 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.导出数据