OceanBase 数据库 Clog 对本地存储的要求是什么?

本文主要梳理 OceanBase 数据库 Clog 对存储能力的要求。

OceanBase 数据库的事务遵循日志先行原理,需要 Clog 落盘。Clog落盘是指 Clog 使用 Paxos 协议为事务的 redo 日志及两阶段提交日志提供日志持久化服务,每条日志的持久化都需要经过一轮多数派副本的确认,即本地落盘和远端成员的落盘,以形成多数派。

适用版本

OceanBase 数据库 V2.2.X 版本

能力要求

OceanBase 数据库对存储介质的要求如下:

  • 高可用:Paxos 多数派投票、异常恢复均需要保证单点 Clog 的高成功率写入。
  • 强一致:发生脑裂、网络分区、宕机、磁盘故障等异常时,在 Clog 写入位置上保证数据强一致,不丢失数据。
  • 追加写入磁盘:要求写入延迟低并且均匀。

OceanBase 数据库的 I/O 特性

  • 读写块大小
  • 2 MB 的读写是 SSTable、备份恢复最为密集的 I/O 行为。
  • 4 KB 读写是 slog、clog、ilog 最为密集的 I/O 行为。
  • 写入使用的底层函数
  • OceanBase 数据库 V1.4.X 版本日志盘使用 pwrite 写入。
  • OceanBase 数据库 V2.X 版本日志盘使用 aio_write 写入。
  • 写入机制:OceanBase 数据库采用大量的磁盘顺序写入。

Clog I/O 相关 HA 特性

对于 IO 相关的故障,OceanBase 数据库具有以下 HA 特性:

  • 写盘超时:OceanBase 数据库会标记写入超时的磁盘并发起重试,如果成功则清除标记,如果仍不成功,则继续重试。
  • IO 错误:OceanBase 数据库会记录错误并退出。
  • open file 失败:如果文件句柄数达到上限,OceanBase 数据库会重试打开文件。

监控指标

若要监控 OceanBase 数据库的 I/O 性能,可以通过以下方式进行:

  • OCP 中的

    CLOG_WRITE_DISK_RT

    :记录每次事务日志写盘平均耗时。

  • OCP 中的

    TRANS_COMMIT_LOG_SYNC_RT

    :记录每次事务网络同步平均耗时。

  • 有关 OCP 中的监控指标,请参见 《OCP 用户指南》的 租户管理 > 性能监控 章节。

  • 在要检查的 OBServer 服务器执行

    iostat -x -k 1

    ,查看

    util%

    await%

    ,以及存储数据表上标明的

    IO capacity

    等信息。

  • OceanBase 数据库中的参数

    clog_sync_time_warn_threshold

    :表示 commitlog 同步超过多长时间会输出 WARN 日志。

  • 有关该参数的详细信息,请参见《OceanBase 数据库 参考指南》中的 **系统配置项 **章节。

建议配置

  • 存储 Clog 的目录与存储 datafile 的目录分别挂载到不同硬盘,以实现分散 clog 日志和 datafile 读写压力与失败隔离。
  • 选择合适的 RAID 级别,不推荐使用 RAID5 模式,该模式的小 I/O 性能非常差。
  • 检查 log 盘的 RAID 的缓存策略。writethrough 的作用是换电池时,能保证 RAID cache memory 中的数据能保存到硬盘。

[root@hostname /]# ./data/log – writethrough

  • 使用高性能存储介质,例如 nvmessd。

  • log 目录

    /data/log1

    空间大小建议为增量数据内存上限的 3~4 倍。

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