0


doris的tablet副本修复相关情况总结

在使用doris的时候,由于一些极端情况的出现或者doris本身bug的原因,会出现一些tablet损坏的情况,导致数据的插入和查询受到影响,下面总结一下doris副本出现损坏时进行修复的一些情况。

一、多副本情况下个别副本损坏

在大多数情况下,如果tablet配置的是多个副本,如果某个副本发生损坏,Doris 都可以自动的进行副本修复和集群均衡,但在某些情况下,Doris 可能无法自动检测某些损坏的副本,从而导致查询或导入在损坏的副本上频繁报错。此时我们需要手动删除已损坏的副本。该方法可以适用于:删除版本数过高导致 -235 错误的副本、删除文件已损坏的副本等等。

首先,找到副本对应的 tablet id,假设为: 11032, 执行命令: show tablet 11032 ,然后再执行返回结果中DetailCmd一列的 show proc语句来查看副本的详情,如下图所示:

然后通过执行show proc语句返回的结果中,查看要修复的副本所在的BackendId,如下图所示:

此时,就可以得到此副本所在的tabletId是11302,backendId是10002,然后执行一下命令将副本标记为bad

ADMIN SET REPLICA STATUS PROPERTIES("tablet_id" = "11032", "backend_id" = "10002", "status" = "bad");

**此时,再次通过

show proc

语句可以看到对应的副本的

IsBad

列值为

true,如下图所示:

**

这样,被标记为

bad

的副本不会再参与导入和查询。同时副本修复逻辑会自动补充一个新的副本。

二、多副本或者1个副本情况下所有副本都损坏

如果tablet只配置了1个副本,或者某些极端特殊情况下,如代码BUG,突然停电,人为误操作等,可能导致部分tablet的全部副本都丢失,这种情况下,数据已经实质性的丢失。一般的表现情况就是在查询和导入数据时报错:

查询报错: ERROR 1064 (HY000): errCode = 2, detailMessage = Failed to get scan range, no queryable replica found in tablet: 11032

导入数据报错: errCode=2,detailMessage= Failed to commit txn 115471185 Tablet [11032] success replica num 0 is less than quorum replica num 1 while error backends

查询fe的日志,可以看到类似的日志:backend [10002] invalid situation. tablet[11032] has few replica[1], replica num setting is [3]

这个日志表示,Tablet 11032的所有副本已损坏或丢失。

但是在某些场景下,业务依然希望能够在即使有数据丢失的情况下,保证查询正常不报错,此时,我们可以通过使用空白Tablet填充丢失副本的功能,来保证查询能够正常执行。

注:该操作仅用于规避查询因无法找到可查询副本导致报错的问题,无法恢复已经实质性丢失的数据。

2.1 使用空白副本填补缺失副本

当确认数据已经无法恢复后,可以通过执行以下命令,生成空白副本。

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

设置完成几分钟后,应该会在 Master FE 日志 fe.log 中看到如下日志:

tablet 11032 has only one replica 11033 on backend 10002 and it is lost. create an empty replica to recover it
该日志表示系统已经创建了一个空白 Tablet 用于填补缺失副本。

此时,通过查询来判断是否已经修复成功,如果能正常查询,则说明修复成功,通过以下命令关闭 recover_with_empty_tablet 参数:

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

如果修复未成功,则需要借助Tablet 元数据管理工具 meta_tool 来删除tablet的元数据。

2.2 使用meta_tool 删除tablet副本的元数据

meta_tool 工具存放在 BE 的 lib/ 目录下,用于离线的各类元数据管理操作,使用前必须先停止BE进程!!!

还是以tablet 11032为例,说明删除的具体步骤。

还是首先执行 show tablet 11032 ,然后再执行返回结果中DetailCmd一列的 show proc语句来查看副本的详情,如下图所示:

此时需要记录一下各个副本所对应的BackendId,SchemaHash,PathHash 这三列的值。

以ReplicaId为11033的副本为例,其BackendId为10002,SchemaHash为566420086,PathHash为4267264358573635410

然后执行命令: SHOW PROC '/backends'; 来查看backendId为10002的服务器ip地址,如下图所示:

然后再执行命令: SHOW PROC '/backends/10002'; 来查询此backend所配置的存储信息,并找到PathHash为4267264358573635410所对应的数据目录RootPath,如下图所示:

此时,就可得到副本11033的信息tabletId为 11032,SchemaHash为566420086,rootPath为/bigdata/bigdata1/dorisData.HDD

然后,登录到BackendId为10002的服务器,切换到be的目录,然后执行命令:**./bin/stop_be.sh ** 停止be进程。

然后执行元数据删除命令: ./lib/meta_tool --operation=delete_meta --root_path=/bigdata/bigdata1/dorisData.HDD --tablet_id=11032 --schema_hash=566420086

命令成功执行后,再执行命令:** ./bin/start_be.sh --daemon **启动be即可。

然后,按照删除11033这个副本同样的步骤去删除tablet下剩下的副本即可。

标签: 大数据

本文转载自: https://blog.csdn.net/ppfreedom/article/details/125021626
版权归原作者 培培freedom 所有, 如有侵权,请联系我们删除。

“doris的tablet副本修复相关情况总结”的评论:

还没有评论