RustFS 如何配置 Snowball 自动解压上传的大小限制
2026/9/11 17:43:25 网站建设 项目流程

RustFS 如何配置 Snowball 自动解压上传的大小限制

【免费下载链接】rustfs🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting migration and coexistence with other S3-compatible platforms such as MinIO and Ceph.项目地址: https://gitcode.com/GitHub_Trending/rus/rustfs

RustFS 接受 MinIO 兼容的 Snowball 自动解压上传:客户端在 PutObject 请求中携带x-amz-meta-snowball-auto-extract元数据上传归档文件(tar/zip 及其压缩变体),RustFS 在流式解压的同时把归档成员写入对象,并强制执行条目数、路径、PAX 元数据、单对象大小、累计解压大小和解码流大小等限制。如果你的归档成员或整包累计大小超过默认限制,上传会被拒绝;这时就需要通过环境变量调整这两个大小限制。本文说明如何设置、这些值如何处理、以及如何验证新限制已生效。

两个可配置的大小限制

大小限制由两个环境变量控制,定义见 snowball-auto-extract.md 与常量声明 object.rs:

环境变量默认值硬上限含义
RUSTFS_SNOWBALL_MAX_ENTRY_BYTES1 GiB1 TiB单个归档成员的最大解压后大小
RUSTFS_SNOWBALL_MAX_UNPACKED_BYTES10 GiB10 TiB单次请求中所有解压对象字节的累计上限

两个值都以字节为单位。除了这两个大小限制外,归档还会受条目数(默认 100,000 条)、路径长度、PAX 元数据等固定策略约束,这些策略的默认值定义在 ArchiveLimits 中,且不受上面两个环境变量影响。

设置环境变量

在启动 RustFS 进程之前设置环境变量,例如将单成员上限提高到 2 GiB、累计上限提高到 20 GiB(示例值,按需替换为你需要的字节数):

RUSTFS_SNOWBALL_MAX_ENTRY_BYTES=2147483648 RUSTFS_SNOWBALL_MAX_UNPACKED_BYTES=21474836480 <你的 RustFS 启动命令>

设置时注意文档明确给出的处理规则:

  • 非法值回退默认:无法解析为字节的值直接使用默认值(1 GiB / 10 GiB);
  • 零按 1 字节处理0不会表示"不限制",而是被当作 1 字节;
  • 超过硬上限会被钳制(clamp):超过 1 TiB / 10 TiB 的值不会报错,而是被压到硬上限;
  • 单成员上限永不超过累计上限:即使配置了更大的RUSTFS_SNOWBALL_MAX_ENTRY_BYTES,生效值也不会超过RUSTFS_SNOWBALL_MAX_UNPACKED_BYTES生效后的值。

这条钳制逻辑可在 put_object_extract_limits 中核对:max_entry_size先被钳到硬上限,再与max_total_unpacked_size取较小值。

修改后必须重启才生效

这两个环境变量只在进程启动时读取一次(extract.rs 中用OnceLock缓存),运行中的实例不会热加载新值。文档明确要求:Restart RustFS after changing these environment variables.

同时要注意容量代价:文档指出,提高任一限制都会提高单个被接受请求可能执行的最大工作量;Snowball 归档解码器的准入仍然全局受限,更大的归档不会因此创建无界数量的并发解码器。

验证新限制是否生效

验证方式是构造一个超过限制的上传统一观察报错。限制检查失败的错误信息直接携带实际大小和生效上限(见 extract.rs):

  • 单成员超限时返回InvalidArgument,消息形如Archive entry size exceeds limit for <路径>: size=<实际大小>, limit=<生效上限>
  • 累计超限时返回InvalidArgument,消息形如Archive total unpacked size exceeds limit: size=<累计大小>, limit=<生效上限>

具体做法:上传一个带x-amz-meta-snowball-auto-extract元数据、成员大小介于"新配置值"和"默认值"之间的 tar 归档。如果新限制已生效,该请求应当被拒绝且报错中的limit=等于你配置的字节数;如果limit=仍是默认值(1 GiB / 10 GiB),说明环境变量未随进程生效,通常是漏改环境变量或没有重启。

请求被拒绝时不会留下部分写入的对象:e2e 测试 snowball_auto_extract_test.rs 展示了同类校验失败(InvalidArgument)之后对成员执行 HeadObject 会得到NotFound的判定方式。

相关边界

  • 解码流限制(max_decoded_size)由上面两个值派生:在累计上限基础上预留 tar 头与 PAX 元数据的有界空间,不能单独禁用或调整(snowball-auto-extract.md 与 extract.rs 一致);
  • 若你同时关心成员提交的并发行为,可用RUSTFS_SNOWBALL_EXTRACT_MAX_INFLIGHT控制小成员并发提交(取值钳制在 1 到 16,设为1恢复完全串行提交),这与大小限制相互独立,详见同一文档的 "Small-member concurrency" 一节;
  • 归档自动解压与预签名请求的 size 限制不可同时使用,会返回InvalidRequest,见 presigned-size-limits.md。

【免费下载链接】rustfs🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting migration and coexistence with other S3-compatible platforms such as MinIO and Ceph.项目地址: https://gitcode.com/GitHub_Trending/rus/rustfs

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询