2.0 解析系列 | OceanBase 2.0 的 Oracle 兼容模式

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: OB君:本文是 “OceanBase 2.0 技术解析系列” 的第九篇文章,今天我们来说说2.0版本最不得不提的——Oracle兼容模式。本文整理自10月27日OceanBase TechTalk北京站活动中酒满的演讲《OceanBase2.0的Oracle兼容模式》。

OB君:本文是 “OceanBase 2.0 技术解析系列” 的第九篇文章,今天我们来说说2.0版本最不得不提的——Oracle兼容模式。本文整理自10月27日OceanBase TechTalk北京站活动中酒满的演讲《OceanBase2.0的Oracle兼容模式》。更多精彩欢迎关注OceanBase公众号持续订阅本系列内容!
Tips:你可以关注"OceanBase"公众号,回复“1027”一键下载PPT

2_3_1

相信很多人对我们的了解是从OceanBase作为蚂蚁金服核心系统的数据库开始的,也逐步了解到OceanBase的高可用、高性能等诸多特性。今天我们想通过传统数据库的视角来给大家分享OceanBase的另外一个特性——Oracle兼容性,希望大家能够换一个角度了解OceanBase为用户提供的能力。

Oracle兼容模式

今天,真正对数据库要求比较高的一些行业,像银行、基金、保险等企业其实到现在为止还没有完全摆脱对Oracle的依赖。阿里去IOE比较成功,但我们其实也是经历一个很长的过程才摆脱了对Oracle的依赖。

一则有趣的新闻

让我们从一则新闻开始我们今天的分享。这则新闻相信很多朋友前段时间已经注意到了,就是亚马逊由于使用其自主研发的Aurora PostgreSQL数据库来替换其内部的Oracle系统,造成了Prime Day促销日的一个故障。具体的故障分析据说有25页之多,但是并没有对外公开。

2_3_2

这里我们为大家截取了两句有意思的话:

第一句话来自于亚马逊工程师——“Oracle和Aurora PostgreSQL是两种不同的[数据库]技术,处理“保存点”(savepoint)的方式不一样”。仅凭这一句话,我们似乎无法明确肯定问题的根源,但可以肯定的是,故障是由新引入的Aurora PostgreSQL数据库造成的。

而第二句话就更有意思了,在我个人看来甚至有点强词夺理——“AWS Aurora是为前瞻性应用软件设计的,而Oracle是为较传统的应用软件设计的”。我觉得这不能称其为一个理由,更像是一个借口。不能说你的系统做了面向未来的设计就可以忽略当下对用户的支持和保障,也不能简单粗暴的把用户区分为前瞻性的和传统的,简而言之,所有用户的需求都应该被充分重视。

2_3_3

对照上一条新闻,再来看下面一条新闻,相信大家已经不陌生了,就是从去年(2017年)开始,蚂蚁金服100%的核心系统都开始运行在OceanBase之上,而且OceanBase作为中国自研的数据库创造了突破世界纪录的性能指标。相信大家能够感知到我们的团队做到这一点有多么的不容易。但在这里并不是想表达,我们做的就一定比亚马逊好,其实亚马逊踩过的坑我们在内部都经历过。

2_3_4

这里想说的其实是蚂蚁金服之所以能够成功去掉Oracle,背后是很多人、很多团队的合作和付出。比如,除了OceanBase以外,我们的用户也需要配合我们去做应用改造,大家知道我们的产品目前已经高度兼容MySQL,但Oracle和MySQL毕竟是两个数据库,Oracle用户需要根据我们的语法和功能(也就是MySQL)做大量的改造。

另外一方面,我们还有全世界最好的数据库运维团队,他们也花费了大量的努力去解决由两种不同的数据库所带来的各种各样的麻烦和问题。总而言之,不管我们性能、稳定性做得如何好,只要用户需要从一种数据库迁移到另外一种数据库,开发、运维、用户就要付出大量的努力去解决数据库差异引入的各种问题,付出很大的代价。这也就解释了我们今天为什么要做Oracle兼容性——目的很简单,就是为了最大程度降低用户的迁移及使用成本,这与优化性能、降低运行成本本质上没有区别,都是为了提供更大的客户价值。

2_3_5

