暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OceanBase 源码解读(十三):一号表

作者简介:镇楠,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 中)

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论