【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 技术交流

相关推荐
阳光九叶草LXGZXJ3 小时前
达梦数据库-报错-15-列【XXX】长度超出定义
linux·运维·数据库·sql·学习
字节渡客3 小时前
Redis键明明过期了,业务还在读到旧数据
数据库·redis·spring
OnlineProxy6 小时前
亚马逊多账号运营:如何在规避“关联封号”风险的同时实现电商规模化扩张
服务器·数据库·redis
辻弋2017 小时前
五年前的旅行视频糊成马赛克?Video2X用Real-ESRGAN逐帧重建细节,但只支持Windows、集显用户建议直接放弃
服务器·数据库·windows·游戏引擎·电脑
可乐鸡翅yeah_8 小时前
业务中 M3U8 水印相关坑,硬水印和动态水印区别
前端·网络·数据库·ffmpeg·m3u8在线
石头麻辣鱼8 小时前
Bamboo 调度系统 OceanBase 适配实战:存储过程迁移踩过的三个大坑
数据库
龙亘川9 小时前
数智驱动民政升级 精准守护民生保障
大数据·数据库·人工智能
念何架构之路9 小时前
zap扩展生态与总结
java·前端·数据库
晚安日记wanna10 小时前
MySQL 回表为什么这么慢?5 种优化手段逐个拆解
数据库·mysql·性能优化
第七页独白10 小时前
汽车零件厂如何通过 QMS 真正落地 IATF 16949——QMS软件系统:品质检验-内审稽核-8d客诉管理:全星质量管理软件系统
java·前端·数据库