当前位置: 首页 > news >正文

如何用 obdiag 排查 OceanBase数据库的卡合并问题——《OceanBase诊断系列》14

1. 背景

卡合并在OceanBase中是一个复杂的问题,其产生可能源于多种因素。目前,对于卡合并的明确界定尚不存在统一标准,一方面,我们界定超过36小时未完成合并为合并超时,此时RS会记录ERROR日志;另一方面,用户也可能依据自身经验来判断合并是否超时。当用户怀疑合并可能已超时,可利用巡检工具进行检查,以确认是否存在问题,并且得到一系列基础数据方便研发做一个初步的判断,省去一些反复沟通的时间。本文描述了 OceanBase 4.x 版本基于obdiag,如何进行卡合并的分析和诊断。

2. 卡合并诊断流程说明

2.1. 发现卡合并问题

巡检认为合并/转储存在潜在问题可以有三点:

  1. CDB_OB_MAJOR_COMPACTION里IS_ERROR=YES
    1. 其中当CDB_OB_MAJOR_COMPACTION里IS_SUSPENT=YES,可以提示用户,用户可能是有意设置也有可能是无意设置
  2. __all_virtual_compaction_diagnose_info里存在status=FAILED的记录
  3. GV$OB_COMPACTION_PROGRESS表中,根据上一次合并记录中的data_size/(estimated_finish_time-start_time)与当前合并版本记录中(data_size-unfinished_data_size)/(当前时间-start_time)相比,如果差距过大(当前合并比上一次合并慢很多,以5倍为指标),那可能可以认为合并存在异常

2.2. 卡合并诊断

2.2.1. 确定合并记录