经过几年的去O,我们理解的数据库兼容性从方法论上大致可以包括以下这么几个层次:

  • 第一是数据层,原生的数据类型是否100%兼容是非常重要的,这里面有个错觉——是不是我们的数据类型范围是Oracle的类型范围的超集就够了?其实不然,很多时候用户依赖这个范围,去检查输入数据的合理性,捕捉错误,因此我们必须做到与原生类型完全一致。
  • 第二个是功能,这个很好理解,所有的SQL功能、语法、包括错误码等,都会直接影响到用户程序的可用性,这里面需要投入大量细致的工作,比如,数据长度何时可以截断、两种不同的数据类型如何进行比较等等,仅仅通过文档的描述来实现功能的兼容很多时候是不够的。
  • 第三个层面是运维和管理,比如,Oracle有大量的原生字典视图、包括很多运维命令,能否做到兼容影响到DBA的学习成本,同时也会影响到外围工具的兼容性。
  • 最后一个层面是核心能力,这一点往往是容易被大家忽略的,觉得我们把用户迁过来了,业务切流了,就万事大吉了,其实远不是这样,因为如果做不到Oracle产品的性能和稳定性,用户从使用角度上还是无法做到一样的体验,比如一条SQL如果需要手动改写才能在OceanBase中产生一个合理的执行计划,那业务的改造还不能完全省去。

2_3_6

这是一张OceanBase支持Oracle兼容性的示意图,可以看到,OceanBase的Oracle兼容性模式是租户级的,也就是说,用户可以在同一个集群内同时运行Oracle/MySQL两种不同类型的租户,这样做也是为了进一步降低用户的部署成本。OceanBase从1.0开始就是云数据库架构,支持多租户间的资源隔离和负载均衡,这些能力在引入Oracle兼容模式后都会继续保留。

2_3_7

那么,我们是如何用一个数据库内核来支持两种不同类型的租户的呢?上图给出了示意:在底层(数据层),不同租户的数据都是按照统一的方式进行存储的,元数据是租户间隔离的,元数据以上,我们定义了MySQL和Oracle两套不同的展示视图。

这里面列举了一些OceanBase 2.0会支持的部分Oracle兼容功能:

  • 数据类型:支持number、varchar2、timestamp、CLOB…
  • SQL层功能:外连接(+)、窗口函数、层次查询、临时表、DB link、外键
  • 事务层:隔离级别、flashback、XA
  • 内部视图:部分字典视图
  • 索引:全局索引、函数索引
  • 分区:hash、range、list分区及二级分区组合
  • 伪列:rownum、sequence、virtual column等
  • 存储过程:循环、复杂数据类型、cursor、异常
  • 客户端:JDBC、ObProxy、C客户端

需要指明的是,这个列表还在随着我们收集到的需求而调整,但是几个重要的功能(接下来我们为大家一一解析),包括全局索引、存储过程、基础数据类型等,OceanBase 2.0都一定会支持。

OceanBase 2.0 的新特性

全局索引

全局索引是OceanBase 2.0会发布的一个重要功能,这个功能也是基于2.0的全局一致性的特性而实现的。那么,全局索引解决了哪几个问题呢?

  1. 多维度扩展性 :这个概念不是我们提出来的,简单来说就是:如果今天你的一张数据表随着数据的快速增长,单机装不下了,你就需要考虑分布式方案,在OceanBase内部是通过分区表这一功能来实现的。但是,如果没有全局索引,分区表只能解决主表的分区和扩展,而主表之外的二级索引就必须被拆分为分区内的局部索引,这样一来从访问性能和维护上就和之前的索引(其实是全局索引)有很大的不同,而实现了全局索引后,之前的二级索引也可以按照任意的方式进行分区,扩展到多机上,整个扩展性就变成很多维的了。
  2. 跨分区全局唯一索引:唯一索引要求索引对插入的每条数据保持唯一性,如果没有全局唯一索引,那么为了保证唯一性,就会对用户的分区方式增加很多限定条件。
  3. 强一致:全局索引可以保证强一致性的访问,和用户自己创建一张全局的数据表作为索引相比,提供更好的一致性保障。
  4. 支持更高效的查询方式:全局索引可以实现真正的全局查找,而不是依赖基于分区键的裁剪定位到数据所在的分区,在少量数据访问时,执行的效率更高。

当然,全局索引也有很多难点,比如一致性的保证,建索引中的异步化考虑等等,是一个实现难度很高的特性。

分区

2_3_7

分区功能是分布式数据库的一个重要能力,我们在MySQL模式上支持了部分分区方式,这些方式都会以Oracle兼容的方式继续提供支持。另外,我们还新增了list分区,这个对于不同值个数比较小的分区场景有非常重要的意义。另外我们还将提供更多的分区管理功能。分区裁剪的能力也会进一步增强。

Sequence

在OceanBase 2.0中,我们将支持sequence对象的使用。作为分布式数据库,我们为了避免全局sequence的热点访问,实现了节点内部的sequence缓存,并通过提前预取sequence范围等一系列优化手段,确保整个系统的可用性和容错能力。

DB link 

DB link也是Oracle的一项重要功能。基于DB link,用户可以做跨库的查询和事务,OceanBase 2.0将支持OceanBase集群之间的跨库访问和跨库事务。

