【OceanBase诊断调优 】 —— 合并问题如何排查?

最近总结一些诊断OCeanBase的一些经验,出一个【OceanBase诊断调优】专题,也欢迎大家贡献自己的诊断OceanBase的方法。

1. 前言

OceanBase 数据库的存储引擎基于 LSM-Tree 架构,将数据分为静态基线数据(放在 SSTable 中)和动态增量数据(放在 MemTable 中)两部分,其中 SSTable 是只读的,一旦生成就不再被修改,存储于磁盘;MemTable 支持读写,存储于内存。数据库 DML 操作插入、更新、删除等首先写入 MemTable,等到 MemTable 达到一定大小时转储到磁盘成为 SSTable。在进行查询时,需要分别对 SSTable 和 MemTable 进行查询,并将查询结果进行归并,返回给 SQL 层归并后的查询结果。同时在内存实现了 Block Cache 和 Row cache,来避免对基线数据的随机读。

当内存的增量数据达到一定规模的时候,会触发增量数据和基线数据的合并,把增量数据落盘。同时每天晚上的空闲时刻,系统也会自动每日合并。

2. 视图介绍

|----------------------------------|--------------------------------------|
| 视图 | 功能 |
| GVOB_SSTABLES | 展示每台OBServer上各分区下的MEMTable和SSTable信息 | | CDB_OB_MAJOR_COMPACTION | 展示所有租户的全局合并信息 | | GVOB_COMPACTION_PROGRESS | 展示租户的Server级compaction进度信息 |
| GVOB_TABLET_COMPACTION_PROGRESS | 展示tablet级的compaction进度信息 | | GVOB_TABLET_COMPACTION_HISTORY | 展示tablet级的compaction历史信息 |
| GVOB_COMPACTION_DIAGNOSE_INFO | 展示compaction诊断信息 | | GVOB_COMPACTION_SUGGESTIONS | 展示compaction建议信息 |

3.如何借助视图排查问题

3.1 合并/Major Merge

1)通过CDB_OB_MAJOR_COMPACTION查看当前集群的合并情况,如果STATUS处于COMPACTING状态,说明正在执行合并;

复制代码
select * from CDB_OB_MAJOR_COMPACTION;

2)通过GV$OB_COMPACTION_PROGRESS查询server级别的合并进度,可以看到当前是否有合并任务(STATUS="NODE_RUNNING"),未完成的tablet数量(UNFINISHED_TABLET_COUNT)等信息.

复制代码
select * from GV$OB_COMPACTION_PROGRESS where STATUS="NODE_RUNNING";
更具体来说:
select * from GV$OB_COMPACTION_PROGRESS where tenant_id = xx and compaction_scn = xxx and STATUS != "FINISH";

3)通过GV$OB_TABLET_COMPACTION_PROGRESS查询tablet级别的合并进度,可以看到未完成的数据量(UNFINISHED_DATA_SIZE),预期完成时间(ESTIMATED_FINISH_TIME)等信息

复制代码
select * from GV$OB_TABLET_COMPACTION_PROGRESS;

4)对于未出现在tablet合并进度中的tablet或者长时间未完成的tablet,可以通过GV$OB_COMPACTION_DIAGNOSE_INFO进行诊断,查看是否有异常情况出现

复制代码
select * from GV$OB_COMPACTION_DIAGNOSE_INFO;
注意事项

合并是否卡住没有一个硬性指标,但通常可以检查CDB_OB_MAJOR_COMPACTION表中是否存在租户的STATUS长时间处于COMPACTING状态(这里的长时间需要根据数据量和经验判断,无脑判断的话36小时)。

另一个判断方式是检查GV$OB_COMPACTION_PROGRESSSTATUS="NODE_RUNNING"的合并任务,是否长时间没有更新过UNFINISHED_TABLET_COUNT

排查步骤

首先无脑查GV$OB_COMPACTION_DIAGNOSE_INFO视图,如果有信息则根据第三小节的具体内容判断原因。

3.2 转储/Mini Merge

1)通过GV$OB_SSTABLES查看是否存在冻结的MEMTable

