#ODCP第三期OushuDB课程学习笔记
OushuDB 课程学习笔记:
一、分析型数据库,即数据仓库的发展经历了 4 个阶段:
1.第一代分析型数据库采用的就是传统交易型数据库的共享存储(Share Storage)架构。
2.第二代分析型数据库称为 MPP,采用无共享架构(Share Nothing)。
3.第三代数据仓库 SQL-on-Hadoop,包括 Hive 和 SparkSQL 等,一般都采取了存储与计算分离架构。
4.新一代云数据仓库,融合了 MPP 和 Hadoop 的两者的优点,在兼容性和性能等方面补足了以往产品的短板,整体表现更优秀。OushuDB 从设计之初就定位在新一代云数据仓库,其新一代 SIMD 执行器比传统 MPP 要快 5-10 倍,比一般的 SQL-on-Hadoop 要快 20 倍左右。OushuDB 支持 Update/Delete 和混合工作负载,实现了自研存储、对象存储,突破了 HDFS 的瓶颈。在可扩展性方面,采取了存储与计算分离的架构,可以扩展到上万节点,并且可以原生适应云计算的弹性需求。
二、OushuDB 5.0 的基础架构:
1.OushuDB 是一款云原生架构的分布式数据库,具备高并发、高吞吐和高性能的弹性计算能力。它支持多主节点、多虚拟计算集群和多虚拟存储集群。每一层级的节点都可以水平扩展,存储与计算完全分离。
2.OushuDB 的架构:客户端、主节点、虚拟计算集群、虚拟存储集群。
3.主节点(Main Node)包含资源管理器、查询解析器(Parser/Analyzer)、优化器、容错服务、事务管理、权限安全、调度服务等重要组件。在执行查询时,针对一个查询,弹性执行引擎会启动多个虚拟子节点(Segment) 同时执行查询,节点间数据交换通过高速互联网络(Interconnect)进行。如果一个查询启动了 1000 个虚拟子节点,意味着这个查询被均匀的分成了 1000 份任务,这些任务会并行执行。所以虚拟子节点数量代表了查询的并行度。查询的并行度是由弹性执行引擎根据查询复杂度以及当前资源使用情况动态确定的。
4.组件的作用及其关系如下:
4.1 资源管理器:资源管理器负责整个集群的资源管理。资源管理模块能够感知集群健康状态,动态识别集群节点。协调并发查询之间的资源分配,避免查询之间相互影响,提升系统的可用性。
4.2 查询解析器:负责解析查询,并检查语法及语义。最终生成查询树传递给优化器。
4.3 分析器:针对语法树结构进行检查,对语法树进行数据补充或者必要的优化改进,在 OushuDB 中分析器和查询解析器是合并的。
4.4 优化器:负责接受查询树,生成查询计划。针对一个查询,可能有数亿个可能的等价的查询计划,但执行性能差别很大。优化器的作用是找出优化的查询计划。
4.5 容错服务:负责检测哪些节点可用,哪些节点不可用。不可用的机器会被排除出资源池。
4.6 事务管理:提供分布式事务的控制能力,OushuDB 能够提供基于多版本的事务隔离机制。
4.7 权限安全:负责控制用户的行为,对用户权限进行约束,保障数据库访问安全。
4.8 调度器:优化器优化完查询以后,查询派遣器派遣计划到各个节点上执行,并协调查询执行的整个过程。查询派遣器是整个并行系统的粘合剂。
5.计算层可以被划分为多个虚拟计算集群(Virtual Compute Cluster),每个虚拟集群相互独立,并且支持动态弹性扩展。每个虚拟计算集群下可以划分多个虚拟计算集群实例,这些实例能够很方便的提供多租户支持。每个虚拟计算集群实例又包括多个计算节点。每个计算节点上会运行一个 OushuDB 子节点(Segment)。计算节点可以动态添加,节点加入到虚拟计算集群后即可接受查询任务。子节点实现了 OushuDB 的计算,在执行查询时,会在资源容器中启动多个查询执行器(Query Executor),实现对数据的并行处理。计算层支持全新的 SIMD 向量化执行引擎,相比于传统的 MPP 数据库,查询性能可以实现数量级提升。
6.虚拟存储集群(Virtual Storage Cluster)是 OushuDB 的存储层,由存储节点组成的多个可插拔存储集群组成。OushuDB 支持可插拔存储,包括 Magma、HDFS、S3,并支持用户对存储集群按照不同的特性与用途进行集群分组, 这些不同的存储集群是 OushuDB 中的虚拟存储集群。存储集群虚拟化可以支持更大规模的存储,支持多租户的存储资源隔离,并提供全球级别的数据分布和更高的容灾级别。Magma 是 OushuDB 自研的存储模式,是一种高可用的支持分布式事务的高性能分布式存储,支持存储与计算分离架构。在虚拟存储集群中,主要分两类:元数据集群与数据集群。元数据集群依托于 Magma 存储,是 OushuDB 用来管理元数据的集群,相比于传统的集中式元数据管理,元数据集群能够极大的提高元数据管理上限,提升数据库容错能力。用户数据存储则到数据集群中。
三、OushuDB 的主要产品特性:
1.存储与计算分离架构
多个主节点处理用户对数据库的连接请求 (JDBC/ODBC),处理用户认证及协调分布式执行计划引擎、数千个计算/存储节点分布式调度服务来完成后续 SQL 查询的处理流程。
2.分布式执行计划引擎
负责用户端标准 SQL 语句的解析、语意检查、基于代价的查询优化到最终产生分布式的查询任务规划工作。
3.分布式任务调度引擎 QD
负责执行计划的分发与执行状态跟踪,同时也负责节点间的数据分发。
4.支持 SIMD 的极速执行引擎
负责将分布式调度引擎转发的逻辑计划转换成物理计划并完成资源配置,启动并控制整个查询计划的执行并将执行结果透过分布式调度引擎传回上层执行节点。
5.分布式可插拔存储引擎
提供支持 HDFS/S3/本地表存储等多种存储引擎及数据格式(行存、列存)数据的编码、压缩、存储与读写等机制。
6.分布式事务管理
提供全局的数据库读写 ACID 机制,支持分布式锁, 支持并发读写能力。
7.数据库元数据管理
提供数据对象管理与存储,支持基于 MVCC 的事务处理机制。
8.全局资源管理
提供支持多租户的基于多级资源队列的全局任务资源统一分配。
四、OushuDB 的部署架构:
OushuDB 的 Segment、Magma 和 Data Node 的部署基本一致,这样主要是为了保证本地读。虽然 OushuDB 支持外部的 HDFS,但是这样的话会走网络,影响性能。因此,推荐将他们部署在同一个机器上,这样的话,查询计划也会尽量选择读取本地数据,从而实现本地读。也支持外部的 HDFS,尤其当多个集训共享数据的时候,可以通过建立外部表直接访问数据。
五、OushuDB 的进程架构:
1.OushuDB 有不同的角色(Master 节点,Standby 节点、N 个 Segment 节点)。
2.进程:
2.1 PostMaster 进程:监听用户请求的守护进程,为每个客户端 fork 连接出单独的 postgres 服务,当 postgres 进程出错时尝试修复;当 Segment 节点的 postgres 挂掉时候会认为节点已经 down 掉了。
2.2 Logger 进程:负责收集各个进程的输出并将其写入 pg_log,这里包括成功 log 和出错的 log。
2.3 Stats collector 进程:统计收集数据的信息,会生成描述数据库、表等统计信息的。stat 文件。
2.4 Writer 进程:定期将共享内存的数据写到磁盘上的进程。
2.5 Master resource manager 进程:负责管理、分配、回收资源,定期查询、接收、处理 Segment 的心跳信息,从而获取整个集群可用的节点;
2.6 Segment resource manager 进程:查询本节点的状态,包括查询临时文件是否可读写,发送 Segment 的心跳信息。
2.7 DFS metadata cache 进程:(Master 节点上独有进程)由于 OushuDB 是存储和计算分离的,数据存储在 HDFS 或 magma 上,DFS metadata cache 读取并缓存 block location 信息,从而计算数据的存储,也就是存储数据的这些 block 是如何分布的,因此在生成查询计划时,可以确定去某些节点访问某些数据的速度,从而进一步保证本地读。
2.8 Checkpoint 进程:(Master 节点上独有进程)负责周期性做 checkpoint 或响应常规的 checkpoint 请求。
2.9 Sequence 进程:(Master 节点上独有进程)是产生序列,也我们通常说的自增长列。
2.10 Wal send server 进程:(保证 Master 的节点和 Standby 节点元数据信息进行同步的)负责把 writeahead log 发给 Standby Master。
2.11 Sync agent 进程:(保证 Master 的节点和 Standby 节点元数据信息进行同步的)负责和 Master 上 wal send server 通信的进程,处理 Master 和 standby 节点状态。
六、OushuDB 的计算引擎及其执行器、优化器:
1.数据库计算引擎:是数据库性能的源动力。
2.优化器:OushuDB 的高性能数据库引擎使用基于代价的优化器 CBO (CostBased Optimization)。
3.执行器:提升执行器性能的手段主要有两种技术路线:一种是向量计算(vectorized execution),另外一种是代码生成(code generation) 。OushuDB 使用了向量计算外加 SIMD 优化技术。
4.SIMD:SIMD(single instruction multi-data), 即单指令多数据流,以同步的方式在同一时间内执行同一条指令。相比单指令单数据流(SISD),单指令多数据流一次性获得所有操作数进而加快了运算,充分利用 CPU 性能,特别是数据密集型运算。
5.OushuDB 新执行器充分利用列式存储 ORC、Magma 存储格式。
6.新执行器全量支持 TPCH 和 TPCDS。TPCH 比 Greenplum 大约快 5-10 倍比 SparkSQL 3.0 以上的版本要快几十倍。
七、OushuDB 的查询执行过程:
OushuDB 集群支持三种 Motion,分别是 Redistribution、Broadcast、Gather。
1. Redistribution:用于对数据进行重新分布。
2. Broadcast:用在大表和小表进行join时。小表分发到所有的节点上,这样所有的节点就有小表的数据。
3. Gather Motion:用于Master节点最终收集汇总所有Segment节点数据。
八、OushuDB 的外部接口:
-
OushuDB 支持的客户端工具:
1.1 PSQL:PSQL 是 PostgreSQL 中的一个命令行交互式客户端工具。安装的 Oushu DB binary 里面会自动安装了 PSQL。
1.2 JDBC:JDBC 在 Oushu Software Tarball 里面涵盖了 JDBC jar 包,它也可以兼容 PG 官方 JDBC。
2.目前 OushuDB 没有提供单独的 ODBC,可以兼容 PG 官方 ODBC。
3.ODBC 和 JDBC 都可以通过编写程序的标准接口,一个是 Java 接口,一个是 ODBC 接口。官方已经列出来了所需要 API 支持,用户可以根据些 API 来写直接访问读取数据库里的数据。此还有 PGAdmin 的面客户端工具,是官方的 UI 的工具。
4.偶数自研的 Lava 平台可以让用户通过 UI 界面操作数据库。
九、Magma:
1.Magma 它是存储,它是分布式的,高可用的,支持事务的。尽管 OushuDB 的数据可以存储在 HDFS,但 HDFS 只支持以追加的方式写入,对表数据的更新和删除操作很不友好,因此我们开发了 Magma。
2.Magma 的主要功能:
2.1 作为存储,Magma 存储的数据是表数据,是结构化数据,不是简单的 KV。
2.2 Magma 支持对表数据做更新和删除操作。
2.3 它的高可用是通过 Raft 的协议数据复制来实现的。
2.4 它的事务特性是通过多版本来实现的。
2.5 它的高性能的是通过行列混合的存储格式来支持 OLAP 高性能查询。
2.6 它提供了数据索引功能,可以建立主键索引和非主键索引。
2.7 作为分布式的存储,它整合数据预处理技术,提供了便捷的集群扩展、集群容错以及负载均衡。
2.8 Magma 的功能,主要包括数据分布、数据清理、事务模型、索引、数据副本、负载均衡。
3.OushuDB 由 master 和多个 segment 组成,master 负责对 SQL 进行解析,优化生成查询计划。通过 Dispatcher 分发到每个 segment。每个 segment 执行计划的过程中就涉及到对数据的存储和读取。
4.Magma 通过直接操作本地文件系统,实现了支持表数据的更新和删除操作。作为分布式存储,Magma 在集群的每个节点上启动 Magma 的进程。整个集群中的多个 Magma 进程组成了 Magma 集群。
5.Magma 具体是怎么存储数据:是行列混合的存储模式。
6.Magma 在磁盘上的数据结构:以单个节点为例,每个节点有多个数据目录,每个数据目录下又有多个 RG 目录,每个 RG 目录分为 AP 数据目录、索引目录、raft 日志目录,数据目录下根据 Table 进行划分,每个 Table 目录下是 Range 目录,Range 下面是数据文件、统计数据、索引文件、删除数据。
十、HDFS:
1.Hadoop 分布式文件系统 HDFS 的设计目标是管理数以千计的服务器、数以万计的磁盘,将这么大规模的服务器计算资源当作一个单一的存储系统进行管理,对应用程序提供数以 PB 计的存储容量,让应用程序像使用普通文件系统一样存储大规模的文件数据。
2.HDFS 是在一个大规模分布式服务器集群上,对数据分片后进行并行读写及冗余存储。因为 HDFS 可以部署在一个比较大的服务器集群上,集群中所有服务器的磁盘都可供 HDFS 使用,所以整个 HDFS 的存储空间可以达到 PB 级容量。
3.HDFS 的关键组件有两个,一个是 DataNode,一个是 NameNode。
3.1 DataNode 负责文件数据的存储和读写操作。HDFS 将文件数据分割成若干数据块(Block),每个 DataNode 存储一部分数据块,这样文件就分布存储在整个 HDFS 服务器集群中。
3.2 NameNode 负责整个分布式文件系统的元数据(MetaData)管理,也就是文件路径名、数据块的ID 以及存储位置等信息,相当于操作系统中文件分配表(FAT)的角色。HDFS 为了保证数据的高可用,会将一个数据块复制为多份(缺省情况为 3 份),并将多份相同的数据块存储在不同的服务器上,甚至不同的机架上。这样当有磁盘损坏,或者某个 DataNode 服务器宕机,甚至某个交换机宕机,导致其存储的数据块不能访问的时候,客户端会查找其备份的数据块进行访问。
十一、对象存储:
1.对象存储,也称为“面向对象的存储”,英文是 Object-based Storage。
2.它综合了网络附加存储(NAS)和存储局域网(SAN)的优点,同时具有 SAN 的高速直接访问和 NAS 的分布式数据共享等优势,提供了具有高性能、高可靠性、跨平台以及安全的数据共享的存储体系结构。
3.对象存储允许将计算基础架构与存储需求分离。可以在对所有数据进行存储的同时⽆需监控存储,因此方便扩展并向云中的集群添加节点。
4.不能直接打开修改文件,只能先下载、修改,再上传文件,所以不支持 append 和 truncate 操作,操作接口比较简单,主要接口命令有 PUT/GET/DELETE 等。
5.OushuDB 支持的对象存储类型:Amazon Simple Storage Service (简称 S3)、腾讯云对象存储(Cloud Object Storage, COS)。
6.OushuDB 支持 S3 只读外部表以及可写外部表,数据存储格式支持 TEXT/CVS/ORC 三种,支持外表是希望可以操作用户放在 S3 上的数据,支持的功能如下:
6.1 DDL:CREATE/DROP/RENAME
6.2 DML:SELECT/INSERT/COPY(新旧执行器)
6.3 DCL:值持通过 GRANT/REVOKE 给用户授权是否可操作 S3 外表
7.外部表:允许 INSERT,不允许 SELECT、UPDATE、DELETE。目前只有 hdfs 协议和 hive 协议支持 TRUNCATE。
8.内表:因为用户可能会通过外部环境直接操作外部表数据,而 S3 内表数据的控制权完全在 OushuDB,所以相对而言使用 S3 内表会有更好的可控性。OushuDB 支持在对象存储上对对象的增删改查以及事务功能,目前 S3 内表支持功能如下:
8.1 只支持ORC的存储格式
8.2 支持事务(强一致性):强一致事务要求在任意时刻各节点数据在任意时刻都是一致的
8.3 支持Random(事务)/Hash表
8.4 DDL:CREATE/DROP/ALTER TABLE (RENMAE/DROP COLUMN/ADD COLUMN).../TRUNCATE
8.5 DML:SELECT/INSERT/COPY(新旧执行器)
8.6 datalocality元数据缓存
8.7 direct dispatch优化
8.8 UPDATE/DELETE
十二、创建数据库
1.CREATE DATABASE 命令创建数据库,DROP DATABASE 命令删除数据库。
2.查看现有数据库的集合,可以检查系统表 pg_database:SELECT datname FROM pg_database;在 psql 程序中通过\l 命令来列出现存的数据库。
3.第一个数据库总是由 initdb 命令在初始化数据存储区的时候创建的,这个数据库叫 postgres。因此要创建第一个用户数据库时你可以与 postgres 连接。
4.在 shell 中用 createdb 程序来创建新数据库:createdb dbname。
5.为其它人创建一个数据库,在 SQL 环境使用下列命令:CREATE DATABASE dbname OWNER rolename;或用命令行执行:createdb -O rolename dbname。
6.数据库是用 DROP DATABASE 命令删除的,格式为:DROP DATABASE name;只有数据库的所有者或者超级用户才可以删除数据库,删除数据库会删除数据库中包括的所有对象,且数据库的删除操作是不可恢复的。
7.在 shell 上可以通过 dropdb 删除数据库的:dropdb dbname。
十三、创建数据表
1.在关系型数据库中,表由行和列组成。
1.1 其中表的列的数目和顺序是固定的,每个列都有一个名字,并且有指定的数据类型,即限制着这个列可以存储的范围。常用的数据类型有:用于整数的integer类型、用于可能为分数的numeric类型、用于字符串的text类型、用于日期的date类型等。
1.2 与表的列不同,表的行数目是变化的,它反映了在某个时刻表中存储的数据量。行是没有顺序的,除非在查询时对其进行要求,另外,行也没有唯一的标识符。
2.使用 CREATE TABLE 命令创建一个表,需要为声明新表的名称、各列的名称及数据类型。
3.OushuDB 现在支持多种存储格式:ROW、ORC 和 Magma。ROW 是按行存储的格式,而 ORC、Magma 是按行列存储的格式。 其中 Magma 是在 4.0.0.0 发布的全新的存储格式。Magma 和 ORC 都支持 update/delete, 且 Magma 还支持 index。
4.MAGMA 格式的表不支持为列设置缺省值。
5.一个主键约束表示可以用作表中行的唯一标识符的一个列或者一组列,它的值必须是是唯一的并且非空。在 OushuDB 支持的表格式(ROW,ORC,MAGMA)中,只有 MAGMA 表支持主键约束,而且在创建 MAGMA 表时,可以声明主键列,且主键约束的列里数据类型为非定长时需要将该列放置最后一列。
6.MAGMA 格式的表,是不支持列约束和非空约束的,但支持主键约束。
十四、修改表
1.用 ALTER TABLE 命令执行修改表操作。(操作有:增加列、删除列、增加约束、删除约束、修改缺省值、修改列数据类型、重命名列、重命名表)
2.仅 ROW 表支持以上所有的操作类型,ORC 表仅支持增加约束、删除约束和重命名表,MAGMA 则完全不支持上述任何操作。
十五、表分区
1.OushuDB 支持基于 Range 和 List 的两种分区方式:
1.1 Range分区:表被一个或者多个关键列分区成”范围”,这些范围在不同的分区里没有重叠。 比如依据日期、价格数值范围进行分区。
1.2 List分区:依据一个值的列表进行分区,比如依据地区列表进行分区。
2.通过 pg_partitions 视图来查看你的分区表设计。
3.通过查询 pg_partition_templates 查看使用子分区模板创建的子分区信息。
4.查看分区表使用的分区键列通过查询 pg_partition_columns 获取
十六、数据操纵
最常见的数据操纵方式包括插入数据、更新数据和删除数据。目前 oushudb 兼容的表格式中,目前只有 ORC 和 MAGMA 格式的表支持更新和删除操作,AO 格式的表不支持。
十七、索引
OushuDB 目前只有 Magma 表支持索引,AO、ORC 表均不支持创建使用索引。
十八、视图
OushuDB 中的视图是只读的。系统不允许在视图上插入、更新或删除。通过将视图上的重写规则创建为其他表上的适当操作,可以获得可更新视图的效果。
十九、事物
1.可以通过 BEGIN TRANSACTION、COMMIT、ROLLBACK 命令来控制事务。
1.1 BEGIN TRANSACTION / BEGIN :开始一个事务。此类事务通常会持续执行下去,直到遇到下一个 COMMIT 或 ROLLBACK 命令。不过在数据库关闭或发生错误时,事务处理也会回滚。
1.2 COMMIT / END TRANSACTION :事务确认,用于把事务调用的更改保存到数据库中的事务命令。
1.3 ROLLBACK:事务回滚,用于撤消尚未保存到数据库的事务命令。
2.事务控制命令只与 INSERT、UPDATE 和 DELETE 一起使用。他们不能在创建表或删除表时使用,因为这些操作在数据库中是自动提交的。
二十、锁
1.数据库中有两种基本的锁:排它锁(Exclusive Locks)和共享锁(Share Locks)。
2.如果数据对象加上排它锁,则其他的事务不能对它读取和修改。
3.如果加上共享锁,则该数据库对象可以被其他事务读取,但不能修改。
二十一、集群监控
1.常用的状态监控一般包括如下几种:
1.1 命令行检测 oushudb state
1.2 SQL检测
SELECT * FROM gp_segment_configuration; 我们可以通过这条命令所查询的表来查看节点的状态
1.3 数据库连接数检查
select count(1) from pg_stat_activity ; 来查看当前正在活跃任务的情况
select count(1) from pg_stat_activity where current_query<>'' and procpid<>pg_backend_pid();
2.通过偶数云平台可视化监控,我们可以查询的信息包括
2.1 集群信息:在图中我们可以看到当前集群包括了Kafka、LittleBoyServer、Spark、Hawk以及HDFS等等。
2.2 其次,我们可以看到每个集群的详细信息。包括集群的节点数、创建者、状态,以及关联的集群等等。
2.3 然后,我们还可以看到集群的设备CPU状态、内存状态、磁盘IO状态、网络IO状态的监测情况。CPU、内存等状态,还可以查询使用TOP5的情况。
二十二、角色与权限
1.其实用户和角色都是角色,只是用户是具有登录权限的角色。
2.可以使用 GRANT 和 REVOKE 命令赋予用户角色,来控制权限。
3.数据库角色:要检查现有角色的集合,可以检查 pg_roles 系统表,使用 SQL 命令:SELECT rolname FROM pg_roles; psql 的元命令 du 也可以用于列出现有角色。
4.口令:只有在客户认证方法要求与数据库建立连接必须使用口令的时候,口令才比较重要。口令拥有 password, md5 和 crypt 等不同的认证方法。在创建角色的时候可以这样声明一个口令:CREATE ROLEname PASSWORD 'string'。
5.权限:使用 GRANT 命令赋予权限,使用 REVOKE 命令撤销权限。对象所有者总是隐含地拥有 DROP, GRANT, REVOKE 等特殊权限,并且不能赋予或者撤销。