暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【Apache Doris】数据副本问题排查指南

数据微光 2025-01-03
1518

  导读   本文本文主要分享Doris中数据副本异常的问题现象、问题定位以及如何处理此类问题。

全文目录:

  1. 问题现象

  2. 问题定位

  3. 问题处理


一、问题现象

1. 问题日志

查询报错

1. [INTERNAL_ERROR]Failed to initialize storage reader, tablet={tablet_id}.xxx.xxx
2. Failed to commit txn 17407337, cause tablet 13267831 succ replica num 1 < quorum replica num 2. table 13267829, partition 13267828, this tablet detail: 1 replicas final succ:
3. [INTERNAL_ERROR]fail to find path in version_graph. spec_version: 0-1376775

2. 问题说明

查询时,FE让BE返回spec_version范围的数据,但是BE缺部分version了,就会报这个错误。

3. 问题原因

迁移副本过程可能丢version,在2.0.3修复了,或者在数据导入过程中be宕机。 

注意: 如果版本是2.0.1及以前,且它的所有副本last failed version > 0,通常需要重新建表进行导数。

二、问题定位

如上图所示,查询报错的 tablet_id 是 606202, BE ip是 10.xxx, BE 需要包含version 区间 [0 - 35]。 

当确定异常tablet_id时,参考如下步骤先进行问题信息收集:

1. 获取异常tablet的详细信息

-- 这里是606202,拿到detail cmd
show tablet {tablet_id} 

2. 执行DetailCmd

SHOW PROC ' /dbs/10113/591325/partitions/606195/591326/606202";

找出该BE所在的副本(CompactionStatus url中包含有该BE的ip),如果BackendId等字段显示为-1,说明该tabelt可能已经自动修复或迁移了。

3. 执行curl<步骤2的CompactionStatus url>(或在浏览器打开该url)

curl  http://10.xxx:8040/api/compaction/show?tablet_id=606202

查看该副本的rowset 和 missing_rowset,重点看rowset 的最大版本(这里是34)和 missing_rowsets。从上图可以看出该副本的rowset 为 0 ~ 34, 且中间不缺version(missing_rowsets为空)。而查询语句中是 special  version 是 [0, 35], 但该BE不含version 35。所以需要给该BE补上version 35。 

注意:这里的special version实际就是partition的visible version。它也可以通过如下指令查看。

show partitions from <table-name xxx> where PartitionName = '<partition name xxx>' 
三、问题处理

临时规避方案

执行下面命令可恢复查询,如果需要全局设置,可以加上 global 关键字

set skip_missing_version=true;
set skip_bad_tablet=true;

1. 确认是否自动修复

由于doris内部会自动做数据均衡和修复,所以当出现数据副本异常时,先确认异常数据副本能否自动修复:

如果是多副本,查看是否存在健康副本。健康副本是指副本version >= special version && last failed version = -1 && isBad = false, 且curl 它的 CompactionStatus, missing rowsets 为空。 

如果存在这样的副本,把查询报错的副本set bad,如上图所示BackendId为10003上版本远落后于其他两个副本的version,可以通过设置为bad来自动修复。

ADMIN SET REPLICA STATUS PROPERTIES("tablet_id" = "7552021""backend_id" = "10003""status" = "bad");

等待一会(可能需要一两分钟),再执行步骤2中的DetailCmd,如果副本都健康了:

version >= special version && last failed version = -1 && isBad = false

且curl它的CompactionStatus,  missing rowsets为空,说明修补OK了。且执行select count (*) from table_xx 是否OK。 

如果没问题,就自动修复完成了,不用往下看。如果还是有问题,接着往下看。

2. 重新导数手动修复

  • 如果是多个副本都损坏,并且是分区表的情况下,可以删除这个分区,然后手动重建这个分区,重新导入数据即可。

  • 如果是多个副本都损坏,并且是非分区表的情况下,只能删除这个表重新导入数据。

3. 填充空副本进行修复

注意:以上两个方法可以恢复丢失的数据,而填充空副本方法,是插入若干个空rowset,它能恢复读写。但如果丢失的rowset是包含数据的,这种方法实质是丢数据的。

空副本修复方式如下:

1️⃣ 自动修复
可以先通过 SHOW FRONTEND CONFIG;
命令查看当前版本是否支持该参数。

