redo 日志管理控制 
================================



redo 日志概念 
------------------

redo 日志是 OceanBase 数据库用于宕机恢复以及维护多副本数据一致性的关键组件。OceanBase 数据库会自动负责 redo 日志的管理控制，包括创建日志文件、日志文件在多个副本之间的同步、日志文件复用、宕机恢复等。

* 宕机恢复

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




<!-- -->

* 维护多副本数据一致性

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




redo 日志的组成 
-------------------

OceanBase 数据库的 redo 日志共包括两部分：

* clog

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




<!-- -->

* ilog

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



