☰
MinIO 进入维护模式:RustFS 的机会窗口已经打开
2026/10/10 2:02:44 网站建设 项目流程

MinIO 进入维护模式:RustFS 的机会窗口已经打开

【免费下载链接】rustfsRustFS 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

自建 S3 的世界里,刚刚失去它最顺理成章的答案。从 2025 年 6 月官方一次更新删掉约 11 万行代码、顺手抹掉 Web 管理界面,到 2025 年 12 月初 MinIO 在 GitHub 仓库 README 里写下「维护模式:代码库处于仅维护状态,不接受任何新功能、改进或拉取请求」,再到 2026 年 2 月官方仓库被归档,以及 2026 年 9 月连累计超过 10 亿次拉取的minio/minioDocker 镜像也被整体删除、Docker Hub 上只剩 404——这条时间线里,最后保留的完整可部署版本停留在RELEASE.2025-04-22T22-12-26Z,此后的安全修复只能「视情况评估」。对一个承载生产数据的存储系统来说,「一年多没有正常维护 + 旧镜像不敢再用」几乎是教科书式的迁移触发条件。

而窗口期的另一侧,RustFS——一个用 Rust 编写的 S3 兼容分布式对象存储——正处在近 2 万 Star 的上升期,仓库里最显眼的模块恰好是为「从 MinIO 迁走」这件事准备的。本文基于 RustFS 当前代码仓库的真实结构、契约文档与测试清单,把三件事讲清楚:MinIO 维护模式的真实状态、替代者阵营里 RustFS 凭什么排在第一、以及迁移窗口期的现实阻力到底在哪。

一、MinIO 维护模式,到底砍到了什么程度

先厘清事实边界,避免把「社区讨论」当成「官方行为」。综合 2025 年 12 月至 2026 年 9 月的多家媒体与社区跟踪报道,MinIO 开源侧的收缩是渐进式、四连击的:

时间事件
2025-06一次官方更新删除约 11 万行代码,社区版 Web 管理控制台被移除
2025-12仓库 README 声明进入 Maintenance Mode:不接受新功能、改进与 PR,Issue 不再主动审查,社区支持转为 Slack 上的 best-effort
2026-02官方仓库归档(archived),不再维护
2026-09官方 Docker Hub 镜像minio/minio被整体删除,最后版本停留在RELEASE.2025-04-22T22-12-26Z

把这几件事串起来看,信号比任何单一条都强:功能演进停止、代码库冻结、分发渠道拆除。对存量用户而言,风险不再只是「没有新功能」,而是安全修复渠道从「承诺」退化成「个案评估」——在 AI 加速漏洞挖掘的当下,一个冻结超过一年的对象存储镜像,本身就是一条合规负债。

更深层的背景是 2018 年的许可证风波。MinIO 当年从 Apache 2.0 切换到 AGPLv3,把「自建 S3 首选」的一大批用户推到了需要法务评审的位置:AGPL 的网络交互条款对 SaaS 形态的二次分发有传染风险,这正是企业采购和云厂商选型时最敏感的「许可证陷阱」问题。此后社区一直需要一个「Apache 2.0 + S3 兼容 + 分布式纠删码」的完整替代,而 RustFS 的 README 第一屏就把这一点写成了产品定位:

Unlike other storage systems, RustFS is released under the permissible Apache 2.0 license, avoiding the restrictions of AGPL.

仓库根目录的 LICENSE 全文即 Apache License 2.0,没有任何附加条款。对一个把「无许可证风险」当卖点的存储系统,这一页文件本身就是最硬的证据。

二、替代者盘点:RustFS 为什么排第一

维护模式宣布后,社区迅速整理出替代品名单:Ceph(RADOS Gateway,LGPL,成熟但重)、SeaweedFS(Apache 2.0,擅长海量小文件)、Garage(Rust、轻量但 AGPL)、OpenStack Swift + s3api(适合既有 OpenStack 环境)、VersityGW(文件系统网关),以及一批新项目如 MaxIOFS、liteio 等。RustFS 在 2026 年 9 月更新的社区盘点中被单独标注为「目前最值得关注的 MinIO 直接替代品之一」,而此前「弃用 MinIO,拥抱 RustFS」一类的迁移向文章在中文技术社区已连续数月出现——热度本身不是论据,但值得追问它为什么是 RustFS。

结合仓库源码,RustFS 与这个名单上所有对手的差异点有三个,且都能落到代码:

