首批通过分布式安全可靠测评,为关键业务系统打造
slog 盘满导致系统租户队列积压
更新时间:2026-06-10 01:56
问题现象
OBServer 集群中的某个节点出现 SYS 租户无法登录,断连接等问题。
关键诊断信息
触发条件
问题节点所在的 data 盘目录,磁盘空间占用率 100% 满了。
事前巡检
检查 OBServer 部署时的 data 盘,确保磁盘不被占用满。
事后诊断
使用 df 命令,确认 data 盘是否空间 100% 占满。
OBServer 的系统日志,出现以下的 slog 写失败日志信息。
WDIAG [COMMON] normal_retry_write (ob_log_file_handler.cpp:353) [2145808][T1016_OB_SLOG][T1016][Y0-0000000000000000-0-0] [lt=25][errcode=-4009] failed to wait for aio_write(ret=-4009, io_timeout_ms=10000)
问题原因
磁盘满后写 slog 失败引发的一系列连锁问题,导致 SYS 租户队列积压,具体原因如下。
slog 所在的磁盘,因为一些原因占满了(比如大量的 core 文件),导致上层元数据持久化写入失败。
业务租户个日志流会定期持久化元数据,遇到因素 1 后,目前的机制是在线程中无限尝试重写。副作用是,持久化日志流元数据的线程,都会持有日志流内的元数据锁,线程持有后就长期不释放。
SYS 租户的工作线程在执行某些任务时,需要访问 all ls info 虚拟表。在读取其他租户的日志流信息时,会切换到目标租户,尝试获取日志流的元数据锁,读取数据。这就被因素 2 阻塞了。线程本身不释放。
- 大量 SYS 租户的工作线程都阻塞在了获取日志流元数据锁上,导致请求队列积压。
问题的风险及影响
数据目录所在物理磁盘满后,SYS 租户逐渐队列积压直至几乎不可用。用户租户写 slog 失败,事务失败,后续 SQL 也会持续 hang 住。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库企业版 V4.1.0 GA(oceanbase-4.1.0.0-100001122023040322)及之后版本、V4.2.0 GA(oceanbase-4.2.0.0-100010082023083014)及之后版本、V4.2.1 GA(oceanbase-4.2.1.0-100000182023092722)及之后版本、V4.2.2 GA(oceanbase-4.2.2.0-100000082024011317)及之后版本。
注意
所有 OceanBase 数据库 V4.x 版本都可能遇到该问题。
解决方法及规避方法
解决方法:
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V4.2.1 BP5(oceanbase-4.2.1.5-105000072024041817)及之后版本。
在运维能及时响应的情况下,清理磁盘后集群则立即可以恢复。
可将磁盘满机器的 OBServer 进程 kill 掉,先恢复集群运行,待解决完磁盘问题后再将 OBServer 重新拉起。
规避方式:
在部署集群时,保证数据盘目录及 slog 单独在一个存储设备上,以免其他 IO 及数据输入影响。
完善机器监控,如通过 OCP 实时监控机器各磁盘健康状态,通过运维手段及时发现硬件问题。
可以考虑把 slog 支持分开目录的功能 cp 到 V4.2.1 版本,在一定程度上也能预防该问题。