复制代码
select * from GV$OB_SSTABLES where table_type = "MEMTABLE" and is_active = "NO";

2)通过GV$OB_TABLET_COMPACTION_PROGRESS查询tablet级别的合并进度,可以看到未完成的数据量(UNFINISHED_DATA_SIZE),预期完成时间(ESTIMATED_FINISH_TIME)等信息

复制代码
select * from GV$OB_TABLET_COMPACTION_PROGRESS;

4)对于未出现在tablet合并进度中的tablet或者长时间未完成的tablet,可以通过GV$OB_COMPACTION_DIAGNOSE_INFO进行诊断,查看是否有异常情况出现

复制代码
select * from GV$OB_COMPACTION_DIAGNOSE_INFO;

3.3 诊断视图GV$OB_COMPACTION_DIAGNOSE_INFO指南

概念:在Compaction出现异常的情况下,OBServer会收集相关信息用于原因诊断。

用法:select * from GV$OB_COMPACTION_DIAGNOSE_INFO;

首先通过STATUS来过滤信息的严重程度,从低到高:

  • SPECIAL:用来输出一些相同问题的tablet数量
  • RS_UNCOMPACTED:不一定存在异常。说明还存在tablet版本尚未推高至当前合并版本号,可以先通过GV$OB_COMPACTION_PROGRESS判断是否处于正常合并进行的状态。如果还有RUNNING的合并,则大概率是合并任务的问题。
  • NOT_SCHEDULE:表示compaction长时间未被调度。比较常见的是出现在follow上,由于medium info的同步落后导致的合并未调度;以及由于dag数量超限导致的MINI未调度。
  • FAILED:表示出现一些明显的异常。

具体的问题主要通过DIAGNOSE_INFO字段来描述。

4.如何借助obdiag来分析合并问题

obdiag官网文档参见: OceanBase分布式数据库-海量数据 笔笔算数

使用 obdiag rca 命令可帮助 OceanBase 数据库相关的诊断信息分析,目前支持对 OceanBase 的异常场景进行分析,找出可能导致问题的原因。

复制代码
obdiag rca list # 列出所有的根因分析场景
obdiag rca run --scene=<scene_name> #执行具体场景的根因分析

scene_name 包含如下:

  • disconnection:一键断连诊断,基于obproxy的诊断日志。
  • major_hold: 一键卡合并诊断。
  • lock_conflict: 一键锁冲突诊断。

示例:分析卡合并场景

复制代码
obdiag rca run --scene=major_hold

5.总结

6. 附录

相关推荐
GottdesKrieges2 小时前
OceanBase数据库磁盘空间管理
java·数据库·oceanbase
枫叶20001 天前
OceanBase数据库-学习笔记1-概论
数据库·笔记·学习·oceanbase
OceanBase数据库官方博客5 天前
向量检索新选择:FastGPT + OceanBase,快速构建RAG
人工智能·oceanbase·分布式数据库·向量数据库·rag
胖头鱼的鱼缸(尹海文)15 天前
数据库管理-第313期 分布式挑战单机,OceanBase单机版试玩(20250411)
数据库·分布式·oceanbase
GottdesKrieges17 天前
OceanBase企业版单机部署:obd命令行方式
数据库·oceanbase
好记忆不如烂笔头abc17 天前
oceanbase开启内存大页
linux·服务器·oceanbase
OceanBase数据库官方博客18 天前
OceanBase 推出单机版 ,为中小规模业务提供高性价比方案
oceanbase·单机数据库
OceanBase数据库官方博客19 天前
OceanBase V4.3.5 上线全文索引功能,让数据检索更高效
全文检索·oceanbase·分布式数据库·产品特性
OceanBase数据库官方博客19 天前
多点:分布式升级助力新零售转型,成本节省超80% | OceanBase 案例
oceanbase·零售·架构选型·布道师计划·电商与零售
OceanBase数据库官方博客19 天前
火山模型的优缺点与优化实践 | OceanBase SQL优化
sql·oceanbase·分布式数据库