1. 定位是「MinIO 的直接继任者」,而不是「又一个 S3」。README.md 的自我描述是「combines the simplicity of MinIO with the memory safety and raw performance of Rust」,并且功能矩阵与 MinIO 逐项对齐:版本控制、Object Lock(WORM)、SSE 三类加密、生命周期管理(ILM)与远端 S3 分层、桶复制、站点复制(Site Replication)、桶配额、事件通知、审计日志、Web 控制台、Helm Chart,此外还多出 OpenStack Swift 协议、Keystone 认证、SFTP/FTPS/WebDAV、Iceberg REST Catalog(S3 Tables Preview)等 MinIO 没有的协议面。

2. 工程形态是面向高并发热路径的系统,不是拼装出来的兼容层。仓库是一个 60+ crate 的 Cargo workspace,ARCHITECTURE.md 给出的请求链路是严格单向分层的:

HTTP request → server (TLS, auth, routing, compression) → app/object_usecase (validation, policy, lifecycle) → storage/ecfs (erasure coding, encryption, checksums) → ecstore (disk pool selection, data distribution) → rio (reader pipeline: encrypt → compress → hash → write) → io-core (buffer pool, storage profiling, admission control) → local disk / remote disk via RPC

纠删码引擎在 crates/ecstore/(279 个源文件),读者 I/O 管线在 crates/rio/(加密→压缩→哈希→写盘的单遍 reader 链),缓冲池与准入控制在 crates/io-core/。仓库甚至用 scripts/check_layer_dependencies.sh、scripts/check_architecture_migration_rules.sh 这类 CI 守卫脚本把「层与层之间不许反向依赖」固化成提交门禁。这种工程纪律在同类开源对象存储里很少见,也是它敢于在 changelog 里逐条写下 KMS 失败分类、锁 RPC 超时风暴防护这类细节的原因。

3. 最关键的一点:它把 MinIO 的磁盘格式当作一等公民对待。这是整个替代者名单里几乎没有第二个做到的事,后文第三节详述。

三、迁移窗口:拉取式迁移让「不停机换库」成为可能

对象存储迁移的传统姿势是rclone/mc mirror全量拷贝 + 停写窗口,大集群上动辄数周。RustFS 的 On-Demand Migration(ODM) 模块把这个问题换了一个解法:把源桶「挂」过来,读到哪搬哪。

ODM 将外部 S3 兼容源桶(MinIO、AWS、R2、GCS、Azure 等 provider)绑定到一个本地桶。客户端 GET 一个本地不存在的 key 时,RustFS 从源拉取、流式回给客户端、同时落盘本地——同一次读取完成迁移,之后的所有读取全部本地化。模块默认开启,可用RUSTFS_ON_DEMAND_MIGRATION_ENABLED=false全局关闭;实现位于 rustfs/src/on_demand_migration/,核心文件分工明确:

文件职责
config.rs每桶配置模型与参数边界(阈值、并发、带宽、TTL)
source_client.rs出站源客户端(多 provider)
pull.rs拉取写回管线
breaker.rs/negative_cache.rs每源熔断器 / 每 key 负缓存
backfill.rs后台全量回填任务,带可恢复 checkpoint

配置走 Admin API,且强制先dry-run探测源再落盘——这是很典型的「迁移是高风险操作」的工程态度:

# 1. dry-run:验证源可达(HeadBucket)+ 可列举(一次 ListObjectsV2),不保存 awscurl --service s3 --region us-east-1 \ --access_key "$AK" --secret_key "$SK" \ --request PUT --header 'Content-Type: application/json' \ --data "$(cat /tmp/odm.json)" \ "http://<host>:9000/rustfs/admin/v3/on-demand-migration/photos?dry-run=true" # 2. 去掉 dry-run 保存配置,集群内元数据自动刷新 # 3. GET .../status 查看每节点的熔断器、队列深度、拉取计数

响应头x-rustfs-on-demand-migration: source会标记每一个来自源桶的响应,配合rustfs_on_demand_migration_*指标(拉取字节数、失败数、熔断状态、延迟分位),迁移进度是可观测的,而不是黑箱等待。防循环回源(anti-loop marker)、单 key 单飞(singleflight)、有界拉取队列、可选带宽限制,这些生产级保护都写在模块文档里,而不是 PPT 里。

