如何排查合并问题——《OceanBase诊断系列》之七

1. 前言

OceanBase数据库的存储引擎以 LSM-Tree 架构为基础,区分静态基线数据(存储在只读SSTable)和动态增量数据(存储在可读写MemTable)。其中 SSTable 是只读的,一旦生成就不再被修改,存储于磁盘;MemTable 支持读写,存储于内存。当进行数据库的DML操作时,如插入、更新或删除,这些操作首先被写入MemTable。随着MemTable中的数据量逐渐增大到一定规模时,这些数据会被转储到磁盘上,形成SSTable。在进行查询时,系统需要同时对SSTable和MemTable进行查询操作,然后将这两个查询结果进行归并,最终将归并后的查询结果返回给SQL层。此外,为了避免对基线数据的随机读,OceanBase还在内存中实现了Block Cache和Row Cache。

当内存的增量数据达到一定规模的时候,会触发增量数据和基线数据的合并,将增量数据写入磁盘。此外,系统还会在每天晚上的空闲时段自动进行每日合并操作。

1709088365

2. 视图介绍

视图功能
GV$OB_SSTABLES展示每台OBServer上各分区下的MEMTable和SSTable信息
CDB_OB_MAJOR_COMPACTION展示所有租户的全局合并信息
GV$OB_COMPACTION_PROGRESS展示租户的Server级compaction进度信息
GV$OB_TABLET_COMPACTION_PROGRESS展示tablet级的compaction进度信息
GV$OB_TABLET_COMPACTION_HISTORY展示tablet级的compaction历史信息
GV$OB_COMPACTION_DIAGNOSE_INFO展示compaction诊断信息
GV$OB_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.总结

1709089204

6. 附录

  • obdiag 官方文档: OceanBase分布式数据库-海量数据 笔笔算数
  • obdiag github地址: GitHub - oceanbase/oceanbase-diagnostic-tool: OceanBase Diagnostic Tool is designed to help OceanBase users quickly gather necessary information and analyze the cause of the problem.
第一篇如何修炼成“神医”——《OceanBase诊断系列》之一
第二篇走进SQL审计视图——《OceanBase诊断系列》之二
第三篇一键操作敏捷诊断工具obdiag收集诊断信息实践——《OceanBase诊断系列》之三
第四篇一键操作敏捷诊断工具obdiag分析OB集群日志设计与实践——《OceanBase诊断系列》之四
第五篇专为OceanBase打造的巡检工具已推出!给OceanBase进行一次体检吧——《OceanBase诊断系列》之五
第六篇obdiag帮你读懂全链路诊断日志——《OceanBase诊断系列》之六
第七篇如何排查合并问题——《OceanBase诊断系列》之七

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/728971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++程序设计-第四/五章 函数和类和对象【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下C程序设计中的重点概念&#xff0c;以供大家期末复习和考研复习的时候使用。 文章目录 前言第四章 函数 函数和类和对象4.1 说明带参数的宏与内联函数有什么不同4.2 全局变量和局部变量有什么区别是怎么实现的…

2024年华为OD机试真题-停车场车辆统计-Java-OD统一考试(C卷)

题目描述: 特定大小的停车场,数组cars[]表示,其中1表示有车,0表示没车。车辆大小不一,小车占一个车位(长度1),货车占两个车位(长度2),卡车占三个车位(长度3),统计停车场最少可以停多少辆车,返回具体的数目。 输入描述: 整型字符串数组cars[],其中1表示有车,0…

C语言-----qsort函数的功能以及模拟实现

1.冒泡排序 &#xff08;1&#xff09;冒泡排序就是数据两个两个的进行比较每一趟都是一个数和其他的所有的数字比较&#xff0c; &#xff08;2&#xff09;这个要的是升序排列&#xff0c;所以前面的大的话&#xff0c;就会调换位置 &#xff08;3&#xff09;冒泡排序的缺…

【开源】JAVA+Vue.js实现高校宿舍调配管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能需求2.1 学生端2.2 宿管2.3 老师端 三、系统展示四、核心代码4.1 查询单条个人习惯4.2 查询我的室友4.3 查询宿舍4.4 查询指定性别全部宿舍4.5 初次分配宿舍 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的…

【C语言基础】:深入理解指针(三)

文章目录 深入理解指针一、冒泡排序二、二级指针三、指针数组3.1 指针数组模拟二维数组 四、字符指针变量五、数组指针变量5.1 数组指针变量是什么&#xff1f;5.2 数组指针变量的初始化 六、二维数组传参的本质 深入理解指针 指针系列回顾&#xff1a; 【C语言基础】&#xf…

L2-008 最长对称子串(java题解)

对给定的字符串&#xff0c;本题要求你输出最长对称子串的长度。例如&#xff0c;给定Is PAT&TAP symmetric?&#xff0c;最长对称子串为s PAT&TAP s&#xff0c;于是你应该输出11。 输入格式&#xff1a; 输入在一行中给出长度不超过1000的非空字符串。 输出格式&a…

