企业级增强特性
数据分区
数据分区是数据库产品普遍具备的功能。在openGauss中,数据分区是对数据按照用户指定的策略对数据做的水平分表,将表按照指定范围划分为多个数据互不重叠的部分(Partition)。
openGauss支持:
- 范围分区(Range Partitioning)功能,即根据表的一列或者多列,将要插入表的记录分为若干个范围(这些范围在不同的分区里没有重叠),然后为每个范围创建一个分区,用来存储相应的数据。
- 列表分区(List Partitioning)功能,即根据表的一列,将要插入表的记录中出现的键值分为若干个列表(这些列表在不同的分区里没有重叠),然后为每个列表创建一个分区,用来存储相应的数据。
- 哈希分区(Hash Partitioning)功能,即根据表的一列,通过内部哈希算法将要插入表的记录划分到对应的分区中。用户在CREATE TABLE时增加PARTITION参数,即表示针对此表应用数据分区功能。
例如,表1描述了一个xDR(详单)场景下,基于时间分片的方式分区后带来的收益。
表 1 分区收益
数据分区带来的好处在于:
**改善可管理性:**利用分区,可以将表和索引划分为一些更小、更易管理的单元。这样,数据库管理员在进行数据管理时就能采取“分而治之”的方法。 有了分区,维护操作可以专门针对表的特定部分执行。
**可提升删除操作的性能:**删除数据时可以删除整个分区,与分别删除每行相比,这种操作非常高效和快速。
删除分区表与删除普通表的语法一致,都是通过DROP TABLE语法进行删除。
**改善查询性能:**通过限制要检查或操作的数据数量,分区可带来许多性能优势。
分区剪枝:分区剪枝(也称为分区消除)是openGauss在执行时过滤掉不需要扫描的分区,只对相关的分区进行扫描的技术。分区剪枝通常可以将查询性能提高若干数量级。
**智能化分区联接:**通过使用一种称为智能化分区联接的技术,分区还可以改善多表联接的性能。当将两个表联接在一起,并且至少其中一个表使用联接键进行分区时,可以应用智能化分区联接。智能化分区联接将一个大型联接分为多个较小的联接,这些较小的联接包含与联接的表“相同”的数据集。这里,“相同”定义为恰好包含联接的两端中相同的分区键值集,因此可以确保只有这些“相同”数据集的联接才会有效,而不必考虑其他数据集,目前不支持列表分区和哈希分区。
向量化执行和行列混合引擎
在大宽表,数据量比较大、查询经常关注某些列的场景中,行存储引擎查询性能比较差。例如气象局的场景,单表有200~800个列,查询经常访问10个列,在类似这样的场景下,向量化执行技术和列存储引擎可以极大的提升性能和减少存储空间。
向量化执行
标准的迭代器模型如图1所示。控制流向下(下图实线)、数据流向上(下图虚线)、上层驱动下层(上层节点调用下层节点要数据)、一次一元组(下层节点每次只返回一条元组给上层节点)。
而向量化执行相对于传统的执行模式改变是对于一次一元组的模型修改为一次一批元组,配合列存特性,可以带来巨大的性能提升。
图 1 向量化执行引擎
行列混合存储引擎
openGauss支持行存储和列存储两种存储模型,用户可以根据应用场景,建表的时候选择行存储还是列存储表。
一般情况下,OLAP类业务场景(范围统计类查询和批量导入操作频繁,更新、删除、点查和点插操作不频繁,表的字段比较多,即大宽表,查询中涉及到的列不是很多)下,适合列存储,OLTP类业务场景(点查、点插、删除、更新频繁,范围统计类查询和批量导入操作不频繁,表的字段个数比较少,查询大部分字段)下,适合行存储。
如图2所示,行列混合存储引擎可以同时为用户提供更优的数据压缩比(列存)、更好的索引性能(列存)、更好的点更新和点查询(行存)性能。
图 2 行列混存引擎
当前列存储引擎有以下约束:
DDL仅支持CREATE/DROP/TRUNCATE TABLE的功能。
兼容分区的DDL管理功能(如:ADD/DROP/MERGE PARTITION,EXCHANGE功能)。
支持CREATE TABLE LIKE语法。
支持ALTER TABLE的部分语法。
其他功能都不支持。
DML支持UPDATE/COPY/BULKLOAD/DELETE。
不支持触发器,不支持主外键。
支持Psort index、B-tree index和GIN index,具体约束参见《SQL参考》中“ SQL语法 > CREATE INDEX”章节。
列存下的数据压缩
对于非活跃的早期数据可以通过压缩来减少空间占用,降低采购和运维成本。
openGauss列存储压缩支持Delta Value Encoding、Dictionary、RLE 、LZ4、ZLIB等压缩算法,且能够根据数据特征自适应的选择压缩算法,平均压缩比7:1。压缩数据可直接访问,对业务透明,极大缩短历史数据访问的准备时间。
融合存储引擎
融合引擎架构支持了可插拔存储引擎的架构,新增了In-place update存储引擎,索引多版本为索引增加了事务信息,Xlog无锁刷新极大提升了Xlog写入效率,并行Page回放提升了备机回放效率,企业级特性闪回为用户提供了一个稳定的查询状态。
In-place update存储引擎
新增的In-place update存储引擎很好的解决了Append update存储引擎空间膨胀和元组较大的问题,高效回滚段的设计是In-place update存储引擎的基础。
索引多版本
图 3 UBTree与BTree查找、更新比较示意图
通过在索引页面元组上维护版本信息,UBtree能够在索引层进行 MVCC 可见性检查。同时 UBtree 也能通过版本信息独立判断索引元组是否已经无效(Dead),进而使得 in-place update引擎能实现数据表以及索引表上页级的空间清理,并在此基础上构建不依赖 AutoVacuum 的独立垃圾回收机制。
Xlog无锁刷新
图 4 Xlog lock less Design
本特性对WalInsertLock进行优化,利用LSN(Log Sequence Number)及LRC(Log Record Count)记录了每个backend的拷贝进度,取消WalInsertLock机制。在backend将日志拷贝至WalBuffer时,不用对WalInsertLock进行争抢,可直接进行日志拷贝操作。并利用专用的WalWriter写日志线程,不需要backend线程自身来保证XLog的Flush。通过以上优化,取消WalInsertLock争抢及WalWriter专用磁盘写入线程,在保持原有XLog功能不变的基础上,可进一步提升系统性能。
并行Page回放
本特性针对Ustore Inplace update WAL log写入,Ustore DML operation并行回放分发进行优化。通过利用Prefix和suffix来减少update WAL log的写入。通过把回放线程分多个类型来解决Ustore DML WAL大多都是多页面回放问题。同时把Ustore的数据页面回放按照blkno去分发,提高并行回放的并行程度。
企业级特性闪回
闪回是数据库恢复技术的一环,能够使得DBA有选择性的高效撤销一个已提交事务的影响,将数据从人为的不正确的操作中进行恢复。在采用闪回技术之前,只能通过备份恢复、PITR等手段找回已提交的数据库修改,恢复时长需要数分钟甚至数小时。采用闪回技术后,恢复已提交的数据库修改前的数据,只需要秒级,而且恢复时间和数据库大小无关。
本特性支持四种闪回实现:
- 闪回查询:可以查询过去某个时间点表的某个snapshot数据,这一特性可用于查看和逻辑重建意外删除或更改的受损数据。闪回查询基于MVCC多版本机制,通过检索查询旧版本,获取指定老版本数据。
- 闪回表:可以将表恢复至特定时间点,当逻辑损坏仅限于一个或一组表,而不是整个数据库时,此特性可以快速恢复表的数据。闪回表基于MVCC多版本机制,通过删除指定时间点和该时间点之后的增量数据,并找回指定时间点和当前时间点删除的数据,实现表级数据还原。
- 闪回drop:可以恢复意外删除的表,从回收站(recycle bin)中恢复被删除的表及其附属结构如索引、表约束等。闪回drop是基于回收站机制,通过还原回收站中记录的表的物理文件,实现已drop表的恢复。
- 闪回truncate:可以恢复误操作或意外被进行truncate的表,从回收站中恢复被truncate的表及索引的物理数据。闪回truncate基于回收站机制,通过还原回收站中记录的表的物理文件,实现已truncate表的恢复。
高可靠事务处理
openGauss提供事务管理功能,保证事务的ACID特性。
为了在主节点出现故障时尽可能地不中断服务,openGauss提供了主备双机高可靠机制。通过保护关键用户程序对外不间断提供服务,把因为硬件、软件和人为造成的故障对业务的影响程度降到最低,以保证业务的持续性。
故障恢复
支持节点故障可恢复及恢复后满足ACID特性。节点故障、停止后重启等情况下,openGauss能够保证故障之前的数据无丢失,满足ACID特性。
事务管理
- 支持事务块,用户可以通过start transaction命令显式启动一个事务块。
- 支持单语句事务,用户不显式启动事务,则单条语句就是一个事务。
高并发&高性能
openGauss通过服务器端的线程池,可以支持1W并发连接。通过NUMA化内核数据结构,支持线程亲核性处理,可以支持百万级tpmC。通过页面的高效冷热淘汰,支持T级别大内存缓冲区管理。通过CSN快照,去除快照瓶颈,实现多版本访问,读写互不阻塞。通过增量检查点,避免全页写导致的性能波动,实现业务性能平稳运行。
SQL自诊断
通过执行查询对应的explain performance,获得对应执行计划,是一种十分有效的定位查询性能问题的方法。但是这种方法需要修改业务逻辑,同时输出的日志量大,问题定位的效率依赖于人员的经验。SQL自诊断为用户提供了另一种更为高效易用的性能问题定位方法。
在执行作业之前,配置GUC参数resource_track_level和resource_track_cost,然后运行用户作业,就可以通过查看相关系统视图,获得执行完成的相关查询作业可能存在的性能问题。系统视图中会给出导致性能问题的可能原因,根据这些“性能告警”,参考《性能调优指南》中“ SQL调优指南 > 典型SQL调优点 > SQL自诊断”章节,就可以对存在性能问题的作业进行调优。
SQL自诊断可以在不影响用户作业,不修改业务逻辑的情况下,诊断出相对准确的性能问题,为用户提供更为易用的性能调优参考。
支持多存储引擎
openGauss基于统一的事务机制,统一的日志系统,统一的并发控制系统,统一的元信息,统一缓存管理提供Table Access Method接口,支持不同的存储引擎。
目前支持Astore和Ustore存储引擎。
主备双机
主备双机支持同步和异步复制,应用可以根据业务场景选择合适的部署方式。同步复制保证数据的高可靠,一般需要一主两备部署,同时对性能有一定影响。异步复制一主一备部署即可,对性能影响小,但异常时可能存在数据丢失。openGauss支持页面损坏的自动修复,在主机页面发生损坏时,能够自动从备机修复损坏页面。openGauss支持备机并行日志恢复,尽量降低主机故障时业务不可用的时间。
同时,如果按照主备模式部署,并打开备机可读功能后,备机将能够提供读操作,但不支持写操作(如建表、插入数据、删除数据等),从而缓解主机上的压力。
说明: 目前轻量版场景下,openGauss不支持一主两备部署。
逻辑日志复制
在逻辑复制中把主库称为源端库,备库称为目标端数据库,源端数据库根据预先指定好的逻辑解析规则对WAL文件进行解析,把DML操作解析成一定的逻辑变化信息(标准SQL语句),源端数据库把标准SQL语句发给目标端数据库,目标端数据库收到后进行应用,从而实现数据同步。逻辑复制只有DML操作。逻辑复制可以实现跨版本复制,异构数据库复制,双写数据库复制,表级别复制。
支持WDR自动性能分析报告
定时主动分析run日志和WDR报告(自动后台生成,可由关键指标阈值如CPU占用率、内存占用率、长SQL比例等触发),并生成html、pdf等格式的报告。能自动生成性能报告。WDR(Workload Diagnosis Report)基于两次不同时间点系统的性能快照数据, 生成这两个时间点之间的性能表现报表,用于诊断数据库内核的性能故障。
WDR主要有两个组件:
- SNAPSHOT性能快照:性能快照可以配置成按一定时间间隔从内核采集一定量的性能数据,持久化在用户表空间。任何一个SNAPSHOT可以作为一个性能基线,其他SNAPSHOT与之比较的结果,可以分析出与基线的性能表现。
- WDR Reporter:报表生成工具基于两个SNAPSHOT,分析系统总体性能表现,并能计算出更多项具体的性能指标在这两个时间段之间的变化量,生成SUMMARY 和DETAIL两个不同级别的性能数据。
增量备份/恢复(beta)
支持对数据库进行全量备份和增量备份,支持对备份数据进行管理,查看备份状态。支持增量备份的合并,过期备份的删除。数据库服务器动态跟踪页面更改,每当一个关系页被更新时,这个页就会被标记为需要备份。增量备份功能需要打开GUC参数 enable_cbm_tracking,以便允许服务器跟踪修改页。
恢复到指定时间点(PITR)
时间点恢复(Point In Time Recovery)基本原理是通过基础热备 + WAL预写日志 + WAL归档日志进行备份恢复。重放WAL记录的时候可以在任意点停止重放,这样就有一个在任意时间的数据库一致的快照。即可以把数据库恢复到自开始备份以来的任意时刻的状态。在恢复时可以指定恢复的停止点位置为TID,时间和LSN。
生成列
生成列是指由表中其他字段计算得到的列。生成列是一个SQL标准特性,SQL 生成列在插入或者更新数据时自动计算,像普通列一样需要占用存储空间。
hash索引
openGauss支持HASH索引,长索引列等值查询场景下性能优于BTREE;优化锁管理提供更高的并发度;提供XLOG日志防护,保障数据不丢失。
支持国密算法
用户认证方式(gsql、JDBC、ODBC)支持国密SM3算法;提供国密SM4算法接口,用于对数据进行加解密,增强数据库的安全能力。
插件化架构
通过对SQL引擎中语法、语义的解耦,实现openGauss的语法、语义层插件化,实现异构数据库语法模块与openGauss内核的解耦;支持算子插件化,实现特定算子从计划创建、优化到执行的插件化。
其他
on duplicate key update支持子查询
支持在on duplicate key update的更新语句之中使用子查询表达式进行赋值,且子查询表达式中支持通过excluded进行冲突行的引用。
列存表支持唯一索引
支持在列存表上创建基于cbtree的唯一索引、创建主键唯一键约束,防止表中出现重复数据,扩展了列存表使用场景。
支持jsonb数据类型
支持jsonb数据类型用来高效的操作JSON数据,支持对于json、jsonb的各种丰富的操作符、操作函数,支持在jsonb上创建索引,满足广泛的JSON使用与搜索场景。
UCE故障感知与响应
通过感知内存UCE错误产生时系统发出的SIGBUS信号,并根据所携带的物理地址,实现对应日志打印与openGauss数据库状态变化,进入对应的数据库进程退出流程。
支持unique sql语句监控自动淘汰
openGauss支持unique SQL自动淘汰,使用LRU算法依据uniqueSQL的更新时间自动淘汰旧的uniqueSQL信息,保障最新的统计信息能够持续记录,提高数据库的易运维性。
支持gs_cgroup负载管理
gs_cgroup 负载管理工具,通过在数据库内核创建与管理控制组,设置系统资源配额和资源限额,来管理用户与业务对资源的使用率与优先级,充分高效的利用机器资源。