分区是用户创建的逻辑对象,是OceanBase 进行数据分片的方式。
分片是分区数据的存储对象,是数据均衡的最小单位。
分片与分区一一对应
OceanBase V4版本中,数据副本有两种类型:全功能副本(Leader和Follower,多个副本中只有一个Leader)与只读副本。全功能副本可以提供全部的数据服务,只读副本提供只读服务。强、弱一致性读均读取已完成事务提交的数据,但强一致性读是读取最新的数据版本,弱一致性读不要求读取最新的数据版本。只读副本不是Paxos 组成员,不参与选举投票和Redo-Log 的多数派强同步。
OceanBase 数据库使用Locality 描述数据的多个副本的类型及分布策略,即副本分布在哪些可用区,以及可用区内的副本类型和数量。
OceanBase 数据库使用Primary Zone 描述Leader 副本的偏好位置,Primary Zone 是一个Zone 集合,用分号(;)分割表示不同的优先级,用逗号(,)分隔表示相同的优先级,逗号两侧优先级相同,分号左侧优先级高于右侧。租户默认的Primary Zone 设置为RANDOM.
一个Zone 只能属于一个Region,一个Region 可能包含一个或多个Zone。
一个Zone 只能属于一个IDC,一个IDC 可能包含一个或多个Zone。
多副本日志同步的单位不是单个数据分片,而是多个分片聚合在一起的日志流。
在V3 版本,日志流的单位为数据分片;从V4 版本开始,日志流是一个租户在同一个OBServer 上的所有Leader 分区的聚合,其日志持久化与同步的方式与单机数据库相似,因而被称为单机日志流。
同一日志流的多个副本使用Paxos 一致性协议保证副本的强一致,每个日志流和它的副本构成一个独立的Paxos 组。Paxos 组成员通过Redo-Log(事务日志) 同步数据,
事务的提交需要在多数派成员中强同步Redo-Log,从而实现分布式集群的多副本高可用。
一个租户只有一个广播日志流,承载租户内所有的复制表。租户在Zone 内有多个UNIT 时,其中一个UNIT 按照Locality 描述分配该zone 的副本类型,其他Unit 上均分配只读型副本(Listener),不参与投票选举。