存储过程

存储过程是OceanBase 2.0 Oracle兼容性的重要功能。在迁移传统Oracle用户的时候,存储过程一直是横在所有数据库厂商面前的拦路虎。当年我在Oracle参加新人培训的时候,PL/SQL组的一位资深工程师就得意的说,“我们每写一条PL/SQL语句,就在用户的脖子上加了一根锁链”。

事实也的确如此,存储过程的代码往往涉及到很多业务逻辑,几乎没有重构的可能。如果不支持,就只能重写业务逻辑。而且,存储过程在很多场景依然有非常大的不可替代性。例如:

2_3_8

如上图可以看到,交互式的事务处理的超过50%的时间往往消耗在客户端与数据库之间的通信或是客户端的处理时间上,数据库的性能在这种情况下只能通过加大客户端的并发来实现。但是有的场景,简单的增加并发并不能真正提高性能。例如,如果用户在事务开始的时候加了一把行锁,那么整个事务都将处于该锁的“临界区”之内,处理能力直接和事务的延迟有关,这就是典型的“热点行”问题,而有了存储过程,事务的逻辑可以完全在数据库端完成,耗时更短,热点行的处理能力也就更高。

同时,OceanBase 2.0的存储过程是基于LLVM编译执行的,因此在性能上能够提供极致的体验。

客户端驱动——JDBC driver

在客户端驱动上,OceanBase的做法是基于MySQL的通讯协议,进行二次扩展,新的扩展协议在继续支持MySQL协议以外,还将支持Oracle的原生数据类型。

内核全面升级

刚才我们说了,在兼容Oracle数据库上,功能和表现是一方面,性能和稳定性的要求也是重中之重。OceanBase 2.0对数据库内核进行了全面的升级换代,增加了很多新的功能和特性。

直方图

直方图是优化器优化依赖的重要统计信息的一种。OceanBase 2.0支持了兼容Oracle的等高直方图和频率直方图,可以通过自动或者手动的方式进行收集,并自动根据数据的特征选择合适的采样率,基于直方图信息,我们的优化器将能够生成更为准确的执行计划。

自适应计划匹配

在我们的业务中,经常会遇到所谓“大小账号”问题,即,如果一条查询是查询某个商户的销售记录的,那么查询某个大商户时,势必返回很多记录,而一个小商户的相关记录可能只有几条。

在这种情况下,要求我们使用不同的执行计划,为了解决这个问题,在OceanBase 2.0中,引入了自适应计划匹配,其目的是处理同一条SQL不同参数时,可以选择合适的执行计划。基本思路是:通过条件选择率的划分,将整个计划空间按计划进行分割,根据入参的选择率选择恰当的执行计划。

计划演进

执行计划演进是我们为了确保计划稳定性而开发的重要功能,其基本思想是通过真实的流量灰度执行新生成的执行计划,在确保新的计划满足预期后才完成新老计划的替换,这个逻辑大大降低了由优化器自身问题而引入的计划回退的现象。在Oracle18c的发布会上,Larry Ellison也介绍了Oracle中的类似功能,从这点上看,我们和Oracle想到一起去了(甚至比他们还更早一些)。

并行查询优化

并行查询是OceanBase 2.0引入的全新特性。为了配合整个并行查询框架的升级,我们对优化器也做了相应的调整和扩展,支持了更多的优化路径。

Oracle兼容性的工作才刚刚开始,OceanBase 2.0可以说是“万里长征的第一步”,其实很多兼容性的工作到最后拼的都是对细节的掌握和处理。随着基本功能的支持和完善,可以预见,更大的挑战是在整体的用户体验上能否追上甚至超越Oralce。只有做到了这一点,我们才能充满自信的说,我们为用户的平滑迁移铺平了道路。