查询CDB_OB_MAJOR_COMPACTION,找到status=COMPACTING的记录(需要收集回来)

    1. 可以先检查一下IS_ERROR和IS_SUSPENDED是否非NO,IS_ERROR通常发生在出现数据不一致的时候,INFO里会显示具体问题;IS_SUSPENDED表示暂停了合并,有时候会忘了执行过暂停合并操作,需要手动恢复合并(ALTER SYSTEM RESUME MERGE;

1726058071

  1. 查询__all_virtual_compaction_diagnose_info,最好根据上面得到的结果,每个租户查一次,方便看(需要收集回来)。
  2. 如果有记录,根据DIAGNOSE_INFO字段的内容来具体分析。这里只介绍了一部分常见的信息,其他的目前还是考虑先把诊断表结果拿回来,我分析后再手动进行下一步:
    1. schedule medium failed
      1. 查找这台机器上,CREATE_TIME附近时间的observer.log,grep "decide_medium_snapshot",捞到信息后,把线程号摘出来,更换过滤关键字grep "\[线程号]",收集decide_medium_snapshot关键字前后20行的日志。通常里面会有报错上下文
    2. %error_no=%error_trace=%
      1. 这种情况通常有dag任务失败了,首先查__all_virtual_tablet_meta_table,看下这个分区的compaction_scn是否小于合并版本(global_broadcast_scn),如果小于再进行步骤2
      2. 在对应机器的对应时间附近,grep "error_trace",收集这部分日志回来,整个trace的日志通常不会很多,尽可能捞到报错前后的日志。
不影响正常流程的错误码!!!
constexpr int OB_NO_NEED_MERGE = -4677; // 调度的时候发现可以做Compaction,实际执行时发现不满足Compaction要求
constexpr int OB_CANCELED = -4072; // dag任务被cancel掉,上层逻辑停止了compaction任务
如果是scheduler报错4072,怀疑是执行了suspend merge,需要resume merge--4.0版本--
constexpr int OB_TABLE_IS_DELETED = -4279; // 表被删除
constexpr int OB_TENANT_HAS_BEEN_DROPPED = -5685; //租户被删
constexpr int OB_LS_NOT_EXIST = -4719; // 日志流不存在
constexpr int OB_TABLET_NOT_EXIST = -4725; //表被删比较危险的错误
constexpr int OB_CHECKSUM_ERROR = -4103; // 数据checksum报错
constexpr int OB_ROWKEY_ORDER_ERROR = -4105; // rowkey乱序
constexpr int OB_PHYSIC_CHECKSUM_ERROR = -4108; // 物理checksum问题,多发现于物理盘有问题
constexpr int OB_CS_OUTOF_DISK_SPACE = -4184; // datafile中没有空闲宏块时报错,表示集群写的数据达到上限。需要扩展存储空间

   3. weak read ts is not ready

      1. 查询对应租户和ls_id的__all_virtual_ls_info结果(收集)
      2. 过滤出weak_read_scn比合并版本(global_broadcast_scn)小的记录,到相应机器上在最新几个observer日志里grep "weak_read_scn+1的值"、"generate_weak_read_timestamp_"以及"log disk space is almost full"(收集)
      3. 如何进一步判断可以咨询日志或事务组同学

   4. memtable can not create dag successfully

      1. 首先查__all_virtual_tablet_meta_table,看下这个分区的compaction_scn是否小于合并版本(global_broadcast_scn),如果小于再进行ii
      2. 查询这台机器这个租户的__all_virtual_dag_scheduler(收集回来)

   5. medium wait for freeze或者major wait for freeze

      1. 查询这台机器这个租户的__all_virtual_dag_scheduler(收集回来)

   6. major not schedule for long time

      1. 查询该分区的__all_virtual_tablet_compaction_info(收集回来)
      2. 到该机器observer.log 查找grep "MediumLoo" | grep T租户id,然后摘出线程号,更换关键词grep "\[线程号]",在最新日志里收集1000行日志

3. 查询GV$OB_COMPACTION_PROGRESS,指定租户和compaction_scn,分别查compaction_scn=当前合并版本global_broadcast_scn以及compaction_scn=上一个合并版本(last_scn)的记录(收集回来)

    1. 如果当前版本的所有记录status都是FINISH,那么查询CDB_OB_LS_LOCATIONS,查到租户ls_id=1的leader机器,到该机器上查找最新的几个rootservice.log,grep "major_merge_progress_checker" | grep Txxxx,将日志收集回来
    2. 根据上一次合并记录中的data_size/(estimated_finish_time-start_time)与当前合并版本记录中unfinished_data_size/当前时间-start_time相比,如果差距过大(当前合并比上一次合并慢很多),那可能可以认为合并存在异常

4. 查询GV$OB_COMPACTION_SUGGESTIONS,把结果收集回来

5. 查询oceanbase.__all_virtual_dag_warning_history,收集status="RETRYED",type like "%MERGE%"的结果。并收集gmt_create附近时间点的observer日志,过滤task_id

4. 如何借助obdiag来快速处理卡合并问题

目前阶段卡合并场景主要用于初步的分析定位及有效信息收集,需要在完成后将收集的有效信息进行打包并上传社区 问答区或 OceanBase 运维进行进一步分析。

obdiag rca run --scene=major_hold 

案例参考:OB社区版4.2.1 1T数据量10G以下数据增量 每日合并时间20小时左右 如何优化

4. 后续场景升级

目前实现仅作为排查的信息收集对于底层的分析未实现,后续将逐步进行深入的根因分析

有兴趣的DBA和开发者可以加入obdiag SIG进行共建开发。

5. 技术支持

排查思路及流程感谢 镜水(胡皓胜) 提供。

附录

•obdiag 下载地址: https://www.oceanbase.com/softwarecenter

•obdiag 官方文档: https://www.oceanbase.com/docs/obdiag-cn

•obdiag github地址: GitHub - oceanbase/obdiag: obdiag (OceanBase Diagnostic Tool) is designed to help OceanBase users quickly gather necessary information and analyze the root cause of the problem.

•obdiag SIG 营地: [obdiag SIG] 诊断工具组 · OceanBase 技术交流

相关文章:

如何用 obdiag 排查 OceanBase数据库的卡合并问题——《OceanBase诊断系列》14

1. 背景 卡合并在OceanBase中是一个复杂的问题,其产生可能源于多种因素。目前,对于卡合并的明确界定尚不存在统一标准,一方面,我们界定超过36小时未完成合并为合并超时,此时RS会记录ERROR日志;另一方面&am…...

hackme靶机渗透流程

一,搭建环境 本次测试使用hackme的靶机 攻击为kali(192.168.30.130)与物理机 二,信息收集 1.确定IP 先确定mac信息,再搭配主机扫描确定靶机的IP地址 00:0C:29:D0:F5:74 确定靶机地址为 192.168.30.133 2.扫描靶机…...

uniapp 常用的地区行业各种多选多选,支持回显,复制粘贴可使用

uniapp 常用的地区行业各种多选多选,支持回显 必须导入uni-popup 弹出层 该组件 1.目前项目开发中使用到这类似挺多的,记录一下,方便以后是使用 2.使用前提,目前不做无限级,只支持二维数组,模板里只循环了两…...

iOS 本地存储地址(位置)

前言: UserDefaults 存在沙盒的 Library --> Preferences--> .plist文件 CoreData 存在沙盒的 Library --> Application Support--> xx.sqlite 一个小型数据库里 (注:Application Support 这个文件夹已开始是没有的,只有当你写了存储代码,运行之后,目录里才会出…...

uni.showLoading 时禁止点击(防止表单重复提交) 小程序调取微信支付

在使用 uni.showLoading 时,如果需要禁用点击事件,可以在调用 uni.showLoading 之前设置全局的触摸事件为禁用状态,然后在 uni.hideLoading 之后再重新启用。 mask 选项是 uni.showLoading 的一个参数,当设置为 true 时,会显示遮罩,此时用户不能点击底层的任何内容。 // …...

OpenClash与Tailscale冲突得问题

1.问题描述:开了openclash之后,tailscale就用不了。tailscale ping XXX.XXX.XXX.XXX 可以成功。但是用cmd的ping就不通。 2.tailscale登录得时候,加上这两个参数:--accept-dnsfalse 和 --netfilter-modeoff 。 示例:t…...

day02|计算机网络重难点之HTTP请求报文和响应报文

day02|计算机网络重难点之HTTP请求报文和响应报文 3.HTTP请求报文和响应报文是怎样的,有哪些常见的字段? 3.HTTP请求报文和响应报文是怎样的,有哪些常见的字段? HTTP请求报文主要是由 请求行、请求头部、空行和请求体 四部分组成…...

Flutter之build 方法详解

前言 我们创建一个Flutter程序,入口文件内容如下 //导包,此行代码作用是导入了 Material UI 组件库。Material (opens new window)是一种标准的移动端和 web 端的视觉设计语言, Flutter默认提供了一套丰富的 Material 风格的 UI 组件。 impo…...

开源呼叫中心系统与商业软件的对比

开源呼叫中心系统与商业软件的对比 作者:FreeIPCC 在当今的商业环境中,呼叫中心系统已成为企业与客户之间沟通的重要桥梁。而在选择呼叫中心系统时,企业面临着两种主要的选择:开源呼叫中心系统和商业软件。这两种系统各有其独特的…...

【人工智能】——matplotlib教程

文章目录 1.matplotlib简介2.基本绘图功能2.1给图形添加辅助功能2.2在一个坐标系中绘制多个图像2.3多个坐标系显示图像 3.常见图像绘制 1.matplotlib简介 matplotlib 是一个用于创建二维图表和数据可视化的 Python 库,它提供了一种类似于 MATLAB 的绘图接口。matplo…...

【c++ gtest】使用谷歌提供的gtest和抖音豆包提供的AI大模型来对代码中的函数进行测试

【c gtest】使用谷歌提供的gtest和抖音豆包提供的AI大模型来对代码中的函数进行测试 下载谷歌提供的c测试库在VsCode中安装抖音AI大模型找到c项目文件夹,使用VsCode和VS进行双开生成gtest代码进行c单例测试 下载谷歌提供的c测试库 在谷歌浏览器搜索github gtest, 第…...

使用Angular构建动态Web应用

💖 博客主页:瑕疵的CSDN主页 💻 Gitee主页:瑕疵的gitee主页 🚀 文章专栏:《热点资讯》 使用Angular构建动态Web应用 1 引言 2 Angular简介 3 安装Angular CLI 4 创建Angular项目 5 设计应用结构 6 创建组件…...

25届电信保研经验贴(自动化所)

个人背景 学校:中九 专业:电子信息工程 加权:92.89 绩点:3.91/4.0 rank:前五学期rank2/95,综合排名rank1(前六学期和综合排名出的晚,实际上只用到了前五学期) 科研…...

大数据-190 Elasticsearch - ELK 日志分析实战 - 配置启动 Filebeat Logstash

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...

不同类型的 LED 驱动电源在检测方法上有哪些不同?-纳米软件

1.传统 LED 驱动电源检测方法: 通常会提取 LED 驱动电源性能指标参数中较为重要的几个因子,如电压稳定性、电流波动范围等。利用诸如 k-means 聚类分析方法,实现对不同厂家、使用寿命不同的 LED 驱动电源快速有效的分类2。这种方法主要是通过…...

android 生成json 文件

在做网络请求的时候需要生成一个如下的json文件: {"messages": [{"role": "user","content": [{"type": "image_base64","image_base64": "pp"},{"type": "text&…...

C++新增的类功能和可变参数模板

C新增的类功能和可变参数模板 新的类功能默认成员函数 可变参数模板模拟实现emplace_back 🌏个人博客主页: 个人主页 新的类功能 默认成员函数 原来C类中,有6个默认成员函数: 构造函数析构函数拷贝构造函数拷贝赋值重载取地址…...

redo log 日志 与 undo log 日志工作原理

目录标题 1. redo log 日志2. undo log 日志3.总结 1. redo log 日志 redo log日志是 MySQL 数据中的重要日志之一,其本质是物理日志,存放于 数据库的数据目录中 ,名称为: ib_logfile 。它的功能主要是用于存放脏数据的日志&…...

go语言结构体与json数据相互转换

本博文简要介绍go语言结构体如何与json格式化字符串相互转换。 文章目录 go语言结构体转换为json数据json数据转换为go结构体 go语言结构体转换为json数据 type Person struct {Name string json:"name"Age int json:"age"Hobbies []strin…...

jenkins 自动化部署Springboot 项目

一、安装docker 1.更新yum命令 yum -y update2.查看机器有残留的docker服务,有就卸载干净 查看docker 服务 rpm -qa |grep docker卸载docker sudo yum remove docker-ce docker-ce-cli containerd.io sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/contai…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...