作为企业级原生分布式数据库,OceanBase 自创立以来一直坚持原生分布式的发展路线,其高兼容、金融级容灾和高可用、透明扩展、稳定安全等能力已经在金融、政府、运营商、互联网等各个行业得到了充分验证以及认可。去年 6 月,OceanBase发布定位为 HTAP 企业级数据库的里程碑 3.1 版本,支持不限大小的超大事务,引入向量化引擎、并行 DML、复杂查询优化。3.2 版本在持续增强诊断监控能力、安全性、兼容性等企业级功能的基础上,进一步完善向量化引擎,以 1526 万 QphH@30000GB 的性能成绩,创造 TPC-H 分析型基准测试新的世界纪录,目前排名第二。
2022 年 4 月 18 日,OceanBase 3.2.3 正式发布,该版本是 3.x 的第一个 LTS(Long Term Support)版本,也是 HTAP 能力的里程碑版本。
功能亮点及用户价值
一、增强HTAP能力
全面实现向量化引擎,支持所有基础算子向量化,复杂查询场景下带来数量级的性能飞跃,配合持续增强的优化器改写优化能力及大规模分布式并行执行引擎,使得该版本成为打造完整 HTAP 能力的一个重要里程碑,TPC-H 性能相比 OceanBase 2.2.x 提升 10 倍。
二、性能大幅提升
优化 Nest Loop Join,性能提升 1 倍。支持多表关联 SQL 语句转化为 Nest Loop Join 执行计划,通过算子优化大幅提升多表关联性能。
提升 Table API 流式扫描性能,OceanBase 3.2.3 流式扫描性能达到 HBase 2.4.6 的 2.2 倍。
提升 CDC(OMS)数据传输性能,一个主键加一个非唯一键索引场景下全量迁移时间节省 33%。经场景实测,在完全不影响业务的情况下,全量迁移速度可达到 38 万 RPS(64GB 内存、128 个并发)。
三、完善企业级功能
Oracle 模式新增 DBLink 功能 ,支持用户通过 DBLink 访问 Oracle 的数据,满足用户 Oracle 迁移到 OceanBase 后跨实例访问远端数据库数据的需求。
MySQL 模式引入Oracle 模式的 Sequence 功能,相比 MySQL 的自增列,Sequence 功能支持用户通过更加灵活的方式生成唯一序列值,并设置序列值生成方式,例如支持重设序列起点,支持循环取值,支持指定缓存大小等。值得一提是,该版本兼容了 MySQL 8.0 的 CTE(Common Table Expression)和 CHECK 检查约束功能,支持用户通过 CTE 功能来模拟 Oracle 的 CONNECT BY 递归查询功能,提供 CHECK 约束功能便于用户对数据进行合法性校验。
四、加强诊断监控能力
存储过程支持 GET DIAGNOSTICS 诊断,可使用该功能获取 SQL 语句或者存储过程执行时的错误信息,帮助用户快速定位、排查解决问题。
OCP 引入 SQL 画像和事务画像功能,用户可通过 SQL 画像、事务画像获取 SQL 执行时的统计信息、每个算子的资源消耗,事务持有资源和等待情况以及分布式和并行执行情况,帮助用户更快更准的定位 SQL 执行慢、事务卡住等问题。
五、增强企业级安全性
新增备份恢复完整性校验功能,帮助用户快速发现磁盘静默故障,最大限度避免因备份数据损坏导致无法用于应急恢复的风险。
ODC 支持操作记录审计功能,自动记录所有的数据库变更操作,确保所有变更可审计、可回溯。
向量化引擎增强HTAP能力,复杂查询性能再升级
计划编译执行和向量化引擎,是近十几年数据库学术界提出的两种重要执行优化思路。前者在工业界以 SingleStore(原 MemSQL )为代表进行了初步探索。向量化引擎以 MonetDB/X100 系统最早实践,因 Vectorwise 的大规模使用带来出色的性能表现,让业内看到这项技术巨大的性能价值和技术前景。此后,包括 Oracle、SQL Server 分别通过 RowSets 等方式实现了向量化执行引擎能力。
OceanBase 3.2.3 版本全面实现了向量化引擎,重新设计执行引擎核心数据结构,以 Architecture-aware 的设计改造全部算子和最常用的执行表达式,充分发掘现代 CPU 的 Cache 特性以及优化指令,并应用于 TPC-H 的 benchmark 中。向量化带来了大量的算法优化可能,通过在向量化的框架下进行算法和数据结构优化。相比非向量化执行引擎,实测整体执行性能性能提升 5 倍,部分算子和单场景可实现 10 倍以上性能提升。
向量化引擎可以在复杂查询场景下实现数量级的性能飞跃,配合持续增强的优化器改写优化能力及大规模分布式并行执行引擎,使得 OceanBase 3.2.3 版本成为打造完整 HTAP 能力的一个重要里程碑,TPC-H 性能相比 OceanBase 2.2.x 提升 1 个数量级。
性能大幅优化,提升典型业务场景的处理能力
Nest Loop Join 性能优化
Nest Loop Join 是多表关联、索引回表等 SQL 语句背后的基础算子,OceanBase 3.2.3 针对单分区表和多分区表进行了深度优化,相比 3.1.x 版本,无论是并发 QPS 还是单查询耗时方面,提升均达到 1 倍左右。
场景一:50 并发测试 QPS,2 张表各 10 万行数据,查询 SQL 对 200 行数据进行关联。
场景二:单并发测试耗时(RT),右表有 16 个分区,每张表写入 100 万行数据,关联查询 20 万行数据。
提升Table API 流式扫描性能
在 Table API 顺序扫描 OceanBase 的典型场景下,当扫描的数据量比较大时,一次接口调用需要多次客户端和服务端的交互才能获取完整数据,这种扫描操作称为流式扫描。在整个交互过程中,服务端的事务以及迭代器状态等都需要持续保持。此前版本采用同步等待实现方式,工作线程记录了请求的上下文,服务端需要保持工作线程用于等待客户端发送下一个请求。在流式扫描并发量较大的情况下,可能会出现服务端还有处理能力,但是所有的工作线程都在等待,无法处理客户端请求的现象。
OceanBase 3.2.3 实现了异步化改造,将请求上下文与工作线程解耦。通过本次优化,流式扫描整体性能提升 2 倍以上,达到 HBase 2.4.6 的 2.2 倍左右。
以下为模拟流式扫描测试场景,每次扫描涉及 8 次客户端与服务端交互。经测试,OceanBase 的各版本以及 HBase 2.4.6 的最大吞吐对比如下:
提升CDC(OMS)数据传输性能
在实际的数据迁移工作中,用户经常要面对表数据量较大的场景,当建表语句中包含索引创建时,整表的全量迁移会因为实时维护索引造成效率低下,需要耗费很长的时间才能完成迁移。
为了解决此问题,OceanBase 3.2.3 通过 CDC(OMS)提供在全量数据加载完成后创建非唯一键索引的能力,借助 CDC 本身的调度能力,千万/亿级别的表整体迁移时间节省 33%(测试环境单表具有一个主键和一个非唯一键索引情况下)。值得一提的是,单表非唯一索引越多的情况下,性能提升越明显。经客户现场环境测试,OMS 在不影响业务的情况下全量迁移速度可以达到 38 万 RPS(64GB 内存、128 个并发),帮助用户轻松应对百 TB 级别的数据库的迁移任务。
面向B端客户完善企业级功能,打造更好用的数据库
Oracle 模式:支持数据库链接到 Oracle(DBLink)
在企业实际业务中,Oracle 迁移到 OceanBase 过程中用户通常会出现数据已经迁移到 OceanBase,但还有少部分数据留在 Oracle 数据库的情况,需要通过类似 DBlink 的方式跨实例访问远端数据库的数据。
为了更好地满足用户诉求,OceanBase 3.2.3 版本新增了 DBLink 功能,通过分布式数据库的跨数据源访问的能力,帮助用户以访问本地数据库的方式访问远端数据库,并且支持跨数据源的分布式事务能力。在 SQL 查询执行过程中采用动态链接 OCI 驱动以只读的方式链接到 Oracle 数据库,通过将 Oracle 数据库的访问操作内嵌到 OceanBase 的算子执行,大幅降低业务系统多数据源访问的设计复杂度。目前已支持 DBlink 到 Oracle 数据库的分布式读事务能力,分布式事务写能力将在后续版本持续迭代完善。
MySQL 模式:支持 Sequence 对象
作为 Oracle 业务系统里被高频使用的数据库对象,Sequence(序列)可以按照一定的规则自动生成唯一序列值,通过修改序列的属性,可以让这组值递增、递减、循环。
2018 年开始,OceanBase 提供 Oracle 模式下 Sequence 对象的支持。随着一些 DB2、Oracle 业务迁入 OceanBase MySQL 模式,OceanBase 3.2.3 在MySQL 语法模式下正式引入了 Sequence 支持。相对于自增列(auto_increment),用户可以对生成序列值的方式有更灵活的控制,如 Sequence 支持指定缓存大小、支持循环取值、支持重设起点等。
值得注意的是,Sequence 非常适用于对“递增”没有强需求,仅需要生成唯一值的场景。可以尝试在合理的前提下设置较大 Sequence 的缓存(例如 100 万),此时 Sequence 的取值将会在各个服务器实例的本地缓存完成以提供卓越性能。
MySQL 模式:兼容 8.0 的 CTE
Common Table Expressions(下文简称 CTE)是指在一条查询语句中可以定义一个临时结果集,或者可以理解为一个临时视图,该视图仅在这条查询中有效,可以被多次引用。一条查询中可以定义多个临时视图,后定义的视图可以引用先定义的视图。
CTE 功能常用于定义临时视图,这类视图一般存在以下几个特点:1) 不是通用视图,仅在这条查询中会被使用;2)有一定复杂性或在查询中被多次引用。除此之外,CTE 还常常被当成 CONNECT BY 嵌套查询的替代方案。CONNECT BY 是 Oracle 中一个常用功能,在 MySQL 中并不支持。一个简单的 CONNECT BY 示例如下:
EMPLOYEE 表中记录了一个公司的员工信息,MANAGER_ID 表示每个员工的管理者的 ID。这条 CONNECT BY 语句展示了 ID 等于 1 的员工的所有直接和间接下属,可以将 CONNECT BY 的结果理解为树状结构,满足 START WITH 条件的数据是树的根节点,CONNECT BY 子句定义了父子结点间的关系,这个例子中要求父结点的 ID 和子结点的 MANAGER_ID 相等。LEVEL 表示结点的深度,即处于树中的第几层。
和上述 CONNECT BY 语句等价的 CTE 语句如下:
MySQL 模式:兼容 8.0 的 CHECK 约束
数据库中CHECK 约束的作用是,通过一个布尔表达式限制表中某些列中可接受的值来保证表中数据的合法性。每次在表中插入或更新数据时,会对表中 CHECK 约束的布尔表达式进行计算,如果新行的值在该表达式中计算的结果为 FALSE,则违反 CHECK 约束,此时数据库会拒绝新行的数据变更操作。
MySQL 在 8.0.16 版本之前,允许使用创建 CHECK 约束的语句,但是语法解析时会忽略 CHECK 约束部分。从 8.0.16 版本开始支持了完整的功能。
OceanBase 在 3.2.3 版本之前 MySQL 模式下允许使用创建 CHECK 约束的语句,但和低版本 MySQL 类似仅被用来进行分区裁剪优化,不会让所创建的 CHECK 约束真正生效。从OceanBase 3.2.3 版本开始,支持完整的CHECK功能,用户可以在 CREATE/ALTER/DROP TABLE 语句中创建、修改、销毁 CHECK 约束。
增强诊断监控能力,让运维更简单
支持GET DIAGNOSTICS诊断
在使用 SQL 或者 PL 的过程中遇到错误时,用户需要快速诊断具体发生了什么错误,以方便定位、排查和解决问题。OceanBase MySQL 模式实现了 Get Diagnostics 的功能,该功能用于获取错误信息,与诊断区域中的内容相关。Get Diagnostics 主要用于展示 SQL 命令执行之后产生的一些错误信息和其他的反馈信息。
SQL画像和事务画像
大型企业系统的 SQL 往往比较复杂,变化频繁,且可能因为运行中的数据变化或者数据库版本升级等因素变坏。因此,把专业的 SQL 诊断能力变成产品,对于 IO 密集的大型数据库系统尤为重要。OceanBase 通过 OCP 的 SQL 诊断模块,从诊断-优化建议-调优应急角度,全面的监控分析线上的运行 SQL。首先,通过可疑 SQL,TOPSQL,SLOWSQL 和并行 SQL 模块发现有问题的或者需要优化的 SQL。其次,通过 SQL turning advisor 工具提出优化建议,包括索引绑定推荐、最优索引创建推荐、历史执行计划推荐、SQL 限流推荐、租户 CPU 扩容推荐等;最后,执行调优应急操作,例如绑定推荐索引、快速关闭存在问题的会话,对访问的 SQL 进行限流等。
OceanBase 3.2.3 版本通过 OCP 引入 SQL 画像和事务诊断功能。其中,SQL 画像展示的信息包括:SQL 执行统计信息、资源消耗、算子/步骤的运行耗时、分布式查询、并行查询涉及多节点的运行情况等待相关信息。除 SQL 画像展示 SQL 基本信息之外,OCP 还提供事务画像展示 SQL 所在事务持有的资源和时间,以及该事务阻塞的其他事务状态(包含分布式事务)。用户可以通过 SQL 画像和事务画像分析 SQL 事务耗时或者耗资源的具体原因,从而快速定位 SQL 执行慢、事务卡住等问题的根因。
新增备份校验和变更操作审计,提升数据库的安全性
备份文件完整性校验
数据备份和日志备份是提升用户数据安全的重要辅助手段,当备份介质出现磁盘静默错误等故障时,通常会导致备份数据损坏无法用于后续的应急恢复。
新版本支持备份恢复完整性校验功能,利用数据备份和日志归档文件中记录的校验和(checksum)来提前发现数据损坏的情况。该功能实现的难点在于需要充分利用 OceanBase 的分布式计算能力,将备份校验任务分发到所有 OBServer 工作节点。通过其内置的分布式调度能力,以分区组为粒度将校验任务批量发送给 OBServer,帮助用户快速发现磁盘静默错误。用户可以通过 CDB_OB_BACKUP_VALIDATION_JOB_HISTORY 来查看本次数据校验的结果,如果出现磁盘静默错误,将会在 RESULT 字段上观察到相应的错误码。
变更操作审计
ODC 公共连接只读权限用户被禁止执行数据库操作(DDL/DML),为保障数据库变更过程的安全,管理员可在 ODC 公共资源管控台任务流程内配置审批流,如定义风险等级数、选择任务子类、指定变更的 SQL 数量范围和设置审批节点等。管理员配置审批流后,被分配相关只读权限的用户可在任务中心创建模拟数据/导入/导出/数据库变更等任务,并在创建任务后根据所创建的任务类型来匹配对应的审批流程进行审批。OceanBase 3.2.3 版本引入变更操作审计功能,自动记录所有的数据库变更操作,真正做到所有变更可审计、可回溯。
OceanBase 3.2.3 作为 3.x 的 LTS 版本,是完整 HTAP 能力的一个重要里程碑。该版本全面实现了向量化引擎,进一步提升性能,完善诊断监控、安全性、兼容性等企业级功能。在版本研发过程中,OceanBase 借鉴了部分来自 Oracle 数据库的优秀设计理念,结合 OceanBase 开源社区的用户反馈,在此向经典数据库的探索者和社区用户致以崇高的敬意。