【OceanBase诊断调优】 —— DDL时报磁盘不足问题排查

2024-06-13 14:44

本文主要是介绍【OceanBase诊断调优】 —— DDL时报磁盘不足问题排查,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 背景

由于在4.x的部分版本中,我们对于一些ddl操作还存在磁盘空间放大问题,本文主要介绍了这一类问题的排查。

2. 问题排查

2.1 整体排查链路

2.2 问题现象

DDL过程中报磁盘空间不足,需要确认是否符合预期,如果是符合预期,后续运维操作可能要加空间。

2.3 排查流程

我们需要估算DDL过程需要的大概空间,与磁盘剩余空间进行比较,看是否报磁盘不足时符合预期的。首先是估算DDL过程需要的大概空间,我们需要计算每台leader节点上机器上关于这张表的数据量,计算方式如下:

1.获取DDL报错表格的名字和租户的名字,可以作为输入参数

2.根据表格名字和租户名字,获取table_id,tenant_id

select tenant_id from __all_tenant where tenant_name = '租户名';
select table_id from __all_virtual_table where table_name = '表名' and tenant_id = '租户id';

1.根据表名获取ddl源表的空间大小

select svr_ip, svr_port, sum(original_size) as estimated_data_size from __all_virtual_tablet_sstable_macro_info where tablet_id in (select tablet_id from __all_virtual_tablet_to_table_history where table_id = xxx) and (svr_ip, svr_port) in (select svr_ip, svr_port from __all_virtual_ls_meta_table where role = 1) group by svr_ip, svr_port;

1.根据所做的ddl操作,确定最终的ddl表格操作的预估空间,如果是建索引需要给索引名,如果是其他offline ddl操作,那么直接用计算公式(observer_version >= 4.2.3 ? 1.5 *estimated_data_size : 5.5 *estimated_data_size)

1. 根据索引名,查询索引表的id
select table_id from __all_virtual_table_history where tenant_id = 'xxx' and data_table_id = 'xxx' and table_name like '%索引名%';
2. 查询主表所有列的长度之和
select table_id, sum(data_length) from __all_virtual_column_history where tenant_id = 'xxx' and table_id = '主表table_id';
3. 查询索引所有列的长度之和
select table_id, sum(data_length) from __all_virtual_column_history where tenant_id = 'xxx' and table_id = '索引表table_id';
4. 通过索引表的data_length / 主表data_length * estimated_data_size来估算最终空间,记作estimiated_index_size
5. 最终的磁盘空间大小为(observer_version >= 4.2.3 ? 1.5 *estimated_index_size : 5.5 *estimated_index_size)  #4.2.3及之后的版本的放大系数是1.5,之前的为5.5

每台机器上还剩余的可以给DDL流程的磁盘剩余空间

1.获取observer上可用于临时空间部分的磁盘比例,通过查询配置项data_disk_usage_limit_percentage

2.获取observer上总磁盘空间,以及使用的磁盘空间,记作total_size,used_size

获取data_disk_usage_limit_percentage配置: SHOW PARAMETERS LIKE 'data_disk_usage_limit_percentage';获取各个节点的资源:select total_size, used_size from __all_virtual_disk_stat where svr_ip = 'xxx' and svr_port = xxx;

1.observer剩余可用的磁盘空间为total_size * data_disk_usage_limit_percentage - used_size

根据每台observer上的预期需要使用的空间 - 每台observer剩余给DDL使用的空间 是否大于0来判断是否磁盘空间不足。

3. 如何借助obdiag来快速分析DDL时报磁盘不足的问题

3.1 使用示例

目前obdiag支持了增加索引时报磁盘不足问题的场景,目前支持4.2.1.0及之后的版本

obdiag rca run --scene=ddl_disk_full --input_parameters='{"tenant_name":"test1","table_name":"t555","action_type":"add_index","index_name":"k1"}'

input_patameters是一个用于输入不同根因分析场景下需要引入的变量赋值,输入对象的应该为一个json格式的字符串用于解析。

tenant_name:租户名
table_name:表名
action_type:操作类型  注:2.2.0版本开始支持加索引的类型
index_name:索引名

示例:如下为一次调用的结果record的展示

将每一个步骤进行了输出,并且判断了所需的空间大小和当前的大小,最后得出结果,空间足够添加索引。

3.2后续场景升级

在ddl操作中除了添加索引外,还有其他可能的操作会导致报错空间不足,我们会支持进行功能的更新和扩展。

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

3.3 附录

•obdiag 下载地址: OceanBase分布式数据库-海量数据 笔笔算数

•obdiag 官方文档: OceanBase分布式数据库-海量数据 笔笔算数

•obdiag github地址: https://github.com/oceanbase/oceanbase-diagnostic-tool

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

这篇关于【OceanBase诊断调优】 —— DDL时报磁盘不足问题排查的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1057600

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r