☰
S3 Table 免费开源:把 MinIO 收费功能打成开源
2026/9/25 20:32:36 网站建设 项目流程

一套自托管的数据湖,组件往往比想象中多:对象存储负责放 Parquet,还得再单独跑一个 catalog 服务(Hive Metastore、Glue、Nessie 或者 Polaris)来管表的元数据。每多一个组件,就多一份部署、鉴权、备份和升级的活。商业方案看到了这个痛点,把它做成了增值项——MinIO 的 S3 Table(Iceberg Catalog)只在付费的 AIStor 产品线上提供,开源的 AGPL 社区版从 2025 年底进入维护模式,这条能力不在其中。被锁在社区版的团队要么忍着多跑一个服务,要么为这项能力额外买授权。过去两年,这个问题的答案基本只有「自己再搭一套」一种,它也是今年自托管圈子里被反复问到的同一个问题:能不能不额外付费、也不额外部署,就把目录层拿到手?

RustFS 给出的回答是把它做进存储内核:Apache Iceberg 的 REST Catalog 以 Apache 2.0 内置进对象存储服务,2026-09-10 官宣,随 1.0.0 GA(2026-09-16 发布)提供,没有「社区版没有、企业版才有」的分层。落到部署上是一个进程、一个端口(9000),同时讲 S3 和 Iceberg REST Catalog 两套"语言"。下面按官方文档把上手过程走一遍,顺便把几个还没填平的坑记下来。

它到底把什么塞进了存储

Iceberg 客户端的工作方式分两面:一面通过 REST Catalog 发现表、提交元数据变更;另一面通过 S3 API 读写真实的表文件。RustFS 的做法是让这两个接口都跑在 S3 API 那个端口上。

真正的 Parquet 数据文件,还是由计算引擎(Spark、DuckDB、PyIceberg)经 S3 API 直写进桶里,不经过任何中间层——典型的存算分离。元数据指针受一个保留前缀保护,普通的 S3 操作改不动那个目录区,所以你用aws s3 cp这类命令不会把数据湖写坏。提交快照走控制面,目录层用 CAS 版本校验拒绝过期的并发提交、用幂等键消除重复提交,保证多引擎并发写入的一致性;不过事务范围目前只限单表。

对已经熟悉 S3 的人,最大的变化是:你不再需要为了"建一张 Iceberg 表"去维护第二个服务。代价是存储层多了一层 catalog 语义,下面会说到它现在的边界。

从空桶到一张表

下面这套命令直接来自官方 S3 Tables 文档(对照 1.0.0 GA),在本地localhost:9000跑通了。

先设置端点与凭证:

exportRUSTFS_ENDPOINT="http://localhost:9000"exportAWS_ACCESS_KEY_ID="<your-access-key>"exportAWS_SECRET_ACCESS_KEY="<your-secret-key>"exportAWS_DEFAULT_REGION="us-east-1"

建一个专用桶:

aws --endpoint-url"$RUSTFS_ENDPOINT"s3api create-bucket--bucketmy-bucket

把它启用为表存储桶,注意这是一个空请求体 + SigV4 签名的调用,签名服务名是s3:

curl--fail-with-body--silent--show-error\--aws-sigv4"aws:amz:us-east-1:s3"\--user"$AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY"\--header"x-amz-content-sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"\--requestPUT"$RUSTFS_ENDPOINT/iceberg/v1/buckets/my-bucket"

返回 HTTP 200 且响应里enabled: true、catalog-type: iceberg-rest就成功了。之后接 Iceberg 客户端,关键参数只有四项:

  • REST Catalog URI:http://localhost:9000/iceberg(客户端会自动在末尾补/v1)
  • warehouse:my-bucket(就是桶名,不是 S3 URI,也不是 AWS ARN)
  • REST 鉴权:AWS SigV4,签名服务名s3,区域us-east-1
  • S3 文件端点:http://localhost:9000,走路径式寻址

一个容易踩的点:即便用同一个账户,REST 请求的签名和 S3 文件访问要分别配置。实际配置时如果只配了 S3 那头,客户端会报 403;补上 catalog 的 SigV4 才通。

哪些客户端能直接用

RustFS 维护了一份支持矩阵,状态分几档:Automated(有可运行脚本覆盖)、Manual/live harness(有 pinned 输入和 CI 门禁,但 live 跑默认不启)、Documented(有文档没自动化)。我整理成一张表:

