OceanBase 的 redo 日志作用是什么?

学习 OB 事务持久化机制,想请教 redo 日志相关:

  1. redo 日志主要记录什么信息?
  2. 系统宕机重启时,redo 日志如何保证数据不丢失?

1、Redo 日志是 OceanBase 数据库用于宕机恢复以及维护多副本数据一致性的关键组件。Redo 日志是一种物理日志,它记录了数据库对于数据的全部修改历史,具体的说记录的是一次写操作后的结果。从某个持久化的数据版本开始逐条回放 Redo 日志可以还原出数据的最新版本。

OceanBase 数据库的 Redo 日志有两个主要作用:

宕机恢复

与大多数主流数据库相同,OceanBase 数据库遵循 WAL(write-ahead logging)原则,在事务提交前将 Redo 日志持久化,保证事务的原子性和持久性( ACID 中的 “A” 和 “D”)。如果 observer 进程退出或所在的服务器宕机,重启 OBServer 节点会扫描并回放本地的 Redo 日志用于恢复数据。宕机时未持久化的数据会随着 Redo 日志的回放而重新产生。

多副本数据一致性

OceanBase 数据库采用 Multi-Paxos 协议在多个副本间同步 Redo 日志。对于事务层来说,一次 Redo 日志的写入只有同步到多数派副本上时才能认为成功。而事务的提交需要所有 Redo 日志都成功写入。最终,所有副本都会收到相同的一段 Redo 日志并回放出数据。这就保证了一个成功提交的事务的修改最终会在所有副本上生效并保持一致。Redo 日志在多个副本上的持久化使得 OceanBase 数据库可以提供更强的容灾能力。

2、 Redo 日志的回放是 OceanBase 数据库提供高可用能力的基础。日志同步到 Follower 副本后,副本会将日志按照 transaction_id + 回调操作链表的索引值 进行哈希到当前租户的日志回放线程池的不同任务队列中进行回放。OceanBase 数据库中不同事务的 Redo 日志可以并行回放,同一个事务的不同 REDO 日志也可以并行回放,在提高回放速度的同时保证了回放的正确性。日志在副本上回放时首先会创建出事务上下文,然后在事务上下文中还原出操作历史,并在回放到 Commit 日志时将事务提交,相当于事务在副本的镜像上又执行了一次。

通过回放 Redo 日志,副本最终会将 Leader 上执行过的事务重新执行一遍,获得和 Leader 一致的数据状态。当某一分区的 Leader 所在的机器发生故障或由于负载过高无法提供服务时,可以重新将另一个机器上的副本选为新的 Leader。因为它们拥有相同的日志和数据,新 Leader 可以继续提供服务。只要发生故障的副本不超过一半,OceanBase 数据库都可以持续提供服务。发生故障的副本在重启后会重新回放日志,还原出未持久化的数据,最终会和 Leader 保持一致的状态。

对于传统数据库来说,无论是故障宕机还是重新选主,正在执行的事务都会伴随内存信息的丢失而丢失状态。之后通过回放恢复出来的活跃事务因为无法确定状态而只能被回滚。从 Redo 日志的角度看就是回放完所有日志后仍然没有 Commit 日志。在 OceanBase 数据库中重新选主会有一段时间允许正在执行的事务将自己的数据和事务状态写成日志并提交到多数派副本,这样在新的 Leader 上事务可以继续执行。

@论坛小助手

您好,您提到的问题似乎与 OceanBase 没有关联,我无法回答,敬请谅解! 如果您有其他 OceanBase 相关问题,欢迎继续提问。