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
。
在本地目录下执行,输出的所有目录和文件以./
开头。
# 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
开头。
# 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
# 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
# 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
# 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