容灾架构概述
数据库系统在应用架构中承担了数据存储和查询的功能,其对企业数据安全和保障业务连续性至关重要。高可用是数据库系统架构设计中首要考虑的因素,高可用诉求包括服务高可用和数据高可靠。本文将介绍 OceanBase 的服务高可用技术。
OceanBase 数据库具备多样化的服务高可用技术,包括集群内的多副本容灾,以及集群间的物理备库容灾。
说明:目前 DBA 进阶教程的内容暂时对应的是 OceanBase 社区版本,本小节的内容不涉及商业版独有的仲裁副本功能。社区版和商业版的能力区别详见:官网链接。
多副本容灾
如图所示,数据服务层表示一个 OceanBase 数据库集群。该集群由三个子集群(Zone)组成,一个 Zone 由多台物理机器组成,每台物理机器称之为数据节点(OBServer 节点)。OceanBase 数据库采用 Shared-Nothing 的分布式架构,每个数据节点都是对等的。
OceanBase 数据库中存储的数据分布在一个 Zone 的多个数据节点上,其它 Zone 存放多个数据副本。如图所示的 OceanBase 数据库集群中的数据有三个副本,每个 Zone 存放一份。这三个 Zone 构成一个整体的数据库集群,为用户提供服务。
根据部署方式的不同,OceanBase 数据库可以实现各种级别容灾能力:
-
服务器(Server)级无损容灾:能够容忍单台服务器不可用,自动无损切换。
-
机房(Zone)级无损容灾:能够容忍单个机房不可用,自动无损切换。
-
地区(Region)级无损容灾:能够容忍某个城市整体不可用,自动无损切换。
当数据库集群部署在一个机房的多台服务器时,实现服务器级别容灾。当集群的服务器在一个地区的多个机房中时,能够实现机房级别容灾。当集群的服务器在多个地区的多个机房中时,能够实现地区级别容灾。
OceanBase 数据库基于 Paxos 协议实现了多副本容灾方案,对用户提供少数派故障时 RPO = 0,RTO < 8s 的国标最高的 6 级高可用标准
OceanBase 分布式集群的多台机器同时提供数据库服务,并利用多台机器提供数据库服务高可用的能力。在上图中,应用层将请求发送到代理服务(ODP,也称为 obproxy),经过代理服务的路由后,发送到实际服务数据的数据库节点(OBServer 节点),请求的结果沿着反向的路径返回给应用层。整个过程中不同的组件通过不同的方式来达到高可用的能力。
在数据库节点(OBServer 节点)组成的集群中,所有的数据以分区为单位存储并提供高可用的服务能力,每个分区有多个副本。一般来说,一个分区的多个副本分散在多个不同的 Zone 里。多个副本中有且只有一个副本接受修改操作,叫做主副本(Leader),其他叫做从副本(Follower)。主从副本之间通过基于 Multi-Paxos 的分布式共识协议实现了副本之间数据的一致性。当主副本所在节点发生故障的时候,一个从节点会被选举为新的主节点并继续提供服务。
选举服务是高可用的基石。不同于 OceanBase 数据库之前的版本,在 V4.x 版本中,选举服务的粒度从分区变为日志流,分区挂载在日志流上。日志流的多个副本通过选举协议选择其中一个作为主副本(Leader),在集群重新启动时或者主副本出现故障时,都会进行这样的选举。
此外,在 V4.x 版本中,选举服务也不再依赖 NTP 或其他时钟同步服务来保证集群中各机器时钟的一致性,而是通过本地时钟以及经过改进的租约机制来保证一致性。选举服务由优先级机制来保证选择更优的副本作为主副本,优先级机制会考虑用户指定的 Primary Zone,以及机器的异常状态等。
当主副本开始服务后,用户的操作会产生新的数据修改,所有的修改都会产生日志,并同步给其他的备副本(Follower)。OceanBase 数据库同步日志信息的协议是 Multi-Paxos 分布式共识协议。Multi-Paxos 协议保证任何需要达成共识的日志信息,在副本列表中 的多数派副本持久化成功后即可保证,在任意少数派副本故障时,信息不会丢失。Multi-Paxos 协议同步的多个副本保证了在少数节点故障时系统的两个重要特性:数据不会丢失、服务不会停止。用户写入的数据可以容忍少数节点的故障,同时,在节点故障时,系统总是可以自动选择新的副本作为主副本继续数据库的服务。
OceanBase 数据库每个租户还有一个全局时间戳服务(GTS),为租户内执行的所有事务提供事务的读取快照版本和提交版本,保证全局的事务顺序。如果全局时间戳服务出现异常,租户的事务相关操作都会受到影响。OceanBase 数据库使用与分区副本一致的方案保证全局时间戳服务的可靠性与可用性。租户内的全局时间戳服务实际会由一个特殊的分区来决定其服务的位置,这个特殊分区与其他分区一样也有多副本,并通过选举服务选择一个主副本,主副本所在节点就是全局时间戳服务所在节点。如果这个节点出现故障,特殊分区会选择另一个副本作为主副本继续工作,全局时间戳服务也自动转移到新的主副本所在节点继续提供服务。
以上是数据库集群节点实现高可用的关键组件,代理服务(ODP,也称为 obproxy)也需要高可用能力来保证其服务。用户请求首先到达的是代理服务,如果代理服务不正常用户请求也无法被正常服务。代理服务还需要处理数据库集群节点故障,并做出相应的容错处理。
代理服务不同于数据库集群,代理服务没有持久化状态,其工作依赖的所有数据库信息都来自于对数据库服务的访问,所以代理服务故障不会导致数据丢失。代理服务也是由多台节点组成集群服务,用户的请求具体会由哪个代理服务节点来执行,应由用户的F5或者其他负载均衡组件负责,同时代理服务的某台节点 故障,也应由负载均衡组件自动剔除,保证之后的请求不会再发送到故障节点上。
代理服务工作过程会实时监控数据库集群的状态,一方面代理服务会实时获取集群系统表,通过系统表了解每台机器的健康状态和分区的实时位置,另一方面代理服务会通过网络连接探测数据库集群节点的服务状态,遇到异常时会标记相应节点的故障状态,并进行相应的服务切换。
物理备库容灾
物理备库容灾是 OceanBase 数据库高可用解决方案的重要组成部分。
物理备库容灾技术面向多个集群,多集群间传输事务日志,建立基于日志的物理热备服务。在 OceanBase 数据库 V4.2.x 及以上版本,物理备库采用独立的主备库架构,主备关系存在于租户级别,主备之间通过网络直连或第三方日志服务建立传输渠道,只传输日志。不同于以前版本的集中式架构,独立主备库架构下,各个集群是是相互独立的,用户可以更加灵活地管理集群。
租户级主备由于异步同步日志,仅支持最大性能模式,不支持最大保护和最大可用模式,容灾切换时需要保证数据强一致的场景可以采用多副本容灾方案或基于仲裁的容灾方案。