而迁移之所以「敢在原地切换」,底层还有一块很少被宣传的基石:RustFS 与 MinIO 的纠删码在字节层面同源。docs/architecture/erasure-coding.md 是仓库中标注为 normative(规范级)的契约文档,其中写明:RustFS 采用与 MinIO 完全同族的GF(2⁸) 上的 Reed–Solomon、Vandermonde 生成矩阵、算法标识rs-vandermonde、1 MiB 纠删块、HighwayHash-256 bitrot 校验——「这正是与 MinIO 实现字节级xl.meta互操作的可能」。

docs/architecture/minio-file-format-compat.md 则把互操作能力拆成了带代码出处的矩阵:

  • 未加密的xl.meta(meta_ver 1–3,含 inline、multipart、versioned、delete marker):可读,重写时归一化到 meta_ver 3;
  • .metadata.bin桶配置(msgpack,字段名与 MinIO 的bucketMetadata一一映射):可读并导入;
  • config/iam/下的 IAM 配置:导入,且归一化遗留字段别名;
  • 导入器是单向幂等的,实现在 crates/ecstore/src/bucket/migration.rs 的try_migrate_bucket_metadata/try_migrate_iam_config,由 rustfs/src/startup_bucket_metadata.rs 在启动时执行,从.minio.sys布局迁到.rustfs.sys。

也就是说,RustFS 给出的迁移路径不是「重新拷一份数据」,而是「同一块纠删码分片,换一套读它的运行时」——对已有 MinIO 卷,这意味着磁盘格式层的迁移成本趋近于零,网络层只剩元数据与(可选的)对象拉取。

兼容性广度方面,仓库没有用「全兼容」这种模糊说法,而是直接跑 s3tests 并维护四份测试清单(docs/architecture/s3-compatibility-matrix.md):implemented_tests.txt556 例、unimplemented_tests.txt37 例、excluded_tests.txt317 例(厂商专有行为)、lifecycle_behavior_tests.txt53 例。556 对 37,且「尚未通过」项被明确列出——这种「把边界写在明处」的兼容矩阵,比任何兼容性宣传都更有工程说服力。

四、窗口期的冷水:阻力是真实存在的

严谨地讲,这个「机会窗口」不等于「免费通道」。仓库自己的文档把迁移的边界标得非常清楚,任何基于 RustFS 做迁移决策的团队都应当把以下几点纳入方案:

1. MinIO SSE 对象是最大的硬骨头。按 minio-file-format-compat.md 的 Part C:SSE-S3 / SSE-KMS / SSE-C 对象在默认构建下是fail closed(拒绝读取并给出诊断),需要用rio-v2feature 构建的迁移二进制(cargo build时启用,不在 default/full 构建内),且要求持有源 MinIO 的静态主密钥(RUSTFS_SSE_S3_MASTER_KEY与源端一致);而凡是由外部 KES / KMS 插件 / MinKMS 密封 DEK 的对象,明确不在支持计划内,只能先在 MinIO 侧解密或重加密。crates/rio-v2/ 的 reader 专门补齐了 MinIO 的 sealed-key 槽位解码(decrypt_minio_kms_data_key同时兼容sealed‖iv‖nonce与旧版 JSON 两种封包形态)。换句话说:明文与静态密钥加密的对象可以近乎零成本迁移;托管 KMS 加密的对象需要额外工程。

2. 迁移是单向的。同一份契约文档明确:「RustFS 写入的卷,MinIO 二进制无法回读」(MinIO 找.minio.sys,RustFS 写.rustfs.sys),反向的 SSE 对象同样不支持。切过去就是单行道——这本身是合理的架构决策(避免双写脑裂),但意味着回滚方案必须建立在「源桶保留」上,ODM 文档的升级/回滚章节为此专门写了 rc.5 混合版本的坑:旧版本节点写桶元数据会丢弃 ODM 配置字段且不可恢复,因此必须全节点升级后再启用 ODM。

3. S3 兼容不是 100%,且差距是可见的。37 个 unimplemented 用例里有桶访问日志、POST Object 表单上传的校验和处理等;站点复制(Site Replication)也明确要求对端是 RustFS 兼容的 Admin API,通用 S3 服务只能作为桶复制的数据目标。对于依赖这些边角行为的存量集成,需要先过一遍 scripts/s3-tests/ 的清单。