ADMIN SET FRONTEND CONFIG ("recover_with_empty_tablet" = "true");

2️⃣ 手动修复

curl -X POST "http://10.151.2.29:8040/api/pad_rowset?tablet_id=606202&start_version=35&end_version=35"

  • 异常tablet_id

  • start_version 起始版本

  • end_version 终止版本

该功能用于使用一个空的 rowset 填充损坏的副本。这个例子中修补的url中 start_version = 35,  end_version = 35。 

这个例子只是缺一个rowset, 实际中可能缺多个(missing rowset,最大version + 1 ~ special version),例如查询中的max_version是9527,但是步骤3查询中数据的最后一行rowsets是[45-9520] 1 DATA ...,需要修补的就是9521~9527。 

curl -X POST "http://10.151.2.29:8040/api/pad_rowset?tablet_id=606202&start_version=9521&end_version=9527"

修补完之后,再执行下show tablet xxx,该副本last fail version 是否等于 -1,如果它的version都补上了,但是last fail version = version + 1, 还需要手工执行把last fail version 改成 -1:

ADMIN SET REPLICA VERSION PROPERTIES("tablet_id" = "10003""backend_id" = "10001""last_failed_version" = "-1");  

低版本的doris可能不含这个SQL, 如果不支持这个SQL且是单副本的,通常需要重新建表进行导数。 

如果没问题,使用:

select count(*) from {table};

查看是否可读,可读则说明数据副本问题已处理。

FAQ

如果有用户不小心把end_version调大了一轮,spec_version比max_version小,查询可能会出现如下报错

[CANCELLED]missed versions is empty, spec_version 307566, max_version 307567 tablet id 11423

可以通过指定副本为bad,或者往这个分区导入数据,如果还不行的话可以使用ADMIN-SET-PARTITION-VERSION来指定version。先通过下面这个命令来查看对应分区的PartitionIdVisibleVersion版本是多少

show partitions from <table-name xxx> 

然后使用ADMIN-SET-PARTITION-VERSION来指定version为当前的max_version

ADMIN SET TABLE tbl1 PARTITION VERSION PROPERTIES("partition_id" = "1769152""visible_version" = "307567"); 

 

数据微光 专注分享 Apache Doris 的最佳实践问题解决技巧学习资源实用案例,致力于为开发者和技术爱好者提供高质量内容支持和持续学习动力。

📚 特别福利 | 数据微光知识库
内含Apache Doris丰富的 学习资料、实战课程、白皮书、行业报告、技术指南,帮助快速掌握数据库核心技能!

📘 领取方式:
关注 “数据微光” 公众号 扫描下方二维码,备注【Doris】即可免费获取!
💻 让我们携手点亮技术微光,共同探索 Doris 的无限可能!

 

往期推荐

「FE 倒下了,但我挺住了」—— Doris FE 挂机应急指南

成为 Apache 顶级项目贡献者之路:Apache Doris 的语法迁移攻略







关于社区





     Apache Doris

Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极易易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发发点查询场景,也能支持高吞吐的复杂分析场景。

如果您对 Apache Doris 感兴趣,可以通过以下入口访问官方网站、社区论坛、GitHub 和 dev 邮件组:

  • 📒 官方文档: https://doris.apache.org

  • 💬 社区论坛: https://ask.selectdb.com

  • 📂 GitHub: https://github.com/apache/doris

  • 📧 dev 邮件组: dev@doris.apache.org

可以加 作者微信 (hhj_0530) 直接进 Doris 官方社区群。

PowerData

PowerData 是由一群数据从业人员,因为热爱凝聚在一起,以开源精神为基础,组成的数据开源社区。

社区群内会定期组织模拟面试、线上分享、行业研讨、线下 Meetup、城市聚会、求职内推等活动。同时,在社区群内您可以进行技术讨论、问题请教,结识更多志同道合的数据朋友。

社区整理了一份每日一题汇总及社区分享 PPT,内容涵盖大数据组件、编程语言、数据结构与算法、企业真实面试题等各个领域,帮助您提升自我,成功上岸。

可以加 作者微信 (hhj_0530) 直接进 PowerData 官方社区群。   


文章转载自数据微光,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论