我们在使用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 所有的副本,在上面这个查询返回结果里我们关注几个字段
State :tablet 副本状态,NORMAL表示副本是正常的
IsBad :副本是否损坏,如果是true,说明这个副本存在问题
VersionCount :tablet 数据的版本数量,这个如果太多,说明compaction可能失败了,或者是compaction速度跟不上,需要去查日志,监控等,分析原因
LstFailedVersion :这里如果值大于0说明这个副本是有问题的,正常情况下这个值只能是-1
LstFailedTime :正常这个值是null,如果有值说明有问题,值对应的是最后失败的时间点
如果你数据是多副本,应该所有副本的DataSize,RowCount是完全一样的
Version :这个是 tablet 副本的版本号,要和tablet所有的partition里的VisibleVersion 完全一致,否则说明这个tablet副本也是有问题的,正常情况下tablet所有副本Version都是和tablet 所在partition里的
VisibleVersion完全一致。同时这个字段和LstSuccessVersion也是完全一致的
我们怎么去查看tablet 所在 Partition的Version
查看 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 状态是否正常。