Tablet 本地调试

    这时候需要将线上的tablet的副本数据拷贝到本地环境进行复现,然后进行问题定位。

    可以通过 BE 日志确认 tablet id,然后通过以下命令获取信息(假设 tablet id 为 10020)。

    获获取 tablet 所在的 DbId/TableId/PartitionId 等信息。

    执行上一步中的 获取 BackendId/SchemHash 等信息。

    1. mysql> SHOW PROC '/dbs/10004/10016/partitions/10015/10017/10020'\G
    2. *************************** 1. row ***************************
    3. ReplicaId: 10021
    4. BackendId: 10003
    5. Version: 3
    6. LstSuccessVersion: 3
    7. LstFailedVersion: -1
    8. LstFailedTime: NULL
    9. SchemaHash: 785778507
    10. LocalDataSize: 780
    11. RemoteDataSize: 0
    12. RowCount: 2
    13. State: NORMAL
    14. IsBad: false
    15. VersionCount: 3
    16. PathHash: 7390150550643804973
    17. MetaUrl: http://192.168.10.1:8040/api/meta/header/10020
    18. CompactionStatus: http://192.168.10.1:8040/api/compaction/show?tablet_id=10020

    创建 tablet 快照并获取建表语句

    1. mysql> admin copy tablet 10020 properties("backend_id" = "10003", "version" = "2")\G
    2. *************************** 1. row ***************************
    3. TabletId: 10020
    4. BackendId: 10003
    5. Ip: 192.168.10.1
    6. Path: /path/to/be/storage/snapshot/20220830101353.2.3600
    7. ExpirationMinutes: 60
    8. CreateTableStmt: CREATE TABLE `tbl1` (
    9. `k1` int(11) NULL,
    10. DUPLICATE KEY(`k1`, `k2`)
    11. DISTRIBUTED BY HASH(k1) BUCKETS 1
    12. PROPERTIES (
    13. "replication_num" = "1",
    14. "version_info" = "2"
    15. );

    admin copy tablet 命令可以为指定的 tablet 生成对应副本和版本的快照文件。快照文件存储在 Ip 字段所示节点的 Path 目录下。

    该目下会有一个 tablet id 命名的目录,将这个目录整体打包后备用。(注意,该目录最多保留 60 分钟,之后会自动删除)。

    该命令还会同时生成这个 tablet 对应的建表语句。注意,这个建表语句并不是原始的建表语句,他的分桶数和副本数都是1,并且指定了 versionInfo 字段。该建表语句是用于之后在本地加载 tablet 时使用的。

    至此,我们已经获取到所有必要的信息,清单如下:

    1. 打包好的 tablet 数据,如 10020.tar.gz。
    2. 建表语句。

    2. 本地加载 Tablet

    1. 在本地部署一个单节点的Doris集群(1FE、1BE),部署版本和线上集群保持一致。如线上部署的版本是DORIS-1.1.1, 本地环境也同样部署DORIS-1.1.1的版本。

    2. 建表

      使用上一步中得到的建表语句,在本地环境中创建一张表。

    3. 获取新建的表的 tablet 的信息

      因为新建表的分桶数和副本数都为1,所以只会有一个一副本的 tablet:

      1. mysql> show tablets from tbl1\G
      2. *************************** 1. row ***************************
      3. TabletId: 10017
      4. ReplicaId: 10018
      5. BackendId: 10003
      6. SchemaHash: 44622287
      7. Version: 1
      8. LstSuccessVersion: 1
      9. LstFailedVersion: -1
      10. LstFailedTime: NULL
      11. LocalDataSize: 0
      12. RemoteDataSize: 0
      13. RowCount: 0
      14. State: NORMAL
      15. LstConsistencyCheckTime: NULL
      16. CheckVersion: -1
      17. VersionCount: -1
      18. CompactionStatus: http://192.168.10.1:8040/api/compaction/show?tablet_id=10017
      1. mysql> show tablet 10017\G
      2. *************************** 1. row ***************************
      3. DbName: default_cluster:db1
      4. TableName: tbl1
      5. PartitionName: tbl1
      6. IndexName: tbl1
      7. DbId: 10004
      8. TableId: 10015
      9. PartitionId: 10014
      10. IndexId: 10016
      11. IsSync: true
      12. Order: 0
      13. DetailCmd: SHOW PROC '/dbs/10004/10015/partitions/10014/10016/10017';

      这里我们要记录如下信息:

      • TableId
      • PartitionId
      • TabletId
      • SchemaHash

      同时,我们还需要到调试环境BE节点的数据目录下,确认新的 tablet 所在的 shard id:

      这个命令会进入 10017 这个 tablet 所在目录并展示路径。这里我们会看到类似如下的路径:

      1. /path/to/storage/data/0/10017

      其中 0 既是 shard id。

    4. 解压第一步中获取到的 tablet 数据包。编辑器打开其中的 10017.hdr.json 文件,并修改以下字段为上一步中获取到的信息:

      1. "table_id":10015
      2. "partition_id":10014
      3. "tablet_id":10017
      4. "schema_hash":44622287
      5. "shard_id":0
    5. 加载新 tablet

      首先,停止调试环境的 BE 进程(./bin/stop_be.sh)。然后将 10017.hdr.json 文件同级目录所在的所有 .dat 文件,拷贝到 /path/to/storage/data/0/10017/44622287 目录下。这个目录既是在第3步中,我们获取到的调试环境tablet所在目录。10017/44622287 分别是 tablet id 和 schema hash。

      通过 meta_tool 工具删除原来的 tablet meta。该工具位于 be/lib 目录下。

      其中 /path/to/storage 为 BE 的数据根目录。如删除成功,会出现 delete successfully 日志。

      通过 meta_tool 工具加载新的 tablet meta。

      1. ./lib/meta_tool --root_path=/path/to/storage --operation=load_meta --json_meta_path=/path/to/10017.hdr.json

      如加载成功,会出现 load successfully 日志。

    6. 验证

      重新启动调试环境的 BE 进程(./bin/start_be.sh)。对表进行查询,如果正确,则可以查询出加载的 tablet的数据,或复现线上问题。