Apache Doris 如何定位处理问题的Tablet

我们在使用Doris的时候,有时候会遇到用户在查询的时候出现失败,出现类似下面这种错误:

tablet=33903.2001738452.784560b62ce005b4-03d036e54a7ff7bb, res=-xxx, backend=x.x.x.x

Doris 1.1.x 之前版本定位方法

这个时候我们都知道通过下面的命令来去查看这个tablet 情况

show tablet 33903

然后再返回的信息里执行最后有一列的命令

SHOW PROC '/dbs/11015/19297/partitions/19296/19298/19299';

这个时候我们可以看到这个tablet 所有的副本

这里只是演示,我的环境是单副本,实际情况下是多副本(默认三副本)

mysql> SHOW PROC '/dbs/11015/19297/partitions/19296/19298/19299'; 

好,到这里我们看到这出问题这个tablet 所有的副本,在上面这个查询返回结果里我们关注几个字段

  1. State :tablet 副本状态,NORMAL表示副本是正常的

  2. IsBad :副本是否损坏,如果是true,说明这个副本存在问题

  3. VersionCount :tablet 数据的版本数量,这个如果太多,说明compaction可能失败了,或者是compaction速度跟不上,需要去查日志,监控等,分析原因

  4. LstFailedVersion :这里如果值大于0说明这个副本是有问题的,正常情况下这个值只能是-1

  5. LstFailedTime :正常这个值是null,如果有值说明有问题,值对应的是最后失败的时间点

  6. 如果你数据是多副本,应该所有副本的DataSize,RowCount是完全一样的

  7. Version :这个是 tablet 副本的版本号,要和tablet所有的partition里的VisibleVersion 完全一致,否则说明这个tablet副本也是有问题的,正常情况下tablet所有副本Version都是和tablet 所在partition里的VisibleVersion完全一致。同时这个字段和LstSuccessVersion也是完全一致的

  8. 我们怎么去查看tablet 所在 Partition的Version

  9. 查看 tablet 所在 partition VisibleVersion

查看命令:

 SHOW PROC '/dbs/<db id>/<table id>/partitions';

这个命令会列出表的所有分区

在我们show tablet tablet_id 的时候返回的信息里最后一列,我们通过这一列可以知道我们要找的tablet 对应的 partition id

SHOW PROC '/dbs/11015/19297/partitions/19296/19298/19299';

这样我们就可以在下面这个列表里找到我们这个tablet 的 partition VisibleVersion

mysql> SHOW PROC '/dbs/11015/19297/partitions';

这个时候我们通过上面1-8条说明里讲解的内容就可以定位错误的 tablet 副本

  • 如果只是其中一个副本损坏,我们可以通过下面命令将这个副本设置成 bad ,删除副本,让其自动恢复

ADMIN SET REPLICA STATUS PROPERTIES(“tablet_id” = “10001”, “backend_id” = “20001”, “status” = “bad”);

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

Doris 1.1.x 之前版本定位方法

Doris 在 1.1.x 之后的版本里提供了一个更简单检查 tablet 副本状态的工具:

 ADMIN DIAGNOSE TABLET tblet_id

我们可以通过上面的命令去检查tablet 是否正常

该语句用于诊断指定 tablet。结果中将显示这个 tablet 的信息和一些潜在的问题。

示例:

mysql>  admin diagnose tablet 19299;

结果中的各行信息如下:

  1. TabletExist: Tablet是否存在
  2. TabletId: Tablet ID
  3. Database: Tablet 所属 DB 和其 ID
  4. Table: Tablet 所属 Table 和其 ID
  5. Partition: Tablet 所属 Partition 和其 ID
  6. MaterializedIndex: Tablet 所属物化视图和其 ID
  7. Replicas(ReplicaId → BackendId): Tablet 各副本和其所在 BE。
  8. ReplicasNum: 副本数量是否正确。
  9. ReplicaBackendStatus: 副本所在 BE 节点是否正常。
  10. ReplicaVersionStatus: 副本的版本号是否正常。
  11. ReplicaStatus: 副本状态是否正常。
  12. ReplicaCompactionStatus: 副本 Compaction 状态是否正常。