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

Doris 运维篇:Apache Doris 如何定位处理有问题的Tablet

1928

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

    tablet=33903.2001738452.784560b62ce005b4-03d036e54a7ff7bb, res=-xxx, backend=x.x.x.x
    Doris 1.1.x 之前版本定位方法

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

      show tablet 33903
      -- 这里是为了介绍 tablet 随便从我自己环境拿过来演示使用
      mysql> show tablet 19299;
      +----------------------+----------------+----------------+----------------+-------+---------+-------------+---------+--------+-------+------------------------------------------------------------+
      | DbName | TableName | PartitionName | IndexName | DbId | TableId | PartitionId | IndexId | IsSync | Order | DetailCmd |
      +----------------------+----------------+----------------+----------------+-------+---------+-------------+---------+--------+-------+------------------------------------------------------------+
      | default_cluster:demo | order_analysis | order_analysis | order_analysis | 11015 | 19297 | 19296 | 19298 | true | 0 | SHOW PROC '/dbs/11015/19297/partitions/19296/19298/19299'; |
      +----------------------+----------------+----------------+----------------+-------+---------+-------------+---------+--------+-------+------------------------------------------------------------+
      1 row in set (0.02 sec)

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

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

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

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

          mysql> SHOW PROC '/dbs/11015/19297/partitions/19296/19298/19299'; 
          +-----------+-----------+---------+-------------------+------------------+---------------+------------+----------+----------+--------+-------+--------------+----------------------+---------------------------------------------------------+-----------------------------------------------------------------------------------+
          | ReplicaId | BackendId | Version | LstSuccessVersion | LstFailedVersion | LstFailedTime | SchemaHash | DataSize | RowCount | State | IsBad | VersionCount | PathHash | MetaUrl | CompactionStatus |
          +-----------+-----------+---------+-------------------+------------------+---------------+------------+----------+----------+--------+-------+--------------+----------------------+---------------------------------------------------------+-----------------------------------------------------------------------------------+
          | 19300 | 10002 | 106452 | 106452 | -1 | NULL | 898068185 | 2092 | 2 | NORMAL | false | 6 | -4181701805301204303 | http://172.16.0.13:8040/api/meta/header/19299/898068185 | http://172.16.0.13:8040/api/compaction/show?tablet_id=19299&schema_hash=898068185 |
          +-----------+-----------+---------+-------------------+------------------+---------------+------------+----------+----------+--------+-------+--------------+----------------------+---------------------------------------------------------+-----------------------------------------------------------------------------------+
          1 row in set (0.01 sec)

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

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

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

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

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

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

          1. 如果你数据是多副本,应该所有副本的DataSize,RowCount是理论上完全一样,由于合并速度问题可能会不一致的

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

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

            1. 查看 tablet 所在 partition VisibleVersion

            2.   查看命令:

             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';
                +-------------+----------------+----------------+---------------------+--------+--------------+-------+-----------------+---------+----------------+---------------+---------------------+--------------------------+----------+------------+-------------------------+
                | PartitionId | PartitionName | VisibleVersion | VisibleVersionTime | State | PartitionKey | Range | DistributionKey | Buckets | ReplicationNum | StorageMedium | CooldownTime | LastConsistencyCheckTime | DataSize | IsInMemory | ReplicaAllocation |
                +-------------+----------------+----------------+---------------------+--------+--------------+-------+-----------------+---------+----------------+---------------+---------------------+--------------------------+----------+------------+-------------------------+
                | 19296 | order_analysis | 106717 | 2022-10-13 09:52:02 | NORMAL | | | order_src | 2 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 1.269 GB | false | tag.location.default: 1 |
                +-------------+----------------+----------------+---------------------+--------+--------------+-------+-----------------+---------+----------------+---------------+---------------------+--------------------------+----------+------------+-------------------------+
                1 row in set (0.00 sec)

                这个时候我们通过上面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;
                      +----------------------------------+-----------------------------+------------+
                      | Item | Info | Suggestion |
                      +----------------------------------+-----------------------------+------------+
                      | TabletExist | Yes | |
                      | TabletId | 19299 | |
                      | Database | default_cluster:demo: 11015 | |
                      | Table | order_analysis: 19297 | |
                      | Partition | order_analysis: 19296 | |
                      | MaterializedIndex | order_analysis: 19298 | |
                      | Replicas(ReplicaId -> BackendId) | {"19300":10002} | |
                      | ReplicasNum | OK | |
                      | ReplicaBackendStatus | OK | |
                      | ReplicaVersionStatus | OK | |
                      | ReplicaStatus | OK | |
                      | ReplicaCompactionStatus | OK | |
                      +----------------------------------+-----------------------------+------------+
                      12 rows in set (0.02 sec)

                      结果中的各行信息如下:

                      1. TabletExist:                         Tablet是否存在

                      1. TabletId:                             Tablet ID

                      1. Database:                           Tablet 所属 DB 和其 ID

                      1. Table:                                  Tablet 所属 Table 和其 ID

                      1. Partition:                             Tablet 所属 Partition 和其 ID

                      1. MaterializedIndex:             Tablet 所属物化视图和其 ID

                      1. Replicas(ReplicaId -> BackendId):    Tablet 各副本和其所在 BE。

                      1. ReplicasNum:                         副本数量是否正确。

                      1. ReplicaBackendStatus:                副本所在 BE 节点是否正常。

                      1. ReplicaVersionStatus:                副本的版本号是否正常。

                      1. ReplicaStatus:                       副本状态是否正常。

                      1. ReplicaCompactionStatus:             副本 Compaction 状态是否正常。


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

                      评论