OceanBase会自动负责 redo log 的管理控制,包括创建日志文件、日志文件在多个副本之间的同步、日志文件复用、宕机恢复等,管理员默认情况下不需要对 redo log 做任何额外的管理操作。同时,OceanBase 提供 log_tool 工具用于静态解析日志文件的内容,提供虚拟表__all_virtual_clog_stat 查询日志的同步情况等 redo log 相关的内部状态。

    什么是redo log

    redo log 是 OceanBase 用于宕机恢复以及维护多副本数据一致性的最关键的组件。

    • 宕机恢复

    redo log 内部记录所有对 Memtable 的修改操作,在事务提交之前会要求 redo log 刷盘成功。如果 observer 进程退出或所在服务器宕机,重启 observer 会扫描本地的 redo log 文件用于恢复数据,提供数据库的持久性保证。

    • 维护多副本数据一致性

    OceanBase 通过 redo log 实现多个副本的数据同步。多个副本数据同步采用 Multi-Paxos 协议,保证用于提交的事务在多数派上执行成功才返回用户成功,并最终同步到表的所有副本(包括全功能副本、日志副本、只读副本等)。作为 Follower 提供服务的副本会通过实时回放 redo log 重构 Memtable 的内容,用于提供备机读等功能。redo log在多数派副本上持久化保证 OceanBase 可以提供更强的容灾能力。

    redo log的组成

    OceanBase 的 redo log 共包括两部分:

    • clog

    全称 commit log,位于 storage/clog 目录下,记录 redo log 的日志内容。此目录下的文件编号从1开始并连续递增,文件id不会复用,单个日志文件的大小为64M。这个目录下的日志文件记录数据库中数据所做的更改操作,提供数据持久性保证。

    • ilog

    全称 index log,位于 storage/ilog 目录下,记录相同分区相同 log id 的已经形成多数派日志的 commit log 的位置信息。此目录下的文件编号从1开始并连续递增,文件 id 不会复用,单个日志文件的大小为64M。这个目录下的日志文件是 clog 的索引,本质上是一种优化,ilog的文件删除不会影响数据持久性(但可能会影响系统的恢复时间)。ilog 和 clog 的文件没有对应关系,由于 ilog 针对单条日志记录的内容会比clog少很多,因此一般场景下 ilog 的文件数目也比 clog 文件数目少很多。

    redo log在磁盘上的组织

    clog/ilog 都是多个分区混写的,即多个 Partition 的日志内容会写入相同的日志文件。不同 Partition 有独立的log_id,且 log_id 均从1开始编号并连续递增。

    clog/ilog 会尽量用满分给日志盘的磁盘空间,默认配置达到日志盘空间80%时开始复用旧的日志文件。这里要注意,旧的日志文件是否可复用还需要满足其他的约束(如日志所对应的数据是否已转储到磁盘,确保数据不丢等),因此在某些场景下日志盘的水位会高于80%,在此种情况下需要特别关注,明确水位超出的原因,并及时处理。

    redo log的checksum校验

    OceanBase 提供单条日志,多条日志构成的日志块(Log Block),分区内连续日志的累积 checksum 等多种校验日志数据正确性的方式,上述校验默认均是开启的,用于确保数据不会出错。

    redo log相关虚拟表

    redo log 对应的虚拟表__all_virtual_clog_stat,对应虚拟表字段含义可参考虚拟表定义部分。

    log_tool工具

    OceanBase提供 log_tool 工具用于解析静态的日志文件。具体用法如下:

    1. ./ob_admin clog_tool --help
    2. Usage: log_tool [OPTION] [FILE]...

    结果如下所示:

    1. -I --with-info-block infoblock
    2. -r --read read
    3. -R --revise revise
    4. -g --group group
    5. -c --clog clog
    6. -i --ilog ilog
    7. -S --slog slog
    8. -t --trans-print print transaction log
    9. -f --freeze-print print freeze log
    10. -w --print-whole-log with whole log printed
    11. -e --extra-options extra options
    12. -p --param-print with read param
    13. -v --version print tool version
    14. -h --help print help message

    The FILE(s) can be a single file or specified as *, file list, or other style supported by shellThe supported OPTION groups are -I[c|i], -rc[t|f][w][p], -g[c|i], -ri[p]

    example : log_tool -rctfw file : print all log contentlog_tool -rcfw file : print all log except trans_loglog_tool -rcfw file -e “table_id=1099511627915;partition_id=2;log_id=46555”

    ./ob_admin clog_tool_v2 —helpUsages:ob_admin clog_tool_v2 dump_all log_files ## ./ob_admin clog_tool_v2 dump_all 1 2 3 ##将log文件中的内容全部打印出来ob_admin clog_tool_v2 dump_hex log_files ## ./ob_admin clog_tool_v2 dump_hex 1 2 3 ##和dump_all类似,不同的是将不可打印字符打印为16进制ob_admin clog_tool_v2 dump_format log_files ## ./ob_admin clog_tool_v2 dump_format 1 2 3 ##将日志文件以格式化的形式打出来ob_admin clog_tool_v2 stat_clog log_file #statistic space use of clog