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