基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
集群架构
更新时间:2023-09-27 19:56:07
基本概念
集群
OceanBase 数据库集群由一个或多个 Region 组成,Region 由一个或多个 Zone 组成,Zone 由一个或多个 OBServer 组成,每个 OBServer 有若干个 Partition 的 Replica。
Region
Region 对应物理上的一个城市或地域,当 OceanBase 数据库集群由多个 Region 组成时,数据库的数据和服务能力就具备地域级容灾能力;当集群只有一个 Region 时,如果出现整个城市级别的故障,则会影响数据库的数据和服务能力。
Zone
在 OceanBase 中,Zone 是指一个数据中心或一个物理区域,它是一个逻辑上的概念,通常包含多个存储节点,这些节点在物理上可以分布在不同的机房、不同的机架或不同的服务器上。一个 Zone 可以包含多个数据中心(比如机房),但是一个数据中心只能属于一个 Zone。
在 OceanBase 中,Zone 通常用于实现跨数据中心的数据容灾。OceanBase 会将数据按照一定的规则分布到不同的 Zone 中,从而实现数据的冗余备份。当一个 Zone 发生故障时,系统可以自动切换到备用 Zone 中的数据来保证数据的可用性。
除了数据容灾,OceanBase 的 Zone 还可以用于数据分片的容器。数据分片是一种将数据划分为多个分片,并将不同分片存储在不同的节点上的技术,可以提高系统的吞吐量和性能。在 OceanBase 中,可以将不同的 Zone 作为不同的分片的 Primary Zone,从而实现分布式存储和处理数据。
OBServer
运行 observer 进程的物理机。一台物理机上可以部署一个或者多个 OBServer(通常情况下一台物理机只部署一个 OBServer)。在 OceanBase 数据库内部,Server 由其 IP 地址和服务端口唯一标识。
Partition
Oceanbase数据库以分区(Partition)为单位组织用户数据,分区在不同机器上的数据拷贝称为副本(Replica)。同一分区的多个副本使用Paxos一致性协议保证副本的强一致,每个分区和它的副本构成一个独立的 Paxos 组,其中一个分区为主副本(Leader),其它分区为从副本(Follower)。主副本具备强一致性读和写能力,从副本具备弱一致性读能力。
部署模式
为保证单一机器故障时同一分区的多数派副本可用,OceanBase 数据库会保证同一个分区的多个副本不调度在同一台机器上。由于同一个分区的副本分布在不同的 Zone/Region 下,在城市级灾难或者数据中心故障时既保证了数据的可靠性,又保证了数据库服务的可用性,达到可靠性与可用性的平衡。OceanBase 数据库创新的容灾能力有三地五中心可以无损容忍城市级灾难,以及同城三中心可以无损容忍数据中心级故障。
三地五中心部署

同城三中心部署

OceanBase 数据库的无损容灾能力还可以方便集群的运维操作,当数据中心或者服务器需要替换和维修时,可以直接下线对应的数据中心或服务器进行替换和维修,并补充进新的数据中心或服务器,OceanBase 数据库会自动进行分区副本的复制和均衡,整个过程可以保证数据库服务的使用不受影响。
RootService
OceanBase 数据库集群会有一个总控服务(RootService),其运行在某个 OBServer上。当 RootService 所在机器故障时,其余 OBServer 会选举出来新的 RootService。RootService 主要提供资源管理、负载均衡、schema 管理等功能,其中:
资源管理
包括 Region/Zone/OBServer/Resource Pool/Unit 等元信息的管理,比如:上下线 OBServer、改变 Tenant 资源规格等。
负载均衡
决定 Unit/Partition 在多个机器间的分布,均衡机器上主分区个数,在容灾场景下通过自动复制/迁移补充缺失的 Replica。
Schema 管理
负责处理 DDL 请求并生成新 Schema。
Locality
租户下分区在各个 Zone 上的副本分布和类型称为 Locality。我们可以通过建租户指定 Locality 的方式决定租户下分区初始的副本类型和分布,后续可通过改变租户 Locality 的方式进行修改。
下边的语句表示创建 mysql_tenant租户,并且其租户下的分区在 z1、z2、z3 上都是全能型副本。
obclient> CREATE TENANT mysql_tenant RESOURCE_POOL_LIST =('resource_pool_1'), primary_zone = "z1;z2;z3", locality ="F@z1, F@z2, F@z3" setob_tcp_invited_nodes='%',ob_timestamp_service='GTS';
下边的语句表示变更 mysql_tenant 的 locality,使其租户下的分区在 z1、z2 是全能型副本,z3 是日志型副本。OceanBase 数据库会基于租户新旧 locality 的对比,决定是否创建/删除/转换对应 zone 的副本。
ALTER TENANT mysql_tenant set locality = "F@z1, F@z2, L@z3";
同一个 OBServer 不会有同一个分区一个以上的副本。
对于一个分区而言,其在一个 Zone 内最多存在一个 Paxos 副本,可以有若干个非 Paxos 副本。可以在 Locality 中指定非 Paxos 副本,如:
locality = "F{1}@z1, R{2}@z1":表示 z1 有 1 个全能型副本,2 个只读型副本。locality = "F{1}@z1, R{ALL_SERVER}@z1": 表示 z1 有一个全能型副本,并在同 zone 其余机器上创建只读型副本(可以没有只读型副本)。
RootService 会根据用户设置的 Locality,通过副本创建/删除/迁移/类型转换的方式,使分区的副本分布和类型满足用户配置的 Locality。
Primary Zone
用户可通过一个租户级的配置,使租户下分区 Leader 分布在指定的 Zone 上,此时称 Leader 所在的 Zone 为 Primary Zone。
Primary Zone 是一个 Zone 集合,用分号(;)分割表示不同的优先级,用逗号(,)分隔表示相同的优先级。RootService 会根据用户设置的 Primary Zone,按照优先级高低顺序,尽可能把分区 Leader 调度到更高优先级的 Zone 内,并在同一优先级的 Zone 间将 Leader 打散在不同的机器上。不设置 Primary Zone 的场合,会认为租户的所有 Zone 都是同一优先级,RootService 会把租户分区 Leader 打散在所有 Zone 内的机器。
用户可通过租户级配置,设置或修改租户的 Primary Zone。
示例如下:
租户创建时设置 Primary Zone,优先级
z1=z2>z3。obclient> CREATE TENANT mysql_tenant RESOURCE_POOL_LIST =('resource_pool_1'), primary_zone = "z1,z2;z3", locality ="F@z1, F@z2, F@z3" setob_tcp_invited_nodes='%',ob_timestamp_service='GTS';变更租户 Primary Zone,优先级
z1>z2>z3。obclient> ALTER TENANT mysql_tenant set primary_zone ="z1;z2;z3";变更租户 Primary Zone,优先级
z1=z2=z3。obclient> ALTER TENANT mysql_tenant set primary_zone =RANDOM;
说明
Primary Zone 只是其中一种选主参考因素,分区对应 Zone 的副本是否能成为 Leader 还需要参考副本类型、日志同步进度等因素。