使用腾讯云CDM进行数据迁移后的数据校验

1、需求描述

在CDM做数据迁移的过程中,客户基本述求都是要校验下数据是否完整迁移到腾讯云COS上?

常见的校验步骤有:

1)客户本地获取文件数和占用空间

  • 通过find命令获取本地文件数
  • 通过du命令获取占用空间

2)客户获取腾讯云COS上的文件数和占用空间

  • 通过控制台/COS工具/ListObjects接口获取COS上的对象数
  • 通过控制台/COS工具/ListObjects获取COS所有对象的总Size

但在上述的校验步骤中,也会遇到如下的困难:

1)客户操作步骤较多,需要专业的技术能力

2)文件数经常对不上

  • find命令指定参数可能漏掉隐藏文件
  • cp整个目录,或rsync从本地目录拷贝到CDM时会迁移隐藏文件
  • CDM迁移上云,各隐藏文件也会迁移上云

3)占用空间也经常对不上

  • 本地du命令获取的空间大小有放大(Block对齐)
  • COS上对象size精确到Byte
  • 隐藏文件占用COS空间

4)找不到哪些文件不一致

  • 文件数和占用空间对不上时,需要所有文件和对象做一遍对比,来找出不一致的文件

2、解决方案

CDM的迁移步骤一般为如下几步:

1)客户启动收到的CDM设备,并根据指示把设备提供的NFS服务共享目录mount到本地;

2)客户把本地文件或目录拷贝到mountpoint目录;(cp或rsync命令)

3)客户把CDM设备邮递到腾讯云指定园区;(客户期望上传的COS Bucket园区)

4)腾讯侧通过迁移工具把CDM上的文件上传到COS Bucket;(可以指定前缀)

针对CDM的迁移过程,我们提出了如下的数据校验方案:

1)获取客户拷贝到CDM设备的单文件或目录里的所有文件信息,包括文件path和size

  • 提供脚本和指引,获取客户侧所有文件信息,输出到文件里,客户把该文件拷贝到CDM设备
  • 脚本:https://github.com/ictfox/tools/blob/master/cdm-migration-check/dir-files-info.py

2)获取迁移到COS Bucket上的对象信息,包括对象的key和size

3)基于上面两个步骤获取的信息做对比,输出差异

  • 提供脚本获取COS Bucket上对象的key和size,与客户本地文件的信息对比,输出差异
  • 脚本:https://github.com/ictfox/tools/blob/master/cdm-migration-check/cdm-mig-check.py

3、数据校验示例

文件:dir-files-info.py

  • 功能

获取指定目录下所有文件的信息,写入dir-files.info

只支持第一级目录的统计

  • 两种使用方式

1)当前目录执行,获取当前目录下所有文件的信息

以 https://github.com/ictfox/tools 上所有文件为例,本地目录名为ictfox-tools

在本地目录下执行,输出的所有目录和文件以./开头。

代码语言:txt
复制
# python3 cdm-migration-check/dir-files-info.py ./
Write log to file: ./dir-files.info

cat ./dir-files.info

All directory info:
./ftp-to-cos,4,44955
./cdm-migration-check,3,16787

All files info:
./dir-files.info,0
./cos-auth-analyse-py3.py,15087
./cos-auth-analyse-py2.py,14958
./ftp-to-cos/grafana-dashboard.json,12930
./ftp-to-cos/README.md,1488
./ftp-to-cos/ftp-to-cos-agent.py,19395
./ftp-to-cos/ftp-to-cos-master.py,11142
./README.md,8
./cdm-migration-check/dir-files-info.py,1992
./cdm-migration-check/cdm-mig-check.py,5933
./cdm-migration-check/README.md,2862

目录部分各字段含义:目录名称,目录中文件数,总大小
文件部分各字段含义:文件路径,文件大小

2)指定目录执行,获取指定目录下所有文件的信息

同样以 https://github.com/ictfox/tools 上所有文件为例,本地目录名为ictfox-tools

在上层目录执行,指定目录为ictfox-tools,则输出的所有目录和文件以ictfox-tools开头。

代码语言:txt
复制
# python3 ictfox-tools/cdm-migration-check/dir-files-info.py ictfox-tools
Write log to file: ./dir-files.info

cat dir-files.info

All directory info:
ictfox-tools/ftp-to-cos,4,44955
ictfox-tools/cdm-migration-check,3,16787

All files info:
ictfox-tools/dir-files.info,460
ictfox-tools/cos-auth-analyse-py3.py,15087
ictfox-tools/cos-auth-analyse-py2.py,14958
ictfox-tools/ftp-to-cos/grafana-dashboard.json,12930
ictfox-tools/ftp-to-cos/README.md,1488
ictfox-tools/ftp-to-cos/ftp-to-cos-agent.py,19395
ictfox-tools/ftp-to-cos/ftp-to-cos-master.py,11142
ictfox-tools/README.md,8
ictfox-tools/cdm-migration-check/dir-files-info.py,1992
ictfox-tools/cdm-migration-check/cdm-mig-check.py,5933
ictfox-tools/cdm-migration-check/README.md,2862

【备注】若迁移源为指定多个目录,则需要执行多次脚本,获取每个目录的文件信息。

文件:cdm-mig-check.py

  • 功能

对比原始目录文件信息和COS Bucket上的对象信息,输出不一致的文件对比信息。

  • 使用方式

1)全量对比

  • 目录关系对应一致,不指定COS上的prefix
代码语言:txt
复制
# python3 ictfox-tools/cdm-migration-check/cdm-mig-check.py dir-files.info
Write result to file: cdm-mig-check.result

cat cdm-mig-check.result

Diff in top directory:

  • Orig files: 3
  • Migd files: 3

Diff with prefix: ./ftp-to-cos

  • Orig files: 4, size: 44955
  • Migd files: 4, size: 44955

Diff with prefix: ./cdm-migration-check

  • Orig files: 3, size: 16787
  • Migd files: 2, size: 8795
    ./cdm-migration-check/README.md,2862
    ./cdm-migration-check/README.md,8862
    ./cdm-migration-check/dir-files-info.py,1992

上述对比结果中,可以看出来cdm-migration-check目录下的文件数和size对不上:

1」./cdm-migration-check/README.md:文件size两边对不上

2」./cdm-migration-check/dir-files-info.py:迁移后COS上没有该文件

  • CDM上传到COS时指定了prefix,则在上面命令执行时,可以通过参数-p指定prefix
代码语言:txt
复制
# python3 ictfox-tools/cdm-migration-check/cdm-mig-check.py dir-files.info -p backup
Write result to file: cdm-mig-check.result

2)指定目录对比

当仅需要对指定一级目录做迁移校验时,可以通过参数-d指定directory

代码语言:txt
复制
# python3 ictfox-tools/cdm-migration-check/cdm-mig-check.py dir-files.info -d cdm-migration-check -p backup
Write result to file: cdm-mig-check.result
Check files in directory: cdm-migration-check

数据一致时的输出如下:

代码语言:txt
复制
# cat cdm-mig-check.result
Diff with prefix: ./cdm-migration-check
  • Orig files: 3, size: 16787
  • Migd files: 3, size: 16787
  • 数据不一致时的输出如下:

    代码语言:txt
    复制
    # cat cdm-mig-check.result
    Diff with prefix: ./cdm-migration-check
  • Orig files: 3, size: 16787
  • Migd files: 2, size: 8795
    ./cdm-migration-check/README.md,2862
    ./cdm-migration-check/README.md,8862
    ./cdm-migration-check/dir-files-info.py,1992