作者简介:镇楠,OceanBase 内核研发工程师,对于分布式集群中副本位置信息的管理方法有着丰富的理解。
OceanBase 有一套独特的元数据管理方式,它的一个设计目标是:所有的信息都保存在表里(甚至包括配置项),系统表的表模式也不能 Hardcode,且一切是自包含的,没有外部依赖。这样一个明显的好处是在大规模集群管理时极大便利运维人员,但这也使得元数据有某些循环依赖需要解开。用户表的元数据存储在系统表,系统表的元数据存储在核心表,核心表的元数据存储在系统租户的一号表。一号表就是开天辟地的那一个,THE ONE。
RootService(简称RS)即总控服务,负责整个 OceanBase 集群的资源调度、资源分配、数据分布信息管理以及 Schema 管理等功能。而 RS 不是独立的进程,是启动在 __all_core_table 的 Leader 上的一组服务。要想学习 RS 的相关代码,就需要先弄懂 __all_core_table。
__all_core_table 是什么?
从最基础的角度看,__all_core_table 是一张 key-value 结构的表,表号为1,是整个集群启动时生成的第一张表,它内部存储了 RS 启动需要的一些信息。由于 RS 的启动、RS 提供的服务,都需要依赖 __all_core_table,使得 __all_core_table 成为了 RS 整个服务的基础、RS 一切的起点。
1、 __all_core_table 的 schema
__all_core_table 是 key-yalue 结构的,它的 schema 硬编码在 int ObInnerTableSchema::all_core_table_schema(ObTableSchema &table_schema) 中,可以在ob_inner_table_schema_def.py 中查看其 schema 具体内容。(其中 gm_columns 为隐藏列,自动生成时间,可忽略。)
__all_core_table 的 rowkey 包含三个:table_name、row_id、column_name ,每组 key 对应一个column_value。可以理解为将正常的二维关系表拆分成一维进行存储。

2、 __all_core_table 的内容


(*上图分别为 GROUP BY table_name 和 table_name = '__all_table_v2' 对应内容)
__all_core_table 保存了启动 RS 所需的必要信息,其中重要的核心表包括:
1)__all_root_table:location cache 模块的核心表,记录了系统表和 __all_tenant_meta_table(租户级,用于记录用户表位置的一张核心表)的位置。__all_root_table 的位置信息,记录在 __all_core_table中;其 schema 信息记录在 __all_table_v2 和__all_column 中。
2)__all_table_v2(__all_table 已废弃)、__all_column、__all_ddl_operation:schema 模块的核心表,由该3张表按层级展开,记录所有表的 schema 信息。(*这些表的 schema 被记录在 __all_column 和 __all_table_v2 中)




