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_BYTES | 1 GiB | 1 TiB | 单个归档成员的最大解压后大小 |
RUSTFS_SNOWBALL_MAX_UNPACKED_BYTES | 10 GiB | 10 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),仅供参考