如图所示,数据服务层表示一个 OceanBase 数据库集群。该集群由三个子集群(Zone)组成,一个 Zone 由多台物理机器组成,每台物理机器称之为数据节点(OBServer)。OceanBase 数据库采用 Shared-Nothing 的分布式架构,每个数据节点都是对等的。
Shared-Nothing 的分布式架构,曾在之前博文中讲过,详见:
【数据库】各种并行架构如何进行进程和内存协调?
OceanBase 数据库中存储的数据分布在一个 Zone 的多个数据节点上,其它 Zone 存放多个数据副本。如图所示的 OceanBase 数据库集群中的数据有三个副本,每个 Zone 存放一份。这三个 Zone 构成一个整体的数据库集群,为用户提供服务。
根据部署方式的不同,OceanBase 数据库可以实现各种级别容灾能力:
当数据库集群部署在一个机房的多台服务器时,实现服务器级别容灾。当集群的服务器在一个地区的多个机房中时,能够实现机房级别容灾。当集群的服务器在多个地区的多个机房中时,能够丝线地区级别容灾。
OceanBase 数据库的容灾能力可以达到 RPO=0,RTO=30 秒的国标最高的 6 级标准。
OceanBase 分布式集群的多台机器同时提供数据库服务,并利用多台机器提供数据库服务高可用的能力。在上图中,应用层将请求发送到代理服务(ODP,也称为 OBProxy),经过代理服务的路由后,发送到实际服务数据的数据库节点(OBServer),请求的结果沿着反向的路径返回给应用层。整个过程中不同的组件通过不同的方式来达到高可用的能力。
在数据库节点(OBServer)组成的集群中,所有的数据以分区为单位存储并提供高可用的服务能力,每个分区有多个副本。一般来说,一个分区的多个副本分散在多个不同的区里。多个副本中有且只有一个副本接受修改操作,叫做主副本(Leader),其他叫做从副本(Follower)。主从副本之间通过基于 Multi-Paxos 的分布式共识协议实现了副本之间数据的一致性。当主副本所在节点发生故障的时候,一个从节点会被选举为新的主节点并继续提供服务。
选举服务是高可用的基石,分区的多个副本通过选举协议选择其中一个作为主副本(Leader),在集群重新启动时或者主副本出现故障时,都会进行这样的选举。选举服务依赖集群中各台机器时钟的一致性,每台机器之间的时钟误差不能超过 200 毫秒,集群的每台机器应部署 NTP 或其他时钟同步服务以保证时钟一致。选举服务有优先级机制保证选择更优的副本作为主副本,优先级机制会考虑用户指定的 Primary Zone,考虑机器的异常状态等。
当主副本开始服务后,用户的操作会产生新的数据修改,所有的修改都会产生日志,并同步给其他的备副本(Follower)。OceanBase 数据库同步日志信息的协议是 Multi-Paxos 分布式共识协议。Multi-Paxos 协议保证任何需要达成共识的日志信息,在副本列表中的多数派副本持久化成功后即可保证,在任意少数派副本故障时,信息不会丢失。Multi-Paxos 协议同步的多个副本保证了在少数节点故障时系统的两个重要特性:数据不会丢失、服务不会停止。用户写入的数据可以容忍少数节点的故障,同时,在节点故障时,系统总是可以自动选择新的副本作为主副本继续数据库的服务。
OceanBase 数据库每个租户还有一个全局时间戳服务(GTS),为租户内执行的所有事务提供事务的读取快照版本和提交版本,保证全局的事务顺序。如果全局时间戳服务出现异常,租户的事务相关操作都会受到影响。OceanBase 数据库使用与分区副本一致的方案保证全局时间戳服务的可靠性与可用性。租户内的全局时间戳服务实际会由一个特殊的分区来决定其服务的位置,这个特殊分区与其他分区一样也有多副本,并通过选举服务选择一个主副本,主副本所在节点就是全局时间戳服务所在节点。如果这个节点出现故障,特殊分区会选择另一个副本作为主副本继续工作,全局时间戳服务也自动转移到新的主副本所在节点继续提供服务。
以上是数据库集群节点实现高可用的关键组件,代理服务(ODP,也称为 OBProxy)也需要高可用能力来保证其服务。用户请求首先到达的是代理服务,如果代理服务不正常用户请求也无法被正常服务。代理服务还需要处理数据库集群节点故障,并做出响应的容错处理。
代理服务不同于数据库集群,代理服务没有持久化状态,其工作依赖的所有数据库信息都来自于对数据库服务的访问,所以代理服务故障不会导致数据丢失。代理服务也是由多台节点组成集群服务,用户的请求具体会由哪个代理服务节点来执行,应由用户的F5或者其他负载均衡组件负责,同时代理服务的某台节点故障,也应由负载均衡组件自动剔除,保证之后的请求不会再发送到故障节点上。
代理服务工作过程会实时监控数据库集群的状态,一方面代理服务会实时获取集群系统表,通过系统表了解每台机器的健康状态和分区的实时位置,另一方面代理服务会通过网络连接探测数据库集群节点的服务状态,遇到异常时会标记相应节点的故障状态,并进行相应的服务切换。
OceanBase 数据库代理 ODP(OceanBase Database Proxy,又称 OBProxy)是 OceanBase 专用的代理服务。ODP 自身就有高可用设计。
处理进行中的请求 异步中止机制,当检测到机器故障后,及时中止,避免长时间等待,业务连接池被打爆 处理新请求。
在分布式系统的设计中,要解决的最主要问题之一就是单点故障问题(single point of failure (SPOF) )。为了能在某个节点宕机后,系统仍然具备正常工作的能力,通常需要对节点部署多个副本,互为主备,通过选举协议在多副本中挑选出主副本,并在主副本发生故障后通过选举协议自动切换至备副本。
主副本称为 Leader,备副本称为 Follower。
在分布式系统中,一个工作良好的选举协议应当符合两点预期:
在满足正确性和活性的基础上,OceanBase 数据库的选举协议还提供了优先级机制与切主机制,优先级机制在当前没有 Leader 的情况下在当前可当选 Leader 的多个副本中,选择其中优先级最高的副本称为 Leader;切主机制在当前有 Leader 的情况下可以无缝将 Leader 切换至指定副本。
Lease 机制,翻译过来即是租约机制,是一种在分布式系统常用的协议,是维护分布式系统数据一致性的一种常用工具。
分布式系统中,单使用心跳确认节点是否正常的情况下,如果仅仅是网络抖动或者网络中断则会有可能导致从节点认为主节点挂掉从而选举出新的主节点,产生脑裂。
这种情况有四种解决方式:
Lease 时间长短一般取经验值 1-10 秒即可。太短网络压力大,太长则收回承诺时间过长影响可用性。
OceanBase 数据库假定其运行的物理环境满足一定的约束:
目前参数:MAX_TST = 200ms,MAX_DELAY = 100ms。
注意到,若任意机器与 NTP 服务器的时钟偏差不超过 100ms,则任意两台机器间的时钟偏差不超过 200ms。
当时钟偏差和消息延迟的假设不满足时,将发生无主,但是由于安全接收窗口的检查,无论是否满足环境约束,选举协议的正确性都是可以保证的。
在选举的第一阶段,所有副本都会在同一时刻广播自己优先级,这将使得每个副本都具备足够的信息比较所有副本的优劣,集中投票给同一副本,这一方面避免了选举的分票,另一方面也让选举协议的结果更符合预期,更好预测。
选举优先级是一系列字段的集合,这些字段都有各自的比较规则,这些字段优先级从高到低包括:
用户可以指定分区 Leader,RS 会给对应的分区发消息以完成 Leader 的变更,这种变更通常是很快的。
用户也可以变更 primary region,RS 将指挥分区将 Leader 切换至新的 primary region 上。
当用户开启 enable_auto_leader_switch 选项后,RS 会在 primary zone 中使用切主的方式平滑的分散 leader 的分布。
日志服务作为关系数据库的基础组件,在 OceanBase 数据库中的重要性主要体现在如下方面:
与传统关系型数据库的日志模块相比,OceanBase 数据库的日志服务主要有如下几点挑战:
Paxos Core 是日志服务的核心。日志服务实现了一套标准的 Multi-Paxos 协议,保证在未发生多数派永久性故障的前提下,所有提交成功的数据均可恢复。
Paxos Core 实现了乱序日志提交,保证事务之间无依赖,同时对异地部署非常友好,避免单个网络链路故障影响后续所有事务的 rt。
为确保 Multi-Paxos 的正确性,日志服务提供了多层次的 checksum 校验:
正确、高效的协议实现、不间断运行的容灾切换测试用例以及实时完备的 Checksum 校验,一同确保日志服务的正确性。
日志服务维护着每个 Partition 的成员组信息。成员组信息包括当前 Paxos Group 的 member_list 以及 Quorum 信息。
支持的功能如下:
上述功能均提供了批量操作接口,允许将多个 Partition 的操作批量执行,极大的提升了相关操作的执行效率。
如通过 batch_modify_quorum 接口,单机 1 万个分区 5F->3F 的降级容灾操作执行时间由 20 分钟优化到只需要 20s,极大的提升了系统在故障场景下的容灾能力和响应时间。
OceanBase 数据库作为使用 LSM tree 实现的数据库系统,需要周期性的将 MemTable 的内容转储或合并到磁盘,在执行合并时需要消耗大量 CPU。为了避免合并时影响正常的业务请求,也为了加快合并速度,OceanBase 数据库通过轮转合并,在执行合并前将 Leader 切换到同 Region 的另外一个副本。
日志服务为有主改选提供支持。有主改选执行分两步:
OceanBase 数据库在线上实际运行过程中难免遇到各类故障(磁盘、网络故障,机器异常宕机等)。作为高可用的分布式数据库系统,必须能够在各种故障场景应对自如,保证 RPO = 0,RTO 尽量短。这里按照不同的故障类型分别讲述日志服务在其中所起到的作用:
除上述描述的宕机或网络分区场景外,真实业务的故障场景会更加多样化。OceanBase 数据库除了可以处理上述场景外,对于多种磁盘故障(完全 hang 住或写入缓慢)可以进行自动检测,在 1 分钟内切走 Leader 和备机读流量,保证业务及时恢复。
日志服务通过保证 log_id 和 trans_version 偏序,以及百毫秒级的 Keepalive,用以支持备机和只读副本的弱读功能。
只读副本不是 Paxos Group 的成员,我们通过自适应的结合 Locality 信息的级联算法,自动为只读副本构建上下游关系,实现数据的自动同步。
除只读副本外,日志服务支持日志副本(日志副本有特殊的日志回收策略)以及三种副本类型之间的相互转换。
OceanBase 数据库使用 Paxos 的优化 Multi-Paxos 实现多副本数据同步以及集群的高可用。
在节点宕机、消息无序等场景可能出现的情况下,相互独立的节点之间如何达成决议的问题,作为解决一致性问题的协议,Paxos 的核心是节点间如何确定并只确定一个值(value)。
proposer 为提议者,acceptor 为决策者。假设有多个 proposer 和 acceptor。如果proposer/acceptor 满足下面3点,那么在少数节点宕机、网络分化隔离的情况下,在“确定并只确定一个值”这件事情上可以保证一致性(consistency):
并且对 acceptor 作两个要求:
至此,proposer/acceptor 完成一轮决议可归纳为 prepare 和 accept 两个阶段。prepare 阶段proposer 发起提议问询提议值、acceptor 回应问询并进行 promise;accept 阶段完成决议,图示如下:
还有一个问题需要考量,假如 proposer A发起 ID 为 n 的提议,在提议未完成前 proposer B又发起 ID 为 n+1 的提议,在 n+1 提议未完成前 proposer C 又发起 ID 为 n+2 的提议…… 如此 acceptor 不能完成决议、形成活锁(livelock),虽然这不影响一致性,但一般不想让这样的情况发生。解决的方法是从proposer中选出一个 leader,提议统一由 leader 发起。
learner 依附于 acceptor,用于习得已确定的决议。以上决议过程都只要求 acceptor 多数派参与,而我们希望尽量所有 acceptor 的状态一致。如果部分 acceptor 因宕机等原因未知晓已确定决议,宕机恢复后可经本机 learner 采用 pull 的方式从其他 acceptor 习得。
Basic Paxos 不断地进行“确定一个值”的过程、再为每个过程编上序号,就能得到具有全序关系(total order)的系列值,进而能应用在数据库副本存储等很多场景。我们把单次“确定一个值”的过程称为实例(instance),它由 proposer/acceptor/learner 组成,下图说明了 A/B/C 三机上的实例:
不同序号的实例之间互相不影响,A/B/C 三机输入相同、过程实质等同于执行相同序列的状态机(state machine)指令 ,因而将得到一致的结果。
proposer leader 在 Multi Paxos 中还有助于提升性能,常态下统一由 leader 发起提议,可节省prepare 步骤(leader 不用问询 acceptor 曾接受过的 ID 最大的提议、只有 leader 提议也不需要acceptor 进行 promise)直至发生 leader 宕机、重新选主。
OceanBase 数据库的 Paxos 实现和选举协议一起构成了一致性协议(日志服务)的实现。两者有一定的相关性,但在实现上又尽量做到减少耦合。
选举协议会首先在多个副本中选出一个 Leader 节点,并通过 Lease 机制保证 Leader 的合法性。日志会基于选出的 Leader 推进 Multi-Paxos 的状态机,做未确认日志的恢复,并在恢复阶段完成后开始提供服务。
在传统数据库主备同步容灾方案中,系统正常工作时,会存在一个主节点(又称作 Master)对外提供数据读写服务,其余节点作为备节点(又称作 Slave)从主节点以日志的形式同步数据,作为容灾节点备用。
在系统出现异常时,以主节点和备节点之间出现网络分区为例:
Paxos 协议是基于多数派的协议,简单来说,任何决策的达成均需要多数派节点达成一致。
OceanBase 数据库的高可用选举,保证在任一时刻,只有得到多数派的认可,一个节点才能成为主节点提供读写服务。由于集合中任意两个多数派均会存在交集,保证不会同时选举出两个主节点。
在一个节点当选为主节点后,通过租约(又称作 Lease)机制保证服务的连续性。
OceanBase 数据库的日志同步协议,要求待写入的数据在多数派节点持久化成功。以 OceanBase 数据库典型的同城三机房部署为例,任意事务持久化的日志,均需要同步到至少两个机房,事务才会最终提交。
基于上述分析,OceanBase 数据库通过基于 Paxos 协议实现的高可用选举和日志同步协议,避免了"脑裂",同时保证了数据安全性和服务连续性。
在 OceanBase 集群中,RootService 提供集群的各类管理服务,RootService 服务的高可用使用如下的方式实现:RootService 服务使用 Paxos 协议实现高可用,可以通过集群配置,指定 RootService 服务副本数,RootService 的各副本基于 Paxos 协议选举 leader,leader 副本上任后为集群提供 RootService 服务。当 RootService 的当前 leader 发生故障卸任时,其他的 RootService 副本重新选举产生新的 leader,并继续提供 RootService 服务,依次实现 RootService 的高可用。RootService 的各副本不是一个单独的进程,仅是某些 OBServer 上启动的一个服务。
作为集群的中控服务,RootService 负责集群的 OBServer 管理,各 OBServer 通过心跳数据包(heartbeat)的方式,定期(每 2s)向 RootService 汇报自己的进程状态,RootService 通过监测 OBServer 的心跳数据包,来获取当前 OBServer 进程的工作状态。
RootService 根据心跳数据包可以获得 OBServer 如下的工作状态:
集群中发生故障的 OBServer 存在两种情况:
全局时间戳服务(Global Timestamp Service,简称 GTS),OceanBase 数据库内部为每个租户启动一个全局时间戳服务,事务提交时通过本租户的时间戳服务获取事务版本号,保证全局的事务顺序。
GTS 是集群的核心,需要保证高可用。
GTS 维护了全局递增的时间戳服务,异常场景下依然能够保证正确性:
OceanBase 数据库 3.x 及之前的版本 GTS 生成的时间戳并未持久化,依赖于宕机恢复时间 > 最大可能的时钟跳变时间来保证正确性;后续 OceanBase 数据库版本会持久化 GTS 分配的时间戳,解除上述对时钟跳变的依赖。
OceanBase 数据库提供多种部署模式,可根据对机房配置以及性能和可用性的需求进行灵活选择。
部署方案 | 容灾能力 | RTO | RPO |
---|---|---|---|
同机房三副本 | 机器级无损容灾 / 机架级无损容灾 | 30s 内 | 0 |
同城双机房主备库 | 机房级容灾 | 分钟级 | 大于 0 |
同城三机房 | 机房级无损容灾 | 30s 内 | 0 |
两地两中心主备库 | 地域级容灾 | 分钟级 | 大于 |
三地三中心五副本 | 地域级无损容灾 | 30s内 | 0 |
为了达到不同级别的容灾能力,OceanBase 数据库提供了两种高可用解决方案:多副本高可用解决方案和主备库高可用解决方案。多副本高可用解决方案基于 Paxos 协议实现,在少数派副本不可用情况下,能够自动恢复服务,并且不丢数据,始终保证 RTO 在 30 秒内,RPO 为 0。主备库高可用解决方案是基于传统的主-备架构来实现的高可用方案,是多副本高可用方案的重要补充,可以满足双机房和双地域场景下的容灾需求;它不能保证数据不丢,RPO 大于 0,RTO 为分钟级别。
部署三副本或更多副本,来达到机器级无损容灾。当单台 server 或少数派 server 宕机情况下,不影响业务服务,不丢数据。
任意一个节点不可用时,另一个节点可以接管业务服务。如果备节点不可用,此时数据不受影响,可以持续提供服务;如果主节点不可用,备节点需要激活成新主节点,接管业务服务,由于备节点不能保证同步所有数据,因此可能会丢失数据。
OceanBase 数据库提供了丰富的特性用来保护数据在各种人为或非人为的异常场景下都安全可靠不丢失、不出错。主要包括提供高可用服务的多副本的复制、主备库,以及回收站、闪回和备份恢复等。
当磁盘发生故障的时候,存储在磁盘上的数据可能发生错误。OceanBase 数据库的 redo 日志和 SSTable 中的数据都保存了校验和,读取数据的时候执行严格的校验检查,及时发现错误。磁盘静默错误检测机制还能够发现那些长期不读取的冷数据块中的错误。
当交换机等网络设备发生故障的时候,数据包可能发生错误。无论是客户端与 OceanBase 服务器之间,还是 OceanBase 集群内部的通讯,所有的网络数据包都有严格的数据校验和检查。
当数据库对象被用户误删除的时候,可以通过回收站功能,从回收站中恢复误删除的对象。
当应用程序出现软件缺陷的时候,或者发生操作错误或恶意攻击的时候,表内数据被修改为错误数据。使用闪回查询功能,可以读取表数据的历史快照,从而恢复正确的数据。使用 restore point 特性,还可以在一些重大变更之前记录数据快照,以备异常的时候恢复到快照点。
当然,OceanBase 数据库的备份恢复功能提供了高效和丰富的备份所有数据和元数据的机制,它是保护用户数据最可靠的方式。
OceanBase 数据库是一个多版本的分布式数据库。对于任意一行来说,都有一个 Rowkey 与之对应,行的每个修改称为该行的一个版本。在内存中,行的一个版本用 TransNode 记录,多个版本串成链表,从新到旧连在一起。
以下图为例,行 A 有上有 4 个多版本,版本号分别为:12、11、8、2。
当内存中的数据量积累到一定程度后,我们会通过转储将其转储到磁盘,转储到磁盘的文件称为 SSTable。SSTable 中也保留了数据的多个版本,其中, multi_version_start 指明了该 SSTable 中多版本的起始位点,也即从这个点开始保留了所有数据的多版本信息。base_version 和 snapshot_version 分别指明了 SSTable 中包含数据的事务的提交版本号的左边界和右边界。
Restore Point 指定一个名字,该名字关联到了一个版本号,这个版本号即 Restore Point 创建时的版本号,该版本号对应的数据会被保存起来,以便查询该版本号对应的数据,甚至是将整个数据库回退到该位点。OceanBase 数据库暂不支持将数据回退到 Restore Point,仅支持查询。此外,Restore Point 在 OceanBase 数据库中是租户级别的配置,创建 Restore Point 时,只会保留相应租户的数据。
创建 Restore Point 时,会取当前时间戳作为要保留的版本号,并会等到 GTS 推过后才返回。此时就可以通过 Flashback Query 的语法直接读取多版本数据了。
当 Restore Point 要查询的数据转储成 SSTable 后,后台线程会将这些 SSTable 管理起来,并与 Restore Point 相关联。在 SSTable GC 时,如果发现有 Restore Point 依赖,则不允许将它删除。
备份恢复是 OceanBase 数据高可靠的核心组件,通过纯 SQL 的命令就可以使用完整的备份和恢复功能。在 OceanBase 数据库的世界里,数据的高可靠机制主要有多副本的容灾复制、回收站、主备库和备份恢复等,备份恢复是保护用户数据的最后手段。
常见的数据异常问题如下:
OceanBase 数据库的备份按照备份的形式区分,主要分为数据备份和日志备份两种:数据备份是指存储层的基线和转储数据,也就是备份时刻的 Major SSTable + Minor SSTable;日志备份是指事务层生成的 Clog,包含了 SSTable 之后修改的数据。
目前支持集群级别的备份和租户别级的恢复。恢复的时候允许通过白名单机制指定恢复的表或库。
OceanBase 数据库的备份数据主要分为数据备份和日志备份:
在 OceanBase 数据库中,备份恢复的元信息是指 backup_set 的信息、backup_piece 的信息和租户信息: * 租户信息:在备份介质上保存在 tenant_name_info 文件中,在源集群上保存在 oceanbase.__all_tenant 和 oceanbase.__all_tenant_history 内部表中。
OceanBase 数据库提供了在线物理备份的功能,该功能由日志备份+数据备份两大子功能组成。日志备份持续的维护了集群产生的日志,数据备份维护了快照点的备份,两者结合可以提供恢复到备份位点之后任意时间的能力。
OceanBase 数据库提供了集群级别的日志备份能力。日志备份是 log entry 级别的物理备份,并且能够支持压缩和加密的能力。
日志备份的工作由 Partition 的 Leader 副本负责。每个 OBServer 负责本机 Leader 副本日志的读取、按照 Partition 拆分、日志聚合后发送的工作。
日志备份的周期默认为 2 分钟,提供了准实时的备份能力。
日志备份提供了按天拆分目录的功能,方便用户对于备份数据的管理。
OceanBase 数据库提供了集群级别的数据备份的能力。数据备份目前是基于 restore point 的能力做的数据快照保留,保证了备份期间的数据能够保持全局一致性。数据保留带来了额外的磁盘空间的消耗,如果备份机器的磁盘水位线超过配置的警戒值,会导致数据备份失败。
数据备份的流程都是 RootService 节点调度的,将 1024 个分区作为一组任务发送给 OBServer 备份。备份数据包括分区的元信息和宏块数据。物理备份是指宏块数据的物理备份,元信息是内存序列化后的值。
OceanBase 数据库的基线宏块具有全局唯一的逻辑标识,这个逻辑标识提供了增量备份重用宏块的能力。在 OceanBase 数据库中,一次增量备份指的是全量的元信息的备份+增量的数据宏块的备份。增量备份的恢复和全量备份的恢复流程基本上是一致的,性能上也没有差别,只是会根据逻辑标识在不同的 backupset 之间读取宏块。
OceanBase 数据库提供了当前配置路径下自动清理的功能,该功能由 RootService 定期检查用户配置的 Recovery Window,从而删除不需要数据备份。在删除数据备份的同时,会自动的根据保留的数据备份中最小的回放位点来删除不需要的日志备份。
备份的备份是指数据库备份的二次备份能力,通常一次备份为了较好的性能,会存放在性能较好的备份介质上,而这种介质的容量会比较有限,保留备份的时间会比较短;二次备份则是把一次备份的数据挪到空间更大、保留时间更长、成本更低的介质上。
目前 OceanBase 数据库提供了内置的备份的备份的功能,支持用户调度 OBServer 将一次备份的数据搬迁到指定的目录中。 目前支持 OSS 和 NFS 两种介质。
OceanBase 数据库社区版不提供集群级别的逻辑备份功能,提供了数据的逻辑备份的 OBDUMPER 工具。该工具是 java 开发的一个并行的客户端导出工具,支持 SQL 或者 CSV 格式的数据导出,也支持全局的过滤条件。
OceanBase 数据库提供租户级别的恢复能力,支持微秒级别的恢复精度。
租户恢复保证了跨表、跨分区的全局一致性。
OceanBase 数据库的恢复主要包含下面几步:
对于单个分区来说,备份+恢复的流程和重启的流程比较类似,主要就是加载数据和应用日志。
RootService 根据数据备份的系统表的列表创建对应的分区,然后依次调度分区的 Leader 从备份的介质上拷贝分区的元信息、宏块数据。
日志恢复和重启后回放日志的流程比较类似,恢复的分区的 Leader 在完成数据恢复后,会主动从备份介质上拉取备份的分区级别的日志并保存到本地的 Clog 目录。Leader 将恢复的日志保存到本地的同时,Clog 回放的线程会同时开始回放数据到 MEMStore。等所有的 Clog 都恢复完成以后,一个分区的恢复就完成了。
系统表恢复完成后,RootService 会进行系统表数据的修复:
用户表的数据、日志的恢复流程和系统表类似,唯一的区别是创建分区的列表依赖的数据源不同。恢复用户表的时候,RootService 是从已经恢复的系统表中读取相关列表的。
OceanBase 数据库的物理备份恢复强依赖租户的 GTS 功能,GTS 保证了备份和恢复的数据是全局一致的。
OceanBase 数据库社区版不提供集群级别的逻辑备份恢复功能,提供了数据的逻辑备份的 OBDUMPER 工具和逻辑恢复的 OBLOADER 工具。该工具是 java 开发的客户端导入工具,提供了支持 SQL 或者 CSV 格式的数据导入,也支持导入的限流、断点恢复的能力。
如果想了解更详细的内容,请浏览官方文档。