落到实操建议上:想最快验证,用DuckDB Iceberg 1.5.5或PyIceberg最稳,这两个是 Automated,单表增删改查、schema 演化、快照、并发写都有脚本覆盖。Spark 和 Trino 给了 live harness,Spark 的写兼容靠实际部署版本验证,Trino 只声明了只读、不声明写兼容。StarRocks 目前只是外部 catalog 读路径的文档参考(Documented, not automated);Databend 给了 live harness,但也只做表数据文件的 S3 读探测,不声明 Iceberg REST 集成。端点层面/iceberg/v1是规范前缀,/_iceberg/v1是 MinIO AIStor 风格的兼容别名,两个都 Supported。

必须说清的边界

这条表能力在 1.0.0 中仍被官方文档标注为预览(Preview)——1.0.0 GA 的稳定性承诺针对的是核心对象存储引擎(S3 API、桶/对象生命周期、纠删码、复制等),S3 Tables 属于已内置、但仍处预览阶段的能力。下面几条都是官方明确写进文档的约束:

  • 格式支持 Iceberg v1 和 v2(默认 v2);不支持暂存式建表(staged create)、删表时清除数据(purge-on-drop)、以及 Iceberg v3。
  • 不提供 SQL 执行引擎,不提供多表原子事务,不提供跨区域独立双活写入。
  • 不声明完整兼容 AWS S3 Tables 控制面。它实现的是开放的 Iceberg REST Catalog 协议,“开源 S3 Table"应该理解为"免费 + 开放协议的 Iceberg 目录”,不是 AWS S3 Tables 的平替克隆。
  • 元数据删除和后台维护默认关闭,没有内置的定期维护调度器,要靠显式操作触发。删除表只移除目录条目、保留底层对象——所以千万别对快照或其他元数据还引用的 S3 路径做递归删除。
  • 默认object目录后端会把目录状态持久化到 RustFS 自身;如果你要从默认后端切到durable-strong,必须按官方目录切换流程走预检和协调隔离写入方,不能原地硬切。

这些约束符合预览功能的定位,意味着它目前更适合在隔离环境里验证可行性,而不是直接上生产关键链路。

和 MinIO 的同名能力怎么比

把这件事说清楚,得先厘清 MinIO 现在的两条产品线。MinIO Object Store 是开源那条线,许可证 GNU AGPL v3,但从 2025 年 12 月起进入维护模式:不再接受新功能与 PR、不再提供 RPM/DEB/Docker 构建,也就是基本不再演进。S3 Table 这条能力不在它身上。

真正带 S3 Table / Iceberg Catalog 的是AIStor——一个与开源线分开发布的二进制,走的是商业许可证。MinIO 官方给它定的单价是按容量计费,公开口径约$0.02/GB/月。换句话说,想在 MinIO 上用原生 Iceberg 目录,得先进入商业授权这条线。

RustFS 这边是把同一类能力以 Apache 2.0 内置进存储服务,没有「社区版没有、企业版才有」的分层,也不用为 catalog 能力单独付费。

差异点主要落在授权模式上,而不是「谁有这个功能」:自托管团队如果只想少维护一个 catalog 组件、又不想为商业授权买单,RustFS 这一档的门槛更低。但反过来,MinIO 的 AIStor 在商业支持、合规承诺上更成体系,且 Tables 这条线 GA 得更早(2026-02)——选型时别只看「功能清单里有这一行」,要看你愿不愿意为支持买单、以及能不能接受 RustFS 这边的预览状态。

如果你打算试,照这个顺序来

  1. 升级到1.0.0GA 或更高版本,且固定版本标签,别用latest进生产实验。
  2. 单独建一个桶专门做表存储桶,不要把普通桶的生命周期过期规则直接套上去——文档明确普通生命周期会跳过表桶,但在现有桶上启用表模式会改变其过期执行方式。
  3. REST 和 S3 两端分别配 SigV4 签名,区域统一us-east-1,签名服务名都是s3。
  4. IAM 先按文档的最小权限配:启用要admin:SetTableBucket、查状态要admin:GetTableBucket、命名空间和表操作对应admin:SetTableNamespace/admin:CreateTable/admin:GetTableMetadata/admin:CommitTable,表文件读写还要单独的 S3 权限。
  5. 维护操作(删除表、清 orphan 对象)默认关,先想清楚保留引用再开,别急着rm -rf。
  6. 先拿 DuckDB 或 PyIceberg 在单机上跑通一张表的建、写、读、删,再考虑往多引擎、多桶扩展。

一句话收尾:RustFS 把 Iceberg 目录收编进对象存储,对想"少部署一个组件"的自托管数据湖来说是个实在的方向,但它在 1.0.0 里仍是预览能力、且有上面那些不声明项。上生产前,先按上面六步在隔离环境里验证一遍,比直接信特性清单靠谱。

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

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

立即咨询