相关文章
|
3月前
|
存储 容灾 关系型数据库
OceanBase 高可用性架构解析
【8月更文第31天】在大数据和云计算蓬勃发展的今天,数据库作为数据存储的核心组件,其稳定性和可靠性直接影响到整个系统的性能。OceanBase 是由阿里巴巴集团自主研发的一款分布式关系型数据库系统,旨在为大规模在线交易处理(OLTP)场景提供高性能、高可用性的解决方案。本文将深入探讨 OceanBase 是如何通过其独特的架构设计来确保数据的高可用性和容灾能力。
247 0
|
17天前
|
负载均衡 Oracle 网络协议
Oracle中TAF与SCANIP全面解析
通过本文的解析,读者可以清晰地理解Oracle中TAF与SCAN IP的概念、工作原理及其在实际应用中的优势和局限性。TAF通过自动故障转移提升了会话的高可用性,而SCAN则通过简化客户端连接和负载均衡提升了集群的可管理性和扩展性。这两种技术在现代企业数据库架构中扮演着重要角色,能够显著提高系统的稳定性和可用性。
37 6
|
24天前
|
数据采集 机器学习/深度学习 数据挖掘
10种数据预处理中的数据泄露模式解析:识别与避免策略
在机器学习中,数据泄露是一个常见问题,指的是测试数据在数据准备阶段无意中混入训练数据,导致模型在测试集上的表现失真。本文详细探讨了数据预处理步骤中的数据泄露问题,包括缺失值填充、分类编码、数据缩放、离散化和重采样,并提供了具体的代码示例,展示了如何避免数据泄露,确保模型的测试结果可靠。
35 2
|
27天前
|
人工智能 数据挖掘 大数据
排队免单与消费增值模式:融合玩法与优势解析
排队免单模式通过订单排队、奖励分配、加速与退出机制等,结合消费增值模式中的积分制度、利润入池与积分增值等,共同提升消费者参与度和忠诚度,促进商家销售增长。具体包括订单自动排队、大单拆小单、异业联盟、线上线下融合及数据分析优化等进阶玩法,以及积分增值模型演算,形成一套完整的消费者激励体系。
|
1月前
|
前端开发 算法 JavaScript
无界SaaS模式深度解析:算力算法、链接力、数据确权制度
私域电商的无界SaaS模式涉及后端开发、前端开发、数据库设计、API接口、区块链技术、支付和身份验证系统等多个技术领域。本文通过简化框架和示例代码,指导如何将核心功能转化为技术实现,涵盖用户管理、企业店铺管理、数据流量管理等关键环节。
|
2月前
|
设计模式 存储 安全
PHP中单例模式的深入解析与实践指南
在PHP开发领域,设计模式是构建高效、可维护代码的重要工具。本文聚焦于单例模式——一种确保类仅有一个实例,并提供全局访问点的模式。我们将从理论出发,探讨单例模式的基本概念、应用场景,并通过实际案例分析其在PHP中的实现技巧。最后,讨论单例模式的优势、潜在缺陷及如何在实际项目中合理运用。
|
2月前
|
Ubuntu Oracle 关系型数据库
Oracle VM VirtualBox之Ubuntu 22.04LTS双网卡网络模式配置
这篇文章是关于如何在Oracle VM VirtualBox中配置Ubuntu 22.04LTS虚拟机双网卡网络模式的详细指南,包括VirtualBox网络概述、双网卡网络模式的配置步骤以及Ubuntu系统网络配置。
266 3
|
3月前
|
消息中间件 开发者
【RabbitMQ深度解析】Topic交换器与模式匹配:掌握消息路由的艺术!
【8月更文挑战第24天】在消息队列(MQ)体系中,交换器作为核心组件之一负责消息路由。特别是`topic`类型的交换器,它通过模式匹配实现消息的精准分发,适用于发布-订阅模式。不同于直接交换器和扇形交换器,`topic`交换器支持更复杂的路由策略,通过带有通配符(如 * 和 #)的模式字符串来定义队列与交换器间的绑定关系。
72 2
|
3月前
|
监控 Oracle 关系型数据库
"深度剖析:Oracle SGA大小调整策略——从组件解析到动态优化,打造高效数据库性能"
【8月更文挑战第9天】在Oracle数据库性能优化中,系统全局区(SGA)的大小调整至关重要。SGA作为一组共享内存区域,直接影响数据库处理能力和响应速度。本文通过问答形式介绍SGA调整策略:包括SGA的组成(如数据缓冲区、共享池等),如何根据负载与物理内存确定初始大小,手动调整SGA的方法(如使用`ALTER SYSTEM`命令),以及利用自动内存管理(AMM)特性实现智能调整。调整过程中需注意监控与测试,确保稳定性和性能。
301 2
|
3月前
|
开发者 云计算 数据库
从桌面跃升至云端的华丽转身:深入解析如何运用WinForms与Azure的强大组合,解锁传统应用向现代化分布式系统演变的秘密,实现性能与安全性的双重飞跃——你不可不知的开发新模式
【8月更文挑战第31天】在数字化转型浪潮中,传统桌面应用面临新挑战。本文探讨如何融合Windows Forms(WinForms)与Microsoft Azure,助力应用向云端转型。通过Azure的虚拟机、容器及无服务器计算,可轻松解决性能瓶颈,满足全球用户需求。文中还提供了连接Azure数据库的示例代码,并介绍了集成Azure Storage和Functions的方法。尽管存在安全性、网络延迟及成本等问题,但合理设计架构可有效应对,帮助开发者构建高效可靠的现代应用。
32 0

推荐镜像

更多
下一篇
无影云桌面