【最佳实践】数据副本问题排查指南

Viewed 529

一、问题现象

  1. 问题日志:查询报错
Failed to initialize storage reader, tablet={tablet_id}.xxx.xxx
  1. 问题说明:查询时,FE让BE返回spec_version范围的数据,但是BE缺部分version了,就会报这个错误;
  2. 问题原因:迁移副本过程可能丢version,在2.0.3修复了,或者在数据导入过程中be宕机。

注意:
如果版本是2.0.1及以前,且它的所有副本last failed version > 0,那下面的都没救了,只能删了重导。

二、问题定位

image.png
上面查询报错的tablet 是 606202, BE ip是 10.xxx, BE 需要包含version 区间 [0 - 35]。操作步骤:
image.png

  1. Show tablet xxxx (这里是606202), 拿到detail cmd;
Show tablet 606202;
  1. 执行detail cmd的输出,找出该BE 所在的副本(CompactionStatus url中包含有该BE的ip;
SHOW PROC ' /dbs/10113/591325/partitions/606195/591326/606202";
  1. 执行curl <步骤2的CompactionStatu url> (或者在浏览器打开该链接)
curl   http://10.151.7.29:8040/api/compaction/show?tablet_id=606202

image.png
查看该副本的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>'

三、问题处理

1. 先确认能否自动修复:

image.png
如果是多副本,查看是否存在健康副本。健康副本是指 副本version >= special version && last failed version = -1 && isBad = false, 且curl 它的 compact status, missing rowsets 为空。 如果存在这样的副本,把查询报错的副本set bad,如上图所示BackendId为10003上版本远落后于其他两个副本的version,可以通过设置为bad来自动修复。

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

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

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

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

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

2. 重新导数

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

3. 填充空副本的方法:

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

操作:

curl -X POST "http://10.151.2.29:8040/api/pad_rowset?tablet_id=606202&start_version=35&end_version=35"
  • tablet_id table 的 id
  • start_version 起始版本
  • end_version 终止版本

该功能用于使用一个空的 rowset 填充损坏的副本。这个例子中修补的url中 start_version = 35, end_version = 35。 这个例子只是缺一个rowset, 实际中可能缺多个(missing rowset、最大version + 1 ~ special version ),缺多少个rowset,就调用多少次修补的方法。修补完之后,再执行下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_xx 查看是否可读,可读则正常了。

1 Answers

数据副本问题优先看这个文档,解决不了官方人员辅助解决!