作者简介:镜水,一个无限进步的数据库学徒。
作者简介:海芊,一个致力于当网红的 OceanBase 文档工程师。
本文主要介绍 OceanBase 数据库的 Slog 日志,从代码层面剖析 Slog 日志的模块结构和工作机制,帮助大家深入理解OceanBase 数据库的 Slog日志。
基本概念
我们都知道 OceanBase 数据库的 Clog 日志类似于传统数据库的 Redo 日志,因此在分布式场景下需要多副本同步。而 Slog 不一样,Slog 可以理解为服务器的本地日志,是一台服务器上一些全局信息变更操作(如新增租户、分区创建和新增 SSTable 等)的 redo log。
一个服务器只拥有一个 Slog 写入流,也就是说同一台服务器上具有不同资源池的不同租户并不具有单独的 Slog 文件,所有租户的 Slog 写入请求最后都会汇入服务器所拥有的 Slog 文件中。
一条 Slog 日志记录的格式为:

从上图可以看出,Slog 分为三部分,其中每个部分可以理解为一个 log 块,具有递增的 log_seq 序号,保存在LogEntry 内(log 块的 header):
1. Logs,有效的 redo log 内容,可能包含多条实际的子 redo log,每条子 log 有子 log_seq(从 0 开始递增)。
2.NopLog,无意义的 log 内容,只是为了让整条记录 4k 对齐。
3.SwitchLog,只在一个 slog 文件的最后一条记录出现,包含 next file id,便于切换下一个 Slog 文件继续读取,同时也会包含 padding buffer 做对齐。
代码分析
接下来从代码层面展开分析 Slog。(由于 NopLog 和 SwtichLog 没有实际的 redo log 内容,因此这里不展开分析)
日志结构
每条 Slog 记录的 logs 部分(上图所示的第一部分 log 块)的格式如下:
ObLogEntry + n * log content
ObLogEntry 可以理解为整个 log 块的 header:
struct ObLogEntry {
ObRecordHeader header_;
uint64_t seq_; // 整个 log 的 log_seq
int32_t cmd_; // 该 log 的类型,比如 OB_LOG_NOP 表示该 log 的类型为 NopLog
// 具体见 enum LogCommand
}
struct ObRecordHeader {
int16_t magic_; // magic number
int16_t header_length_; // header length
int16_t version_; // version
int16_t header_checksum_; // header checksum
int64_t timestamp_; //
int32_t data_length_; // length before compress
int32_t data_zlength_; // length after compress, if without compresssion
// data_length_= data_zlength_
int64_t d

本文详细介绍了OceanBase数据库的Slog日志,包括基本概念、日志结构、写入流程和flush流程。Slog作为服务器的本地日志,记录全局信息变更操作。文章通过代码分析揭示了Slog的工作机制,帮助读者深入理解Slog在数据库中的作用。

3434

被折叠的 条评论
为什么被折叠?



