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 文件数目少很多。