本文作者:镇楠,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 中)
————————————————
(未完待续)
附录:前十二篇可参考:
1、OceanBase 数据库源码解读(一)引言
2、OceanBase 数据库源码解读(二)目录结构
3、OceanBase 源码解读(三)SQL 的一生
4、OceanBase 源码解读(四)分区的一生
5、OceanBase 源码解读(五)事务的一生
6、OceanBase 源码解读(六)租户的一生
7、OceanBase源码解读(七)带你看透虚拟表
8、OceanBase源码解读(八)OceanBase 高性能执行引擎
9、OceanBase源码解读(九)TableAPI 和 OceanBase 多模型
10、OceanBase 源码解读(十)分布式事务
11、OceanBase 源码解读(十一):表达式和函数
12、OceanBase 源码解读(十二):事务日志的提交和回放
最后的最后,您有任何疑问都可以通过以下方式联系到我们~
联系我们
欢迎广大 OceanBase 爱好者、用户和客户随时与我们联系、反馈,方式如下:
社区版官网论坛
社区版项目网站提 Issue
钉钉群:33254054