场景痛点分析
在DevOps实践中,我们每周都需要将生产环境的代码和数据文件同步到测试服务器。这个过程存在两个典型问题:
- 大文件传输耗时可能超过数小时
- 缺乏自动化验证机制,人工核对效率低下
核心解决方案
推荐采用哈希校验+差异对比的组合方案:
# 生成源目录的校验文件
find /prod_dir -type f -exec md5sum {} + | sort > prod_checksum.md5
# 在目标服务器执行对比
rsync -n -icv --checksum /prod_dir/ user@test_server:/test_dir/ | grep -v "\.\/"
Python自动化实现
以下是跨服务器校验的完整示例:
import paramiko
import hashlib
from pathlib import Path
def generate_checksum(host, path):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username='your_username')
stdin, stdout, stderr = ssh.exec_command(f"find {path} -type f -exec md5sum {{}} + | sort")
return stdout.read().decode().splitlines()
def compare_dirs(prod_host, test_host, prod_path, test_path):
prod_checksums = generate_checksum(prod_host, prod_path)
test_checksums = generate_checksum(test_host, test_path)
diff = set(prod_checksums) ^ set(test_checksums)
if diff:
print(f"发现{len(diff)}个不一致文件:")
for item in diff:
print(item.split()[-1])
else:
print("目录完全一致")
# 使用示例
compare_dirs('prod.server.com', 'test.server.com', '/data/prod', '/data/test')
进阶方案:Rsync校验模式
对于大规模文件同步,推荐使用rsync的校验模式:
# 校验模式(不实际传输文件)
rsync -avn --checksum --itemize-changes /source/ user@remote:/destination/
# 输出示例解读
# >f..t...... file.txt # 表示文件内容不同
# >f.st...... file.txt # 表示文件大小和时间戳不同
注意事项
- 大目录校验建议在业务低峰期进行
- 对于超10万文件量的目录,建议分批次校验
- Windows环境可使用Robocopy /MIR配合校验