2.1 架构概述
一个OceanBase集群的规模可大可小,大型的集群部署可以跨越多个城市,小型的集群可能只有一台服务器。为了组织好集群中的数据库,OceanBase集群采用了多个不同粒度的逻辑概念。
(1)分区(Partition)
OceanBase中数据分布的基本单元是分区,这里的分区和数据库领域常用的分区概念相同,即表中一部分元组所构成的集合。分区也是OceanBase中数据的物理存储单位,每一个分区都有自己的标识和存储设置。OceanBase支持多种分区策略:①范围(Range)分区;②Hash分区和Key分区;③列表(List)分区;④组合分区。
(2)副本(Replica)
为了提高可靠性以及并行性,OceanBase数据库中会以分区为单位建立副本并分散在整个集群中,同一个分区的多个副本一起组成一个Paxos复制组。其中每时每刻有一个副本作为主副本(Leader),所有对该分区的写请求都会在主副本上进行,其他副本通过Paxos协议复制主副本上的日志来保持同步,这些副本被称为Follower。
(3)OBServer
OBServer可以视为“逻辑”服务器,一台物理服务器上可以部署一个或者多个OBServer。每台OBServer都包含SQL引擎、事务引擎和存储引擎,并管理多个数据分区,用户的SQL查询经过SQL引擎解析优化后转化为事务引擎和存储引擎的内部调用,最终作用在OBServer上的数据分区上。在OceanBase内部,OBServer由其所在物理服务器的IP地址和OBServer的服务端口唯一标识。
(4)可用区/区(Zone)
Zone是可用区(Availability Zone)的简称。一个OceanBase集群,由若干个可用区组成,每个可用区又包括多台OBServer,如图2.1所示。为了数据安全性和高可用性,一般会把分区的多个副本分布在不同的可用区中,从而使得单个可用区故障不影响数据库服务。OceanBase集群中可以指定主可用区(Primary Zone),分区的主副本(Leader)会部署在主可用区上,如果没有指定的主可用区,则集群会自动为各分区选择Leader。整个集群的正常运行离不开总控服务,它负责整个集群的资源调度、资源分配、数据分布信息管理以及模式服务等功能。为了提高总控服务的可用性,在集群中会有若干可用区(通常是三个)提供总控服务(RootService),整个集群中的多个总控服务呈现为一主多备的配置:集群中每一时刻仅有一个总控服务(可称为活跃总控服务)生效,其他总控服务在活跃总控服务失效时会选出一个接替其工作。运行着活跃总控服务的OBServer也被称为RootServer。
图2.1 OceanBase集群架构
(5)地域(Region)
Region指一个地域或者城市(例如杭州、上海、深圳等),一个Region包含一个或者多个可用区,不同Region通常距离较远。通过Region的概念,OceanBase可以支持集群跨城市部署,城市之间距离通常比较远,从而支持多城市级别的容灾。图2.2给出了一种两地三中心五副本的部署方式,两个城市分别作为主城市和备城市。主城市包含两个机房,每个机房两个副本;备城市只包含一个机房,其中也只有一个副本。这五个副本之间同样采用Paxos协议进行同步,五个副本中只要有三个能够达到强同步即可。如果数据中心2整体故障,那么集群通过Paxos协议会将数据中心2的两个副本从成员列表中剔除,成员组由五副本降级为三副本,之后只需要强同步两个副本即可。大部分情况下,强同步操作可以在数据中心1内完成,避免跨城市同步。类似地,如果数据中心1整体故障,只需要将主副本切换到数据中心2即可。如果数据中心3失效,两地三中心五副本的部署方式同样也能保证集群的可用性。
图2.2 两地三中心五副本部署方式
事实上,集群中的每一台OBServer都能接收客户端(例如obclient)的直接连接。OBServer都能感知到集群中其他OBServer的存在以及它们各自的身份(例如分区的Leader等),且OBServer都有完整的SQL、存储、事务引擎,因此每一台OBServer都可以通过协调其他OBServer共同完成收到的客户端SQL请求。
1)如果收到的是查询等DML请求,那么收到请求的OBServer会完成SQL的解析、执行计划确定等动作,在执行数据操作时通过OBServer间的RPC调用让目标数据(分区)所在的OBServer协助完成数据的操作,然后将结果汇聚到接收请求的OBServer上,最后由它返回给客户端。
2)如果收到的是DDL请求,则收到请求的OBServer会将请求最终交给RootService所在的OBServer,由它调用模式服务组件提供的功能完成DDL操作。
显然,一个集群中有很多台OBServer,让客户端去选择连接其中哪一台的方案缺乏灵活性且不利于整个集群的负载均衡。因此,如图2.1所示,在OceanBase集群的前端会配置一个由OBProxy组成的转发层和一个负载均衡层,通过这两者配合将客户端的请求路由到最合适的OBServer,从而实现全集群的负载均衡。