优化S3大文件上传Cron任务:自动适配预期文件大小方案
优化S3大文件流式上传的方案
问题根源
你遇到的BrokenPipeError是因为用mongodump直接管道到aws s3 cp时,CLI无法提前获取备份流的总大小。当流式数据超过50GB时,S3的分块上传机制必须依赖--expected-size参数规划分块,固定设置100GB的话,一旦备份文件超过这个值就会失效。
优化方案
方案1:先落地本地文件再上传(适合有充足磁盘空间的场景)
先把备份保存到本地,获取准确文件大小后再上传,这样无需手动指定--expected-size,CLI会自动读取本地文件的大小:
# 定义本地临时备份文件路径 LOCAL_BACKUP_FILE="/tmp/mongo_backup_$(date +%Y%m%d%H%M%S).gz" # 生成本地备份 mongodump --archive="$LOCAL_BACKUP_FILE" --gzip --authenticationDatabase admin \ --db db -u mongobackup \ 2> $LOG_FILE # 获取备份文件的字节大小 BACKUP_SIZE=$(stat -c%s "$LOCAL_BACKUP_FILE") # 上传到S3 aws s3 cp --storage-class=STANDARD_IA "$LOCAL_BACKUP_FILE" "s3://$BUCKET/$BACKUP_NAME" 2> $LOG_FILE_S3 # 可选:上传完成后删除本地临时文件 rm -f "$LOCAL_BACKUP_FILE"
方案2:动态设置超大预期值(适合磁盘空间不足的场景)
直接设置一个远大于实际备份可能达到的大小,或者基于系统可用资源动态计算,只要值不小于实际备份大小即可:
# 方式1:固定设置1TB的预期值(足够覆盖绝大多数场景) EXPECTED_SIZE=1099511627776 # 方式2:基于当前磁盘可用空间动态计算(留20%余量) # EXPECTED_SIZE=$(df -B1 . | awk 'NR==2 {print int($4 * 1.2)}') # 执行流式备份上传 mongodump --archive --gzip --authenticationDatabase admin \ --db db -u mongobackup \ 2> $LOG_FILE \ | aws s3 cp --storage-class=STANDARD_IA - "s3://$BUCKET/$BACKUP_NAME" --expected-size $EXPECTED_SIZE 2> $LOG_FILE_S3
官方文档说明
根据AWS CLI官方文档:当上传大于50GB的本地文件流到S3时,必须指定--expected-size参数。因为CLI无法提前获知流式数据的总大小,而S3的分块上传机制需要这个值来规划分块数量和大小,否则会出现连接中断类错误。
内容的提问来源于stack exchange,提问作者duyluan97
相关产品推荐
相关产品推荐