4. 单节点单盘形态不能原地扩展。README 的 Pool expansion notice 沿用了 MinIO 的拓扑规则:SNSD(单机单盘)只能作为独立本地路径存在,升级多盘需要新建部署 + S3 层迁移。这是从 MinIO 迁移时最需要提前规划的容量/拓扑项。

五、接棒能力:窗口期考验的是「持续交付」

机会窗口对谁打开,最终取决于谁能持续接住。评估一个存储系统的社区接棒能力,不看 Star 曲线,看三样东西:修复节奏、测试覆盖、文档与运维资产。

修复节奏。当前 CHANGELOG.md 的 Unreleased 部分密度相当高:两条 GHSA 级别的 SigV4 签名头漏洞修复(未签名x-amz-*头可导致预签名 PUT 被升级为 CopyObject / 任意属性注入)、站点复制中断恢复的 30 秒有界重试排空 + 600 秒全量对账、锁 RPC 超时风暴的驱逐限流(新增rustfs_remote_lock_*指标族)、KMS 失败从一律 500 拆分为 400/403/401 之外的完整状态分类、多池异构拓扑下逐池解析纠删 parity(修复小池解析出 0 个数据分片导致 Reed-Solomon 构造 panic 的缺陷)。这些不是功能 PR,而是一个系统在按生产事故的速度迭代正确性——对一个「维护模式」的对手而言,这是质变。

测试覆盖。crates/e2e_test/ 下有 94 个端到端测试文件,按主题命名到回归级别:degraded_read_eof_regression_test.rs、heal_erasure_disk_rebuild_test.rs、degraded_listing_availability_test.rs、checksum_upload_test.rs……加上 556 例 s3tests 门禁、crates/e2e_test/src/distributed/ 的分布式场景、以及 scripts/s3-tests/ 里与 Ceph s3tests 用例的双目标对比工具(compare_dual_targets.py),兼容性主张是被 CI 持续验证的,而不是文档断言。

运维资产。仓库里的文档结构本身就是一种「接棒声明」:docs/architecture/ 下 40+ 份契约文档(每份都写明 Source of truth 对应的源码符号,scripts/check_doc_paths.sh在每次提交时校验路径有效性),docs/operations/ 下 50+ 份运维 runbook(KMS 灾备演练、滚动重启、decommission 兼容性、锁风暴防护、分层 ILM 调试)。高变更风险的纠删码/元数据改动要求对抗性评审 + 真实 MinIO 迁移样本的回归测试,规则直接写在 docs/architecture/erasure-coding.md 的 §13。

协议面与部署面。管理协议不止 S3:Swift API 与 Keystone 认证原生支持,SFTP/FTPS/WebDAV 通过StorageBackendtrait 复用同一套 multipart 流式上传路径;S3 Tables 以 Iceberg REST Catalog 形态交付(Preview)。部署形态覆盖 Docker/Podman、Helm(helm/rustfs/,Chart 有独立版本治理脚本)、Nix Flake + NixOS 模块(nix/rustfs-module.nix)乃至 x-cmd。容器默认以非 root 用户rustfs(10001:10001)运行,README 连 bind mount 的属主要求都写明了。管理面则是完整的 Web 控制台(9001 端口)+ Admin API(/minio/前缀下的集群管理、IAM、指标):

结语

MinIO 维护模式的本质,是自建 S3 生态第一次出现「事实标准真空」。真空期最危险的错觉是以为迁移可以无限延期——但镜像删掉之后,每一天的存量都停留在一个没有安全承诺的版本上。RustFS 给出的答案不是「换个地方存数据」,而是三层递进的能力:Apache 2.0 的许可证安全感、与 MinIO 同源纠删码带来的磁盘格式层零成本、以及 On-Demand Migration 提供的不停机渐进切换。阻力同样真实且已被仓库自己写明:托管 KMS 加密对象、单向不可逆、37 个未通过的兼容用例、SNSD 拓扑不可扩展。

对一个窗口期而言,这些「诚实的边界」比「全兼容」的广告更有价值——它让迁移决策可以建立在工程评估上,而不是叙事上。接下来的观察点也很明确:ODM 从「模块」到「默认推荐路径」的成熟度、rio-v2迁移构建从 feature-gated 走向独立发布形态的进度,以及 s3tests 未通过清单的收缩速度。这三条曲线,决定 RustFS 们接过的究竟是机会,还是责任。

【免费下载链接】rustfsRustFS 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),仅供参考

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

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

立即咨询