混合云数据一致性校验脚本实现

设计思路
  1. 核心逻辑:通过计算文件的 MD5 哈希值,对比私有云与公有云文件的完整性
  2. 校验流程
    • 遍历指定目录文件
    • 计算本地文件 MD5
    • 获取云端文件 MD5
    • 对比哈希值差异
  3. 异常处理
    • 文件不存在校验
    • 网络传输中断重试
    • 哈希计算失败处理
Python 实现代码
import hashlib
import os
import boto3  # AWS SDK
from aliyunsdkcore.client import AcsClient  # 阿里云 SDK
from aliyunsdkoss.request.v20190517 import GetObjectMetaRequest

def calculate_md5(file_path):
    """计算本地文件 MD5 哈希值"""
    md5 = hashlib.md5()
    with open(file_path, 'rb') as f:
        for chunk in iter(lambda: f.read(4096), b""):
            md5.update(chunk)
    return md5.hexdigest()

def get_cloud_md5(file_key, cloud_type, config):
    """获取云端文件 MD5 值"""
    if cloud_type == "aws_s3":
        s3 = boto3.client('s3', **config)
        response = s3.head_object(Bucket=config['bucket'], Key=file_key)
        return response['ETag'].strip('"')
    
    elif cloud_type == "aliyun_oss":
        client = AcsClient(config['access_key'], config['secret_key'], config['region'])
        request = GetObjectMetaRequest.GetObjectMetaRequest()
        request.set_Bucket(config['bucket'])
        request.set_Key(file_key)
        response = client.do_action_with_exception(request)
        return response.headers['ETag'].strip('"')
    
    else:
        raise ValueError("Unsupported cloud type")

def verify_consistency(local_dir, cloud_prefix, cloud_type, config):
    """执行一致性校验"""
    results = {"match": [], "mismatch": [], "missing": []}
    
    for root, _, files in os.walk(local_dir):
        for file_name in files:
            local_path = os.path.join(root, file_name)
            relative_path = os.path.relpath(local_path, local_dir)
            cloud_key = f"{cloud_prefix}/{relative_path}".replace("\\", "/")
            
            try:
                # 计算本地哈希
                local_md5 = calculate_md5(local_path)
                
                # 获取云端哈希
                cloud_md5 = get_cloud_md5(cloud_key, cloud_type, config)
                
                # 对比结果
                if local_md5 == cloud_md5:
                    results["match"].append(relative_path)
                else:
                    results["mismatch"].append({
                        "file": relative_path,
                        "local": local_md5,
                        "cloud": cloud_md5
                    })
                    
            except Exception as e:
                results["missing"].append({
                    "file": relative_path,
                    "error": str(e)
                })
    
    return results

# 配置示例(实际使用需替换为真实凭证)
config = {
    "aws_s3": {
        "aws_access_key_id": "YOUR_ACCESS_KEY",
        "aws_secret_access_key": "YOUR_SECRET_KEY",
        "region_name": "us-east-1",
        "bucket": "your-bucket-name"
    },
    "aliyun_oss": {
        "access_key": "YOUR_ACCESS_KEY_ID",
        "secret_key": "YOUR_ACCESS_KEY_SECRET",
        "region": "oss-cn-hangzhou",
        "bucket": "your-bucket-name"
    }
}

# 执行校验
if __name__ == "__main__":
    report = verify_consistency(
        local_dir="/data/local_files",
        cloud_prefix="backup/2023Q4",
        cloud_type="aws_s3",  # 或 "aliyun_oss"
        config=config["aws_s3"]
    )
    
    # 输出结果
    print(f"一致文件: {len(report['match'])}个")
    print(f"不一致文件: {len(report['mismatch'])}个")
    print(f"缺失文件: {len(report['missing'])}个")

关键功能说明
  1. 哈希计算优化

    • 采用分块读取(4096字节/块)避免内存溢出
    • 支持大文件处理(>10GB)
  2. 多云平台适配

    graph LR
    A[本地文件] --> B{云平台}
    B --> C[AWS S3]
    B --> D[阿里云 OSS]
    B --> E[其他云]
    C --> F[ETag 获取]
    D --> G[HeadObject 元数据]
    E --> H[自定义适配]
    

  3. 校验结果处理

    • 返回结构化报告
    • 区分三种状态:
      • 哈希值匹配
      • 哈希值不匹配
      • 云端文件缺失
使用场景示例
# 运行脚本(示例)
python cloud_verify.py \
  --local-dir /mnt/data \
  --cloud-type aliyun_oss \
  --bucket enterprise-backup \
  --prefix prod_db

性能优化建议
  1. 并行处理:使用线程池加速多文件校验
  2. 增量校验:记录历史校验结果,仅检查新文件
  3. 断点续传:保存进度状态,支持意外中断恢复

注意:实际部署时需将凭证存储在安全管理系统(如Vault)中,避免硬编码密钥。对于超大规模文件系统,建议采用分布式校验方案。

更多推荐