Tablet 本地调试
Doris 线上运行过程中,因为各种原因,可能出现各种各样的 bug。例如:副本不一致,数据存在版本 diff 等。
这时候需要将线上的 tablet 的副本数据拷贝到本地环境进行复现,然后进行问题定位。
1. 获取有问题的 Tablet 的信息
可以通过 BE 日志确认 tablet id,然后通过以下命令获取信息(假设 tablet id 为 10020)。
获取 tablet 所在的 DbId/TableId/PartitionId 等信息。
mysql> show tablet 10020\G
*************************** 1. row ***************************
       DbName: default_cluster:db1
    TableName: tbl1
PartitionName: tbl1
    IndexName: tbl1
         DbId: 10004
      TableId: 10016
  PartitionId: 10015
      IndexId: 10017
       IsSync: true
        Order: 1
    DetailCmd: SHOW PROC '/dbs/10004/10016/partitions/10015/10017/10020';
执行上一步中的 DetailCmd 获取 BackendId/SchemaHash 等信息。
mysql>  SHOW PROC '/dbs/10004/10016/partitions/10015/10017/10020'\G
*************************** 1. row ***************************
        ReplicaId: 10021
        BackendId: 10003
          Version: 3
LstSuccessVersion: 3
 LstFailedVersion: -1
    LstFailedTime: NULL
       SchemaHash: 785778507
    LocalDataSize: 780
   RemoteDataSize: 0
         RowCount: 2
            State: NORMAL
            IsBad: false
     VersionCount: 3
         PathHash: 7390150550643804973
          MetaUrl: http://192.168.10.1:8040/api/meta/header/10020
 CompactionStatus: http://192.168.10.1:8040/api/compaction/show?tablet_id=10020
创建 tablet 快照并获取建表语句
mysql> admin copy tablet 10020 properties("backend_id" = "10003", "version" = "2")\G
*************************** 1. row ***************************
         TabletId: 10020
        BackendId: 10003
               Ip: 192.168.10.1
             Path: /path/to/be/storage/snapshot/20220830101353.2.3600
ExpirationMinutes: 60
  CreateTableStmt: CREATE TABLE `tbl1` (
  `k1` int(11) NULL,
  `k2` int(11) NULL
) ENGINE=OLAP
DUPLICATE KEY(`k1`, `k2`)
DISTRIBUTED BY HASH(k1) BUCKETS 1
PROPERTIES (
"replication_num" = "1",
"version_info" = "2"
);
admin copy tablet 命令可以为指定的 tablet 生成对应副本和版本的快照文件。快照文件存储在 Ip 字段所示节点的 Path 目录下。
该目下会有一个 tablet id 命名的目录,将这个目录整体打包后备用。(注意,该目录最多保留 60 分钟,之后会自动删除)。
cd /path/to/be/storage/snapshot/20220830101353.2.3600
tar czf 10020.tar.gz 10020/
该命令还会同时生成这个 tablet 对应的建表语句。注意,这个建表语句并不是原始的建表语句,他的分桶数和副本数都是 1,并且指定了 versionInfo 字段。该建表语句是用于之后在本地加载 tablet 时使用的。
至此,我们已经获取到所有必要的信息,清单如下:
- 
打包好的 tablet 数据,如 10020.tar.gz。 
- 
建表语句。 
2. 本地加载 Tablet
- 
搭建本地调试环境 在本地部署一个单节点的 Doris 集群(1FE、1BE),部署版本和线上集群保持一致。如线上部署的版本是 DORIS-1.1.1, 本地环境也同样部署 DORIS-1.1.1 的版本。 
- 
建表 使用上一步中得到的建表语句,在本地环境中创建一张表。 
- 
获取新建的表的 tablet 的信息 因为新建表的分桶数和副本数都为 1,所以只会有一个一副本的 tablet: mysql> show tablets from tbl1\G
 *************************** 1. row ***************************
 TabletId: 10017
 ReplicaId: 10018
 BackendId: 10003
 SchemaHash: 44622287
 Version: 1
 LstSuccessVersion: 1
 LstFailedVersion: -1
 LstFailedTime: NULL
 LocalDataSize: 0
 RemoteDataSize: 0
 RowCount: 0
 State: NORMAL
 LstConsistencyCheckTime: NULL
 CheckVersion: -1
 VersionCount: -1
 PathHash: 7390150550643804973
 MetaUrl: http://192.168.10.1:8040/api/meta/header/10017
 CompactionStatus: http://192.168.10.1:8040/api/compaction/show?tablet_id=10017mysql> show tablet 10017\G
 *************************** 1. row ***************************
 DbName: default_cluster:db1
 TableName: tbl1
 PartitionName: tbl1
 IndexName: tbl1
 DbId: 10004
 TableId: 10015
 PartitionId: 10014
 IndexId: 10016
 IsSync: true
 Order: 0
 DetailCmd: SHOW PROC '/dbs/10004/10015/partitions/10014/10016/10017';这里我们要记录如下信息: - 
TableId 
- 
PartitionId 
- 
TabletId 
- 
SchemaHash 
 同时,我们还需要到调试环境 BE 节点的数据目录下,确认新的 tablet 所在的 shard id: cd /path/to/storage/data/*/10017 && pwd这个命令会进入 10017 这个 tablet 所在目录并展示路径。这里我们会看到类似如下的路径: /path/to/storage/data/0/10017其中 0既是 shard id。
- 
- 
修改 Tablet 数据 解压第一步中获取到的 tablet 数据包。编辑器打开其中的 10017.hdr.json 文件,并修改以下字段为上一步中获取到的信息: "table_id":10015
 "partition_id":10014
 "tablet_id":10017
 "schema_hash":44622287
 "shard_id":0
- 
加载新 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目录下。./lib/meta_tool --root_path=/path/to/storage --operation=delete_meta --tablet_id=10017 --schema_hash=44622287其中 /path/to/storage为 BE 的数据根目录。如删除成功,会出现 delete successfully 日志。通过 meta_tool工具加载新的 tablet meta。./lib/meta_tool --root_path=/path/to/storage --operation=load_meta --json_meta_path=/path/to/10017.hdr.json如加载成功,会出现 load successfully 日志。 
- 
验证 重新启动调试环境的 BE 进程 (./bin/start_be.sh)。对表进行查询,如果正确,则可以查询出加载的 tablet 的数据,或复现线上问题。