2021年6月1日,OceanBase首次宣布开源。在过去的一年里,oceanbase社区版在社区和用户的推动下发展迅速,核心能力有了很大的突破。从最初300万行代码全部开源的核心内核引擎,到第一批开源用户的真实场景和业务需求,我们与社区开发者一起打磨和提升内核和生态工具能力。越来越多的用户在他们的核心业务场景中使用oceanbase社区版在过去的一年里,oceanbase社区版得到了众多开发者的认可和用户的喜爱。
2022年11月3日oceanbase社区版4.0(代号:小宇)测试版正式发布,这是社区版全新的里程碑。作为业界首款兼容MySQL 8.0的单机分布式集成数据库,oceanbase社区版 4.0全面开放MySQL兼容性,全面兼容MySQL 8.0协议,大幅提升在线DDL能力,支持超大事务、主键变更、主键增删等。对于多租户的核心能力,首次将IO纳入隔离体系,将集群级粒度的备份能力分为租户级粒度,至少可以支持租户级的备份和恢复。
测试表明oceanbase社区版 4.0,在相同的硬件环境下,OLTP(在线事务处理)的性能是MySQL的1.9倍,OLAP(在线分析处理)的性能是Greenplum 6.22.1的5到6倍,不仅可以稳定可靠地处理OLTP核心业务场景,还可以快速处理OLAP实时分析场景。具有单机分布式集成的能力,最初只需单机即可支持业务的部署,具备从单机到多机的横向扩展和收缩能力。
核心竞争力和用户价值
oceanbase社区版 4.0在保证功能特性不丢失的前提下,重新审视了数据库和分布式系统两个领域最基础的设计,推出了业界首个单机分布式集成架构。同时,该版本还从架构上解决了3.x版本的设计瓶颈,支持用户关注的多项核心能力,在内核功能、兼容性、稳定性、性能等方面都有所突破。
单机集成架构:自适应日志流、支持超大事务、将RTO时间降低到8s以下、优化NTP服务依赖、支持分区容量上限等。
内核能力增强:在线DDL能力增强,支持租户级备份、字符集扩展、数据编码、IOPS隔离、LOB规范上限扩展、表锁定和死锁检测等。
兼容性增强:支持DDL语句的外键约束、视图列信息的显示、DML触发器、更多的SQL模式和函数等。支持扩展序列对象、存储程序、SQL文本中的预处理、以及作为分区键的自加列。
性能大幅提升:SYSBENCH的性能得到优化,综合读写性能(Read Write)1024并发测试性能比3.1版本提升一倍。TPC-H查询性能优化,100GB的数据执行22条SQL,整体性能比3.1版本提高了5倍。
运维能力的提升:支持全链路跟踪、会话状态监控与诊断(ASH)、标准化视图优化、模式历史恢复功能、回收站自动清空等。
分布式集成架构的升级
自适应日志流
在早期版本的OceanBase架构中,分区是作为操作的基本单位。当系统中的分区数量达到一定程度后,基于分区的操作的消耗也随之增加,逐渐形成了OceanBase的痛点:单个节点支持的分区数量有限,涉及单个节点上跨分区的数据修改也需要两阶段提交协议来保证事务的原子性。
Log是由OceanBase自动创建和管理的实体,它代表一个数据集合,包括几个分区和有序的重做日志流。在新的系统架构下,一个单元中所有分区的事务修改日志可以记录在一个日志流中,并且这些修改可以通过日志流同步到其他分区中的相应单元。OceanBase的每个租户都有一个单元,会有相应的日志流。系统会固定一个日志流与其对应分区之间的关系,对应关系只有在迁移发生时才会改变。
支持超大型交易
基于新的自适应日志流架构,重新设计了事务引擎,解决了分布式数据库中大型事务场景的常见痛点,如大型事务、大量参与者、事务提交卡等。新的事务引擎可以稳定地处理各种业务场景,如在线业务、批处理、数据修改等。,以便用户可以在各种业务场景中放心地使用数据库。
RTO < 8s
基于全新的自动主机选择协议和全面的活跃度检测机制,机器故障场景下的系统恢复时间进一步降低至8s以下,帮助业务系统更快恢复,最大限度降低业务影响,带来业务连续可用。
NTP服务优化
基于新的自动主选择协议,取消了对NTP时钟的依赖,打破了早期版本要求所有节点时钟偏差控制在100ms以内的强烈需求。OceanBase版本允许的时钟偏差可以达到2s,支持时钟的动态修改,不会影响数据的正确性和集群的稳定运行。
优化分区容量上限
在自适应日志流的架构设计下,系统内一个单元内的所有分区共享一个资源组,大大减少了早期版本中每个分区为节省系统资源而独立申请,提高了系统资源的利用率。因此,不再需要根据配置限制观察者节点的分区数量,但分区上限仍受机器可用物理资源的限制。
内核能力增强
在线DDL功能增强
在早期版本的OceanBase中,由于架构设计的限制,对数据库的在线DDL能力给予了有限的支持,比如不支持主键修改操作,给业务使用带来了诸多不便。由于新版本的集成架构设计,OceanBase为涉及数据迁移的在线DDL操作提供了增强的支持,主要包括:
支持添加、修改和删除主键。 支持添加和删除外键。 支持对列名和列类型的修改,包括字符、值、日期等类型的转换。 支持将普通表转换为分区表。 支持在线修改表或列的字符顺序。 支持租户级备份 多租户是OceanBase的核心价值能力之一。在大多数客户系统中,用户选择在同一个集群中创建多个租户,每个租户代表一个业务单元。根据不同类型的业务及其对客户的重要性,细粒度支持需要不同的备份频率和策略。在oceanbase社区版 4.0中,集群级粒度的备份功能被拆分为租户级粒度,支持按租户级备份和将备份数据恢复到新租户。优化数据备份的快照保留策略,减少备份过程中磁盘空间的影响。同时将数据备份和日志备份的存储目录拆分,可以分别访问不同性能的备份介质。
对量化引擎开源,AP能力全面增强。
OceanBase在企业版3.2.3中全面实现了向量化引擎,以架构感知的设计改造了所有运算符和最常用的执行表达式,充分挖掘了现代CPU的缓存特性和优化指令,并应用到TPC-H的基准测试中,向量化为算法优化带来了大量的可能性。通过在向量化的框架下优化算法和数据结构,测得的整体执行性能一般比原来的非向量化执行引擎高4-5倍,很多操作符和单个场景可以实现10倍以上的性能提升。在这个版本中,OceanBase开源了其所有的矢量化引擎功能,帮助用户在OLAP场景中获得更好的性能。
数据编码开源,数据压缩率进一步提高。
OceanBase通过数据编码压缩技术实现数据的高压缩比,是帮助用户降低存储成本的重要技术手段。OceanBase这次开放了多种数据编码方式,包括字典编码、RLE编码、常数编码、差值编码、前缀编码、列间编码等。,并支持为每列自动选择最合适的数据编码。通过编码和压缩,使用相同的块大小(16KB)和相同的压缩算法(lz4),在OceanBase中存储相同的数据,比MySQL 5.7平均节省一半的空间,查询性能没有任何损失。
隔离功能升级到支持IOPS隔离。
OceanBase的早期版本已经支持租户级的CPU和内存隔离,4.0版已经开始支持租户间的IOPS隔离。租户无法感知彼此对磁盘带宽的占用,从而避免了租户之间的IO资源竞争,实现了完全的租户资源隔离能力。
用户单元配置设置单元的资源规格,其中最小_IOPS、最大_IOPS和IOPS _权重是IOPS隔离相关资源,租户的可用资源被绑定到单元。通知支持动态调整租户的IOPS规格,对单元配置中IOPS相关设置的修改可以实时生效。在租户中,支持分配各种IO请求(业务请求、系统日志等)的百分比。)通过配置项io_category_config,从而精细控制io资源分配和调度。
LOB规格上限扩展
在早期版本的OceanBase中,LOB数据存储大小被限制在48MB,这给客户使用LOB带来了很强的约束。在此次架构升级中,存储层将LOB宏块的数据拆分成多个Lob元块进行存储,然后将多个Lob元块中的数据聚合成一个连续的缓冲区返回到SQL层进行处理,从而突破了数据存储大小的限制,使得Lob存储上限扩展到512MB,未来还将不断优化到TB级别。
支持表锁和死锁检测
表锁允许业务以指定的方式锁定表或分区,以避免并发业务操作导致的数据损坏。OceanBase版支持在线DDL操作,所以必须配合表锁来保护DDL和DML并发的正确性。支持新的锁表语法,支持两种锁模式,即共享和独占,还支持锁冲突的死锁检测。
扩展字符集
支持UTF8、UTF16、GBK、GB18030和二进制字符集,新增UTF8MB4_BIN、UTF16_BIN、GBK_BIN、GB18030_BIN、UTF8MB4_GENERAL_CI、UTF16_GENERAL_CI、GBK_CHINESE_CI和gb18030 _ Chinese _等字符集。
MySQL兼容性增强
支持DDL语句的外键约束
默认情况下,OceanBase数据库打开外键约束检查。外键约束检查的切换由租户变量FOREIGN_KEY_CHECKS控制,需要约束的列的值取自另一个表的主键列。在早期版本中,外键约束检查仅对DML操作有效,DDL操作不受影响。OceanBase版支持FOREIGN_KEY_CHECKS系统变量对DDL的影响,其行为保持与MySQL兼容。
支持视图列信息显示
在MySQL数据库中,视图列信息和表列信息一样,是存储在数据字典中的基本元信息,通过INFORMATION_SCHEMA展现给用户。COLUMNS只有表列信息持久存储在OceanBase数据库中。4.0版通过动态分析视图定义,避免了视图复杂的依赖关系分析,实现了视图列信息在INFORMATION_SCHEMA中的显示。列
SQL模式扩展支持
扩展MySQL默认打开的SQL模式,新增NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER三种SQL模式。产品行为与MySQL兼容。NO_ENGINE_SUBSTITUTION仅支持语法兼容性。
支持SQL文本中的预处理
它支持SQL文本中的预处理语句。预处理语句接口使用二进制协议,比interactive SQL接口具有更高的执行效率。使用方法一般如下:
准备执行语句。从“选择SQRT(POW(?,2) + POW(?,2))';
EXECUTE执行预处理语句。SET @ a = 3;SET @ b = 4;使用@a,@ b;执行stmt1;
DEALLOCATE PREPARE释放一条预处理语句。解除分配准备stmt1
支持将自行添加的列作为分区键。
当使用自添加的列作为分区键时,应该格外注意。自添加列的值是全局唯一的,但不能保证总是在分区内增长,这与原生MySQL的行为不同。与其他分区方法相比,插入这种分区表的性能会有一定程度的下降。
支持序列对象
支持序列对象,满足业务系统对序列对象的依赖需求,降低客户在业务迁移过程中的适应复杂度。支持CREATE/ALTER/DROP SEQUENCE对象,支持获取CURRVAL、NEXTVAL和重置值的操作。支持的对象值范围从INT64_MIN到INT64_MAX。
支持存储程序
与MySQL 5.7语法兼容的存储程序(包括存储过程和存储函数),支持游标、流控制语句、异常处理、与存储程序相关的DDL操作以及视图和状态查询。同时扩展支持多个系统包,如DBMS_STATS、DBMS_SESSION等。
支持DML触发器
在表上创建触发器,与MySQL 5.6语法兼容。当表上的DML操作满足条件时,将触发用户定义的行为。