文章目录
1、什么是OceanBase?
OceanBase是由蚂蚁金服、阿里巴巴完全自主研发的分布式关系型数据库,始创于2010年。
OceanBase具有数据强一致、高可用、高性能、在线扩展、高度兼容SQL标准和主流关系型数据库、低成本等特点。OceanBase至今已成功应用于支付宝全部核心业务:交易、支付、会员、账务等系统以及阿里巴巴淘宝(天猫)收藏夹、P4P广告报表等业务。除在蚂蚁金服和阿里巴巴业务系统中获广泛应用外,从2017年开始,OceanBase开始服务外部客户,客户包括南京银行、浙商银行、人保健康险等。
2、OceanBase架构
OceanBase 数据库采用 Shared-Nothing 架构,各个节点之间完全对等,每个节点都有自己的 SQL 引擎、存储引擎,运行在普通 PC 服务器组成的集群之上,具备可扩展、高可用、高性能、低成本、云原生等核心特性。
OceanBase 数据库的整体架构如下图所示。
1、集群架构
OceanBase 数据库支持数据跨地域(Region)部署,每个地域可能位于不同的城市,距离通常比较远,所以 OceanBase 数据库可以支持多城市部署,也支持多城市级别的容灾。一个 Region 可以包含一个或者多个 Zone,Zone 是一个逻辑的概念,它包含了 1 台或者多台运行了 OBServer 进程的服务器(以下简称 OBServer)。每一个 Zone 上包含一个完整的数据副本,由于 OceanBase 数据库的数据副本是以分区为单位的,所以同一个分区的数据会分布在多个 Zone 上。每个分区的主副本所在服务器被称为 Leader,所在的 Zone 被称为 Primary Zone。如果不设定 Primary Zone,系统会根据负载均衡的策略,在多个全功能副本里自动选择一个作为 Leader。
每个 Zone 会提供两种服务:总控服务(RootService)和分区服务(PartitionService)。其中每个 Zone 上都会存在一个总控服务,运行在某一个 OBServer 上,整个集群中只存在一个主总控服务,其他的总控服务作为主总控服务的备用服务运行。总控服务负责整个集群的资源调度、资源分配、数据分布信息管理以及 Schema 管理等功能。 其中:
资源调度主要包含了向集群中添加、删除 OBServer,在 OBServer 中创建资源规格、Tenant 等供用户使用的资源;
资源均衡主要是指各种资源(例如:Unit)在各个 Zone 或者 OBServer 之间的迁移。
数据分布管理是指总控服务会决定数据分布的位置信息,例如:某一个分区的数据分布到哪些 OBServer 上。
Schema 管理是指总控服务会负责调度和管理各种 DDL 语句。
分区服务用于负责每个 OBServer 上各个分区的管理和操作功能的模块,这个模块与事务引擎、存储引擎存在很多调用关系。
OceanBase 数据库基于 Paxos 的分布式选举算法来实现系统的高可用,最小的粒度可以做到分区级别。集群中数据的一个分区(或者称为副本)会被保存到所有的 Zone 上,整个系统中该副本的多个分区之间通过 Paxos 协议进行日志同步。每个分区和它的副本构成一个独立的 Paxos 复制组,其中一个分区为主分区(Leader),其它分区为备分区(Follower)。所有针对这个副本的写请求,都会自动路由到对应的主分区上进行。主分区可以分布在不同的 OBServer 上,这样对于不同副本的写操作也会分布到不同的数据节点上,从而实现数据多点写入,提高系统性能。
2、存储引擎
OceanBase 数据库的存储引擎采用了基于 LSM-Tree 的架构,把基线数据和增量数据分别保存在磁盘(SSTable)和内存(MemTable)中,具备读写分离的特点。对数据的修改都是增量数据,只写内存。所以 DML 是完全的内存操作,性能非常高。读的时候,数据可能会在内存里有更新过的版本,在持久化存储里有基线版本,需要把两个版本进行合并,获得一个最新版本。
如上图所示,在内存中针对不同的数据访问行为,OceanBase 数据库设计了多种缓存结构。除了常见的数据块缓存之外,也会对行进行缓存,行缓存会极大加速对单行的查询性能。为了避免对不存在行的空查,OceanBase 数据库对行缓存构建了布隆过滤器,并对布隆过滤器进行缓存。OLTP 业务大部分操作为小查询,通过小查询优化,OceanBase 数据库避免了传统数据库解析整个数据块的开销,达到了接近内存数据库的性能。当内存的增量数据达到一定规模的时候,会触发增量数据和基线数据的合并,把增量数据落盘。同时每天晚上的空闲时刻,系统也会启动每日合并。另外,由于基线是只读数据,而且内部采用连续存储的方式,OceanBase 数据库可以根据不同特点的数据采用不同的压缩算法,既能做到高压缩比,又不影响查询性能,大大降低了成本。
3、SQL 引擎
OceanBase 数据库的 SQL 引擎是整个数据库的数据计算中枢,和传统数据库类似,整个引擎分为解析器、优化器、执行器三部分。当 SQL 引擎接受到了 SQL 请求后,经过语法解析、语义分析、查询重写、查询优化等一系列过程后,再由执行器来负责执行。所不同的是,在分布式数据库里,查询优化器会依据数据的分布信息生成分布式的执行计划。如果查询涉及的数据在多台服务器,需要走分布式计划,这是分布式数据库 SQL 引擎的一个重要特点,也是十分考验查询优化器能力的场景。OceanBase 数据库查询优化器做了很多优化,诸如算子下推、智能连接、分区裁剪等。如果 SQL 语句涉及的数据量很大,OceanBase 数据库的查询执行引擎也做了并行处理、任务拆分、动态分区、流水调度、任务裁剪、子任务结果合并、并发限制等优化技术。
下图描述了一条 SQL 语句的执行过程,并列出了 SQL 引擎中各个模块之间的关系。
-
Parser(词法/语法解析模块)
Parser 是整个 SQL 执行引擎的词法或语法解析器,在收到用户发送的 SQL 请求串后,Parser 会将字符串分成一个个的单词,并根据预先设定好的语法规则解析整个请求,将 SQL 请求字符串转换成带有语法结构信息的内存数据结构,称为语法树(Syntax Tree)。
为了加速 SQL 请求的处理速度,OceanBase 数据库对 SQL 请求采用了特有的快速参数化,以加速查找执行计划的速度。
-
Resolver(语义解析模块)
当生成语法树之后,Resolver 会进一步将该语法树转换为带有数据库语义信息的内部数据结构。在这一过程中,Resolver 将根据数据库元信息将 SQL 请求中的 token 翻译成对应的对象(例如库、表、列、索引等),生成语句树。
-
Transfomer(逻辑改写模块)
在查询优化中,经常利用等价改写的方式,将用户 SQL 转换为与之等价的另一条 SQL,以便于优化器生成最佳的执行计划,这一过程称为查询改写。Transformer 在 Resolver 之后,分析用户 SQL 的语义,并根据内部的规则或代价模型,将用户 SQL改写为与之等价的其他形式,并将其提供给后续的优化器做进一步的优化。Transformer 的工作方式是在原 Statement Tree 上做等价变换,变换的结果仍然是一棵语句树。
-
Optimizer(优化器)
优化器是整个 SQL 优化的核心,其作用是为 SQL 请求生成最佳的执行计划。在优化过程中,优化器需要综合考虑 SQL 请求的语义、对象数据特征、对象物理分布等多方面因素,解决访问路径选择、联接顺序选择、联接算法选择、分布式计划生成等多个核心问题,最终选择一个对应该 SQL 的最佳执行计划。SQL 的执行计划是一棵由多个操作符构成的执行树。
-
Code Generator(代码生成器)
优化器负责生成最佳的执行计划,但其输出的结果并不能立即执行,还需要通过代码生成器将其转换为可执行的代码,这个过程由 Code Generator 负责。
-
Executor(执行器)
当 SQL 的执行计划生成后,Executor 会启动该 SQL 的执行过程。对于不同类型的执行计划,Executor 的逻辑有很大的不同:对于本地执行计划,Executor 会简单的从执行计划的顶端的算子开始调用,由算子自身的逻辑完成整个执行的过程,并返回执行结果;对于远程或分布式计划,Executor 需要根据预选的划分,将执行树分成多个可以调度的线程,并通过 RPC 将其发送给相关的节点执行。
-
Plan Cache(执行计划缓存模块)
执行计划的生成是一个比较复杂的过程,耗时比较长,尤其是在 OLTP 场景中,这个耗时往往不可忽略。为了加速 SQL 请求的处理过程,SQL 执行引擎会将该 SQL 第一次生成的执行计划缓存在内存中,后续的执行可以反复执行这个计划,避免了重复查询优化的过程。
2、OceanBase优势
-
高性能:OceanBase采用了读写分离的架构,把数据分为基线数据和增量数据。其中增量数据放在内存里(MemTable),基线数据放在SSD盘(SSTable)。对数据的修改都是增量数据,只写内存。所以DML是完全的内存操作,性能非常高。
-
低成本:OceanBase通过数据编码压缩技术实现高压缩。数据编码是基于数据库关系表中不同字段的值域和类型信息,所产生的一系列的编码方式,它比通用的压缩算法更懂数据,从而能够实现更高的压缩效率。
-
高兼容:兼容常用MySQL/ORACLE功能及MySQL/ORACLE前后台协议,业务零修改或少量修改即可从MySQL/ORACLE迁移至OceanBase。
-
高可用:数据采用多副本存储,少数副本故障不影响数据可用性。通过“三地五中心”部署实现城市级故障自动无损容灾。
3、OceanBase核心特性
OceanBase 数据库具有以下特性:
-
分布式事务引擎
OceanBase 数据库的分布式事务引擎严格支持事务的 ACID 属性,并且在整个集群内严格支持数据强一致性,是全球唯一一家通过了标准 TPC-C 测试的原生分布式关系型数据库产品。
OceanBase 数据库通过 Paxos 协议将事务日志复制到多个数据副本来保证事务的可用性和持久性。
-
可扩展
OceanBase 数据库独创的总控服务和分区级负载均衡能力使系统具有极强的可扩展性,可以在线进行平滑扩容或缩容,并且在扩容后自动实现系统负载均衡,对应用透明,确保系统的持续运行。
此外,OceanBase 数据库支持超大规模集群(节点超过 1500 台,最大单集群数据量超过 3 PB,单表数量达到万亿行级别)动态扩展,在 TPC-C 场景中,系统扩展比可以达到 1:0.9,使用户投资的硬件成本被最大化的利用。
-
高可用
OceanBase 数据库采用基于无共享(Shared-Nothing)的多副本架构,让整个系统没有任何单点故障,保证系统的持续可用。支持单机、机房、城市级别的高可用和容灾,可以进行单机房、双机房、两地三中心、三地五中心部署。经过实际测试,可以做到城市级故障 RPO=0,RTO<30 秒,达到国际标准灾难恢复能力最高级别 6 级。
OceanBase 数据库还提供了基于日志复制技术的主备库特性,为客户提供更加灵活的高可用和容灾能力。主集群通过向备集群发送事务日志的方式来实现数据同步,从而确保生产集群能够在遇到数据损坏、灾难等情况下仍然可以快速恢复业务。当 OceanBase 数据库的生产集群出现计划内或者计划外的不可用情况时,主备库可以通过将某一个备集群的角色切换为主集群,从而保证系统的持续运行,最大限度地降低服务的停机时间。
另外,OceanBase 也提供基于数据块拷贝和事务日志拷贝的物理备份恢复特性作为系统高可用的基础组件。
-
混合事务和分析处理(Hybrid Transaction and Analytical Process,HTAP)
OceanBase 数据库独创的分布式计算引擎,能够让系统中多个计算节点同时运行 OLTP 类型的应用和复杂的 OLAP 类型的应用,让数据库利用率最大化的同时利用多个节点的计算能力,完成对 OLTP 和 OLAP 应用的支持。
OceanBase 数据库真正实现了用一套计算引擎同时支持混合负载的能力,让用户通过一套系统解决 80% 的问题。相对于国内很多分布式数据库采用的通过两种不同的计算引擎,甚至两套数据库系统去分别支持 OLTP 和 OLAP 的方式具有巨大优势。
-
多租户
OceanBase 数据库采用了单集群多租户设计,天然支持云数据库架构,支持公有云、私有云、混合云等多种部署形式。
OceanBase 数据库通过租户实现资源隔离,让每个数据库服务的实例不感知其他实例的存在,并通过权限控制确保不同租户数据的安全性,配合 OceanBase 数据库强大的可扩展性,能够提供安全、灵活的 DBaaS 服务。
-
兼容性
OceanBase 数据库针对 Oracle、MySQL 这两种应用最为广泛的数据库生态都给予了很好的支持。
对于 MySQL 数据库,OceanBase 数据库支持 MySQL 5.6 版本全部语法,可以做到 MySQL 业务无缝切换。
对于 Oracle 数据库,OceanBase 数据库能够支持绝大部分的 Oracle 语法和几乎全量过程性语言功能,可以做到大部分的 Oracle 业务进行少量修改后自动迁移。在多家金融行业客户和阿里巴巴内部已有多次迁移至 OceanBase 数据库的成功案例。
-
完整自主知识产权
OceanBase 数据库由蚂蚁集团完全自主研发,不基于 MySQL 或者 PostgreSQL 等开源数据库,能够做到完全自主可控,不会存在基于开源数据库产品的技术限制问题。
-
高性能
OceanBase 数据库作为准内存数据库,通常只需要操作内存中的数据,并且采用了独创的基于 LSM-Tree 结构的存储引擎,对于硬件更加友好,读写性能均远超传统关系型数据库。
-
安全性
OceanBase 数据库在调研了大量企业对于数据库软件的安全需求,并参考了各种安全标准之后,实现了企业需要的绝大部分安全功能,支持完备的权限与角色体系,支持 SSL、数据透明加密、审计、Label Security、IP 白名单等功能,并通过了等保三标准测试。
-
国产化适配
OceanBase 数据库支持全栈国产化解决方案。迄今已基于硬件整机中科可控 H620 系列、华为 TaiShan 200 系列、长城擎天 DF720 等整机,完成与海光 7185/7280、鲲鹏 920、飞腾 2000+ 等 CPU 的适配互认工作。同时,OceanBase 数据库还支持麒麟 V4、V10 和 UOS V20 等国产操作系统,并与上层中间件东方通 TongWeb V7.0、金蝶 Apusic 应用服务器软件 V9.0 等完成适配互认工作。
4、应用场景
OceanBase的产品定位是一款分布式关系数据库,经过多年蚂蚁金服内部业务的打磨,目前已经支持蚂蚁金服100%核心交易系统,稳定支撑阿里、蚂蚁内部上百个关键业务以及浙商银行、南京银行等多个外部客户。OceanBase产品适用于金融、证券等涉及交易、支付和账务等对高可用、强一致要求特别高,同时对性能、成本和扩展性有需求的金融属性场景,以及各种关系型结构化存储的OLTP应用。OceanBase天然的Share-Nothing分布式架构对于各种OLAP型应用也有很好的支持,例如OceanBase适用于以下典型场景:
-
金融级数据可靠性需求
金融环境下通常对数据可靠性有更高的要求,OceanBase每一次事务提交,对应日志总是会在多个数据中心实时同步,并持久化。即使是数据中心级别的灾难发生,总是可以在其他的数据中心恢复每一笔已经完成的交易,实现了真正金融级别的可靠性要求。
-
让数据库适应飞速增长的业务
业务的飞速成长,通常会给数据库带来成倍压力。OceanBase作为一款真正意义的分布式关系型数据库,由一个个独立的通用计算机作为系统各个节点,数据根据容量大小、可用性自动分布在各个节点,当数据量不断增长时,OceanBase可以自动扩展节点的数量,满足业务需求。
-
连续不间断的服务
企业连续不间断的服务,通常意味着给客户最流畅的产品体验。分布式的OceanBase集群,如果某个节点出现异常时,可以自动剔除此服务节点,该节点对应的数据有多个其他副本,对应的数据服务也由其他节点提供。甚至当某个数据中心出现异常,OceanBase可以在短时间内将服务节点切换到其他数据中心,可以保证业务持续可用。
5、安装部署并体验 OceanBase 数据库
5.1、前提条件
在参考本文安装 OceanBase 数据库之前,确保您的机器可以连接公网。并且您的软硬件环境满足以下要求:
项目 | 描述 |
---|---|
系统 | Anolis OS 8.X 版本(内核 Linux 3.10.0 版本及以上) Red Hat Enterprise Linux Server 7.X 版本(内核 Linux 3.10.0 版本及以上) CentOS Linux 7.X 版本及以上版本(内核 Linux 3.10.0 版本及以上) |
CPU | 最低要求 2 核,推荐 8 核及以上 |
内存 | 最低要求 8G,推荐 32G 及以上 说明:若您选择使用 Docker 部署 OceanBase 数据库,则最低要求 10G。 |
磁盘类型 | 推荐使用 SSD |
磁盘存储空间 | 内存大小的 4 倍及以上 |
文件系统 | EXT4 戓 XFS,当数据超过 16T 时,使用 XFS |
说明
以下内容以 x86 架构的 CentOS Linux 7.9 镜像作为环境,其他环境可能略有不同。
5.2、使用 OBD 部署 OceanBase 数据库
1、下载安装 OBD
获取 OceanBase 数据库最快的方式是使用数据库部署工具 OceanBase Deployer(简称 OBD),因此推荐您使用此方式体验 OceanBase 数据库。按照以下步骤下载并安装 OBD。
如您的机器可以访问公网,并能够添加三方 YUM 软件源,您可以运行以下命令,使用 OceanBase 的官方软件源安装 OBD:
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
sudo yum install -y ob-deploy
2、修改配置文件
本节介绍如何使用 OBD 部署 OceanBase 数据库。按照以下步骤部署 OceanBase 数据库:
-
下载 OceanBase 快速体验示例配置文件。
-
在配置文件中添加 home_path。
oceanbase-ce:
global:
# The working directory for OceanBase Database. OceanBase Database is started under this directory. This is a required field.
home_path:
home_path 是 OceanBase 数据库的工作目录,OceanBase 数据库在此目录下启动,您需提前创建。
3、部署并启动 OceanBase 数据库
按照以下步骤部署并启动 OceanBase 数据库实例:
运行以下命令部署集群:
obd cluster autodeploy obtest -c quick_start_demo.yaml -A
其中,obtest 为集群名称,这里只是示例,您可自行定义集群名称。一个集群只能有一个名称,且集群名称不能重复。增加 -A 参数后,将自动用系统剩余资源创建 test 租户。
命令的详细介绍请参考 obd cluster autodeploy。
运行以下命令查看集群状态:
obd cluster display obtest
命令的详细介绍请参考 obd cluster display。
4、连接 OceanBase 数据库
按照以下步骤连接 OceanBase 数据库:
安装 OceanBase 数据库客户端 OBClient:
如您的机器已添加 OceanBase 官方 YUM 源作为软件源,使用以下命令直接安装:
sudo yum install -y obclient
运行以下命令,使用 OBClient 客户端连接 OceanBase 数据库:
obclient -h127.0.0.1 -P2881 -uroot@test
OBClient 默认使用端口 2881 来连接 OBServer,如果您对端口做了更改,此处使用您实际的端口号。tenant_name 为您将要连接的租户名。
您可执行以下命令检查租户信息:
MySQL [(none)]> use oceanbase;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MySQL [oceanbase]> select * from gv$tenant;
5.3、使用 Docker 部署 OceanBase 数据库
注意
在部署 oceanbase-ce 镜像之前,您需要确认以下信息:
确保您机器的资源至少可以运行 2 核 8GB 以上的 Docker 容器。
您的机器已安装最新版的 Docker,详情请参考 Docker 文档。
您的机器已经启动 Docker 服务。
1、启动 OceanBase 数据库实例
运行以下命令,启动 OceanBase 数据库的实例:
根据当前容器部署最大规格的实例
docker run -p 2881:2881 --name obstandalone -d oceanbase/oceanbase-ce
部署 mini 的独立实例
docker run -p 2881:2881 --name obstandalone -e MINI_MODE=1 -d oceanbase/oceanbase-ce
说明
上述命令默认拉取最新版本,可根据实际需求在 Docker 镜像 中选择版本。
启动预计需要 2-5 分钟。执行以下命令,如果返回 boot success!,则启动成功。
$ docker logs obstandalone | tail -1
boot success!
2、连接 OceanBase 数据库实例
oceanbase-ce 镜像安装了 OceanBase 数据库客户端 OBClient,并提供了默认连接脚本 ob-mysql。
docker exec -it obstandalone ob-mysql sys # 连接 sys 租户的 root 用户
docker exec -it obstandalone ob-mysql root # 连接 test 租户的 root 用户
docker exec -it obstandalone ob-mysql test # 连接 test 租户的 test 用户
您也可以运行以下命令,使用您本机的 OBClient 或者 MySQL 客户端连接实例。
mysql -uroot -h127.1 -P2881
连接成功后,终端将显示如下内容:
$ docker exec -it obstandalone ob-mysql sys
login as root@sys
Command is: obclient -h127.1 -uroot@sys -A -Doceanbase -P2881
Welcome to the OceanBase. Commands end with ; or \g.
Your MySQL connection id is 3221487638
Server version: 5.7.25 OceanBase 3.1.3 (r10100032022041510-a09d3134c10665f03fd56d7f8bdd413b2b771977) (Built Apr 15 2022 02:16:22)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [oceanbase]>