You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:01:21