本文主要介绍 OceanBase 数据库副本管理的相关原理。
适用版本
OceanBase 数据库所有版本。
副本管理
OceanBase 数据库中,副本被划分成多种类型,包括全功能型副本、日志型副本、只读型副本等,并引入 Locality 概念。Locality 用于描述一个租户或者一个表的副本包含哪些类型,以及它们位于集群中的哪些 Zone 或 Region 中。
副本分布的管理需求来自机器故障与负载均衡两个方面。负载均衡会主动改变副本的分布,机器故障会被动改变副本分布。副本管理包括负载均衡、副本创建、副本下线与回收、增补临时下线副本、增补永久下线副本与增补被回收副本。
负载均衡
负载均衡分为机器、分区两种粒度。
- 机器负载均衡是指 OceanBase 数据库会将一些 Unit 从负载高的机器迁移到负载低的机器上。
- 分区负载均衡是指 OceanBase 数据库会将分区从负载高的 Unit 搬迁副本到负载低的 Unit 上。
副本创建
副本创建采用静态 Round-Robin 策略,尽可能让创建的副本均匀分布到各个 Zone 与 Zone 内各个 Unit 中。其中,Zone 的 Round-Robin 策略仅仅针对 Region 的 Locality。
副本下线与回收
-
当机器和 Root Server 之间无心跳时间小于
lease_time
时,该机器被认为是正常状态。
-
当机器和 Root Server之间无心跳时间大于
lease_time
,小于
server_permanent_offline_timeout
时,该机器被认为是临时下线状态。
-
当机器和 Root Server之间无心跳时间超过
server_permanent_offline_timeout
时,该机器会被标记为永久下线状态。
-
其中,
lease_time
用于配置心跳租约时长,默认为 10s,取值范围为 1s ~ 5 min。
server_permanent_offline_time
用于设置节点心跳中断的时间阈值,默认为 3600s,即 1 小时,取值范围为 [20s,+∞)。有关以上配置项的详细信息,请参见《OceanBase 数据库 参考指南》中的 **系统配置项 **章节。
增补临时下线副本
临时下线机器不影响集群正常工作,无需立即对副本进行特殊处理,但如果因为机器临时下线导致集群进入“危急状态”,则 OceanBase 数据库会做一些紧急处理以保障集群可靠性。例如,3 全功能副本 3 机器配置(即 1-1-1 集群),有 2 台机器宕机,则需要立即进行副本复制,否则再宕机 1 台服务器,数据就会丢失。
由于机器是临时下线,下线的副本还记录在内部表中,只需要在下线副本所在 Zone 中另找一台机器,然后进行一次副本迁移,就能复制一个新副本,防止数据丢失。例如,对于 2-2-2 集群,某个 Zone 中临时下线一台机器,此时 OceanBase 数据库会将副本迁移到该 Zone 的另一台机器上。
增补永久下线副本
从机器永久下线到副本被回收之间还有很长一段时间,这段时间里,机器负载均衡模块被激活。机器负载均衡模块发现有机器处于永久下线状态,就会将其上的 Unit 全部迁移到其它正常的机器上。
注意此时 OceanBase 数据库仅迁移 Unit 资源,并不涉及到真正耗时的 unit 内副本的迁移。
此时,OceanBase 数据库会更新
__all_unit
表中 Unit 的
server
列。随后,复制模块会检测到副本当前所在 OBServer 和 Unit 所在 OBServer 不一致,就会触发迁移任务,把副本迁移到 Unit 所在 OBServer 上。
增补被回收副本
如果在机器永久下线后一段时间内,永久下线副本没来得及被复制到同 Zone 的其它 OBServer 上,则副本可能被回收,内部表中相应的副本条目被删除。这时,内部表记录的副本数量少于 schema 记录的副本数量,并且无法直接知晓少哪些副本。为补足副本,OceanBase 数据库会进入副本复制流程,通过对比下线副本所在的 OBServer、下线副本所在的 Zone、副本类型、上线副本所在机器等信息,得出需要复制的副本。