JavaScript 中的 sort 传入 (a,b) => b - a 会是升序还是降序?为什么呢?

在 JavaScript 中的数组有内建的 sort 方法,可以让我们不用自己手写排序算法,也能够有高效能的排序方法可用。然而,你知道sort 要怎么用吗? 在sort 中要传入的compareFn 又是如何运作的? 当compareFn 是(a, b) => b - a 时,排序会是升序还是降序? 为什么呢? 这一连…

用户登录问题——登录态

不论在任何系统中&#xff0c;用户体系都是重中之重&#xff0c;而怎么建立一个完善的&#xff0c;安全的用户体系&#xff0c;是所有开发者都在思考的问题。 而这里就来思考一下&#xff0c;用户登录问题。 登录的作用主要就是用户认证&#xff0c;与权限认证&#xff0c;也…

云原生周刊:CNCF 宣布 Falco 毕业|2024.3.4

开源项目推荐 ldap-operator 用于部署和管理 LDAP 目录的 Kubernetes Operator。 Updatecli Updatecli 是一个用于应用文件更新策略的工具。每个应用程序“运行”时都设计为可在任何地方使用&#xff0c;它会检测是否需要使用自定义策略更新值&#xff0c;然后根据该策略应…

UOS 与 Ubuntu 命令行打开安装包界面,双击打开界面调用安装包界面展示

UOS 使用deepin-deb-installer安装程序 deepin-deb-installer xxxxxxx.deb & Ubuntu snap-store --local-filename /home/seven/wps-office_1xxxxxxx.deb &

ubuntu20.04安装ros并配置相关环境以及驱动AUBO i5机械臂

ubuntu20.04安装ros并配置相关环境以及驱动AUBO i5机械臂 安装ros安装rosdep(小鱼的rosdepc,又快又好用)环境配置下载并编译aubo roslib库环境变量配置aubo gazeboaubo rviz驱动真实机械臂 安装ros 搜索鱼香ros网站https://fishros.com/&#xff0c;根据一键安装ros里提供的指…

【数据结构】二、线性表:1.顺序表的定义与实现(静态分配、动态分配)

文章目录 线性表linear list基本操作1.顺序表1.1静态分配1.2动态分配 线性表linear list 线性表是具有相同数据类型的n (n≥0&#xff09;个数据元素的有限序列&#xff0c;其中n为表长&#xff0c;当n0时线性表是一个空表。 若用L命名线性表&#xff0c;则其一般表示为&#…

自动填充MyBatis-Plus日志中的sql语句参数小工具

写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油&#xff0c;冲鸭&#x…

Chromium内核浏览器编译记(四)Linux版本CEF编译

转载请注明出处&#xff1a;https://blog.csdn.net/kong_gu_you_lan/article/details/136508294 本文出自 容华谢后的博客 0.写在前面 本篇文章是用来记录编译Linux版本CEF的步骤和踩过的坑&#xff0c;以防止后续再用到的时候忘记&#xff0c;同时也希望能够帮助到遇到同样问…

Crow 编译和环境搭建

Crow与其说是编译&#xff0c;倒不如说是环境搭建。Crow只需要包含头文件&#xff0c;所以不用编译生成lib。 Crow环境搭建 boost&#xff08;可以不编译boost&#xff0c;只需要boost头文件即可&#xff09;asio &#xff08;可以不编译&#xff0c;直接包含头文件。不能直接…

【Linux】软件管理器yum和编辑器vim

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、Linux下安装软件的方案1.1 源代码安装1.2 rpm安装1.3 yum安装 二、Linux软件…

Spring Boot 配置热部署

前言 对于 Spring Boot 项目之中, 在刚开始学习的时候, 每当代码进行变动的时候, 想要生效那就必须要手动重启. 为什么要重启呢 ? 原因在于写的代码是依靠运行之后的 class 文件运行的, 当我们的代码更新以后, 如果不去手动重启, 那么就无法生成新的 class 文件, 执行的就是旧…

C#关键字学习

前言 记录C#编程中用到的关键字&#xff0c;对关键字的用途进行解释、记录、学习。会持续更新。 1. volatile 在C#中&#xff0c;volatile关键字用于声明一个字段&#xff08;通常是一个共享的字段&#xff09;是易变的&#xff0c;即每次访问该字段时&#xff0c;都要从内存…

蓝桥杯物联网竞赛_STM32L071_11_知识体系的查漏与补缺

太久没学单片机了&#xff0c;再重新过一遍查漏补缺&#xff0c;对其中之前没怎么在意的&#xff0c;而现在又发觉的问题进行再分析与补充 1. debug serial wire是干什么用的 这个东西我勾选不勾选都对我的程序没有什么影响&#xff0c;我很好奇是干什么用的&#xff0c;网上查…

vue3+elementPlus:el-table-column表格列动态设置单元格颜色

:cell-style属性 //html<el-tableempty-text"暂无数据":data"datalist.table":max-height"height"row-key"id"border:cell-style"cellStyle"> <el-table>//js //动态设置单元格颜色 const cellStyle ({ row, c…