RustFS 实战指南:基于 Rust 的高性能 S3 兼容分布式对象存储部署与运维全解
【免费下载链接】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 是一个完全开源、基于 Rust 编写的高性能分布式对象存储系统,本文以仓库根目录 README.md 为主线,结合 Dockerfile、entrypoint.sh、docker-compose-simple.yml 与 docs/architecture/erasure-coding.md 等源码级资料,系统讲解它的定位、核心特性、官方性能数据与六种部署方式,并覆盖 Pool 扩容拓扑约束、控制台访问、OIDC 角色映射、Webhook 事件通知与运维调优要点。读完本文,你将能够独立完成 RustFS 的单机、Docker 与 Kubernetes 部署,并理解其分布式存储与纠删码设计的底层原理。
RustFS 是什么:定位、理念与许可证
RustFS 是"用 Rust 构建的高性能分布式对象存储系统"。官方定位将其描述为"结合了 MinIO 的简洁性与 Rust 的内存安全及原始性能",面向数据湖(Data Lake)、人工智能与大数据工作负载优化,并为已支持的功能提供广泛的 S3 API 兼容性(见 README.md)。
在许可证与工程理念上,RustFS 与许多同类系统有明显差异:
- 宽松的 Apache 2.0 许可证:官方明确强调采用商业友好的 Apache 2.0 而非 AGPL,避免许可证"毒丸"条款,便于商业使用与社区贡献(见 LICENSE 与 Cargo.toml 中
license = "Apache-2.0"的声明)。 - 内存安全:Rust 语言在编译期保证内存安全,从语言层面规避了 C/C++ 常见的内存错误。仓库在 Cargo.toml 的
[workspace.lints.rust]中设置了unsafe_code = "deny",即工作区默认禁止非授权 unsafe 代码,这从工程规范层面印证了其安全取向。 - 无遥测与数据主权:官方声称不采集遥测数据,并宣称符合 GDPR(欧盟/英国)、CCPA(美国)、APPI(日本)等合规要求。
说明:以上定位与对比表述均转述自官方 README 的公开声明,属于项目自我描述,不代表第三方独立评测结论。
核心特性全景:从 S3 兼容到数据湖
README 用一张"功能状态矩阵"概括了 RustFS 的能力版图,并定义了图例:
- ✅Available(可用):功能已随发布版本交付,并由 CI 门禁覆盖;
- 🧪Preview(预览):功能已发布但位于可选 flag 之后,或带有有界兼容性声明。
完整功能状态表如下(见 README.md):
| 功能 | 状态 | 功能 | 状态 |
|---|---|---|---|
| S3 核心功能 | ✅ Available | 分布式模式 | ✅ Available |
| 上传 / 下载 | ✅ Available | 单节点模式 | ✅ Available |
| 版本控制 | ✅ Available | Bitrot 防数据腐烂 | ✅ Available |
| 对象锁(WORM) | ✅ Available | 自愈与扫描器 | ✅ Available |
| 服务端加密 | ✅ Available | Pool 扩容 / 退役 | ✅ Available |
| RustFS KMS | ✅ Available | 存储桶复制 | ✅ Available |
| 生命周期管理(ILM) | ✅ Available | 站点复制 | ✅ Available |
| ILM 分层(远程 S3) | ✅ Available | 存储桶配额 | ✅ Available |
| S3 Select | ✅ Available | 事件通知 | ✅ Available |
| S3 Tables(Iceberg REST) | 🧪 Preview | 审计日志 | ✅ Available |
| IAM / 策略 | ✅ Available | 日志与可观测性 | ✅ Available |
| OIDC / SSO | ✅ Available | Web 控制台 | ✅ Available |
| Keystone 认证 | ✅ Available | K8s Helm Charts | ✅ Available |
| Swift API | ✅ Available | FTPS / WebDAV | ✅ Available |
| 多租户 | ✅ Available | SFTP | ✅ Available |
| MinIO 磁盘格式兼容 | 🧪 Preview |
针对表中几个值得注意的条目,README 给出了明确的限定说明:
- RustFS KMS:生产环境支持 Vault(KV2 / Transit)与 AWS KMS 后端;
Local与Static后端仅用于开发与测试。安全属性详见 docs/operations/kms-backend-security.md。 - Swift API / SFTP:属于可选 cargo feature,需通过
--features swift、--features sftp或full启用;而 FTPS 与 WebDAV 在默认构建中即已开启。从 rustfs/Cargo.toml 可以看到default = ["ftps", "webdav", "gcs"],full = ["metrics-gpu", "ftps", "swift", "webdav", "sftp", "pyroscope", "gcs"],与 README 描述完全一致。 - S3 Tables:以 Iceberg REST Catalog 形态交付,仓库内配有自动化的 PyIceberg 与 DuckDB 覆盖测试;其他引擎与厂商配置的兼容声明见 docs/architecture/s3-tables-support-matrix.md。
- MinIO 磁盘格式兼容:由
rio-v2feature 门控,不属于默认构建;且 RustFS 无法读取 MinIO 加密的对象。详见 docs/architecture/minio-file-format-compat.md。
关于 S3 兼容性边界,docs/architecture/s3-compatibility-matrix.md 给出了更精确的说明:RustFS 提供"对已支持功能的广泛 S3 API 兼容性",但不声称覆盖全部标准或厂商特定的 S3 行为。该矩阵以scripts/s3-tests/下的测试清单为事实来源(implemented_tests.txt、unimplemented_tests.txt、excluded_tests.txt等),其中 CopyObject 校验和(CRC32、CRC32C、CRC64NVME、SHA1、SHA256、MD5、SHA512、XXHASH3 等)由 crates/e2e_test/src/copy_object_checksum_test.rs 覆盖验证。
性能表现:官方压测环境与对比视角
README 提供了一份官方压力测试环境参数表,作为性能数据的前提条件:
| 类型 | 参数 | 备注 |
|---|---|---|
| CPU | 2 核 | Intel Xeon (Sapphire Rapids) Platinum 8475B, 2.7/3.2 GHz |
| 内存 | 4GB | |
| 网络 | 15Gbps | |
| 硬盘 | 40GB x 4 | IOPS 3800 / Drive |
README 同时给出了与"其他对象存储"的横向对比表,涵盖控制台体验、语言与安全性、数据主权、开源协议、S3 兼容性、边缘与 IoT 支持、风险画像等维度。需要强调的是,这张表是项目方在 README 中的自我声明,其中的定性描述(如"功能强大的控制台""基于 Go 或 C 的系统存在 GC 停顿或内存泄漏潜在风险"等)属于官方宣传口径,建议读者结合自身业务场景进行独立验证,本文不将其作为客观评测结论引用。
从工程层面看,性能取向在代码中有多处体现:例如 rustfs/src/main.rs 中通过hotpathfeature 将全局分配器替换为 MiMalloc(rustfs_mimalloc::MiMalloc),并借助hotpath::CountingAllocator统计分配行为;Cargo.toml 的 release profile 配置了opt-level = 3、lto = "thin"、codegen-units = 1,并为生产提供独立的productionprofile。这些细节表明项目在热点路径与发布构建上做了针对性的性能优化。
快速开始:六种部署方式
README 提供了从"零门槛一键脚本"到"云原生 Helm"共六种部署路径,本节逐一展开。
方式一:一键安装脚本
curl -O https://rustfs.com/install_rustfs.sh && bash install_rustfs.sh适合快速体验,脚本会完成二进制下载与基本环境准备。
方式二:Docker(含 Podman 与 Compose)
RustFS 容器以非 root 用户rustfs(UID/GID10001:10001)运行。使用 bind mount 挂载主机目录时,所有挂载路径(数据目录、日志目录、启用RUSTFS_TLS_PATH时的证书目录)都必须对该用户可写,否则启动会因权限不足失败。
# 创建数据与日志目录 mkdir -p data logs # 将这些目录的所有者改为容器运行用户 chown -R 10001:10001 data logs # 使用最新版本 docker run -d -p 9000:9000 -p 9001:9001 -v $(pwd)/data:/data -v $(pwd)/logs:/logs rustfs/rustfs:latest # 使用指定版本 docker run -d -p 9000:9000 -p 9001:9001 -v $(pwd)/data:/data -v $(pwd)/logs:/logs rustfs/rustfs:1.0.0-rc.5如果使用 Podman(-v后的:Z,U标签会让 Podman 自动设置目录属主):
mkdir -p data logs podman run -d -p 9000:9000 -p 9001:9001 -v $(pwd)/data:/data:Z,U -v $(pwd)/logs:/logs:Z,U rustfs/rustfs:latest若启用 TLS 并 bind mount 证书目录,需要同样准备:
mkdir -p certs chown -R 10001:10001 certs该 UID/GID 约定在 Dockerfile 中有明确实现:addgroup -g 10001 -S rustfs、adduser -u 10001 -G rustfs -S rustfs -D,随后chown -R rustfs:rustfs /data /logs,并以USER rustfs运行。
也可以直接使用仓库根目录的 docker-compose-simple.yml:
docker compose -f docker-compose-simple.yml up -d podman compose -f docker-compose-simple.yml up -d # Podman 同样支持在运行带主机 bind mount 的 Compose 之前,请注意:
- 确保每个挂载的主机路径对
10001:10001可写; - 启用 TLS 时,确保
/opt/tls的证书挂载对10001:10001可读; - 如果无法匹配主机属主,可改用
user: "<host-uid>:<host-gid>"运行rustfs服务; docker-compose-simple.yml内含一个volume-permission-helper服务,用于修复命名卷的属主(其命令为chown -R 10001:10001 /data0 /data1 /data2 /data3 /logs),但 bind mount 的主机路径仍需你提前准备好权限。
该 Compose 文件展示了最小化生产配置的骨架:RUSTFS_VOLUMES=/data/rustfs{0...3}(4 块盘的省略号表达式)、RUSTFS_ADDRESS=0.0.0.0:9000、RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001、RUSTFS_CONSOLE_ENABLE=true,以及RUSTFS_UNSAFE_BYPASS_DISK_CHECK(默认false,仅本地测试时显式置true)。健康检查默认请求http://<host>:9000/health与http://<host>:9001/rustfs/console/health,启用 TLS 后自动切换为 HTTPS,支持通过RUSTFS_HEALTHCHECK_HOST与RUSTFS_HEALTHCHECK_CA做严格证书校验。
提示:仓库根目录还有一份更完整的 docker-compose.yml,定义了 Grafana、Prometheus、Jaeger 等可观测性服务(Redis、Nginx 通过 profile 按需启用),适合希望开箱即用观测栈的场景,运行前建议先通读该文件。
方式三:从源码构建(进阶)
对于需要自建多架构镜像的开发者,仓库提供docker-buildx.sh:
# 本地构建多架构镜像 ./docker-buildx.sh --build-arg RELEASE=latest # 构建并推送到 registry ./docker-buildx.sh --push # 构建指定版本 ./docker-buildx.sh --release v1.0.0 --push # 自定义 registry 与 namespace ./docker-buildx.sh --registry your-registry.com --namespace yourname --push该脚本支持:
- 多架构构建:
linux/amd64、linux/arm64; - 自动版本探测:基于 git tag 或 commit hash;
- Registry 灵活性:支持 Docker Hub、GitHub Container Registry 等;
- 构建优化:包含缓存与并行构建。
也可使用 Make 目标:
make docker-buildx # 本地构建 make docker-buildx-push # 构建并推送 make docker-buildx-version VERSION=v1.0.0 # 构建指定版本 make help-docker # 查看所有 Docker 相关命令macOS 交叉编译提示:macOS 默认
ulimit -n为 256,在面向 Linux 目标执行cargo zigbuild或./build-rustfs.sh --platform ...时可能报ProcessFdQuotaExceeded。构建脚本会自动尝试调高限制,若仍告警,请在 shell 中先执行ulimit -n 4096(或更高)。
方式四:Helm Chart(云原生)
在 Kubernetes 集群上安装请遵循 helm/rustfs 目录下的 Chart(Chart.yaml声明了apiVersion: v2、版本1.0.0-rc.5),具体安装步骤参见 Chart 内说明。README 同时推荐了两份运维文档:Scanner 运行节奏、周期预算、bitrot 频率、生命周期转换状态与单节点单盘空闲 CPU 调优见 docs/operations/scanner-runtime-controls.md;可重复的扫描压力验证见 docs/operations/scanner-benchmark-runbook.md;慢速存储上的磁盘超时旋钮(含控制大前缀ListObjects的 walk stall 预算)见 docs/operations/drive-timeout-tuning.md。
方式五:Nix Flake
启用 flake 的 Nix 用户可以直接使用:
# 不安装直接运行 nix run github:rustfs/rustfs # 构建二进制 nix build github:rustfs/rustfs ./result/bin/rustfs --help # 或在本地 checkout 中构建 nix build nix runflake 还导出了 NixOS 模块与 RustFS 的rc客户端。将模块加入系统,并通过运行时文件(例如 sops-nix 或 agenix)提供凭据,避免密钥落入 Nix store:
imports = [ inputs.rustfs.nixosModules.rustfs ]; services.rustfs = { enable = true; accessKeyFile = "/run/secrets/rustfs-access-key"; secretKeyFile = "/run/secrets/rustfs-secret-key"; volumes = [ "/var/lib/rustfs" ]; };安装 S3 兼容客户端:nix profile install github:rustfs/rustfs#rustfs-client(可执行文件名为rc),或在系统配置中使用inputs.rustfs.packages.${pkgs.system}.rustfs-client。对应模块定义见 nix/rustfs-module.nix。
方式六:X-CMD
# 不安装直接运行 x rustfs # 下载二进制并安装到全局环境 x env use rustfs rustfs --helpPool 扩容拓扑规则:务必先读的硬约束
README 在快速开始前以醒目方式给出 Pool 扩容约束,直接关系部署成败:
- 单节点单盘(SNSD)部署仅支持以本地路径独立运行:不能原地扩容,也不能作为 Pool 加入集群。若要迁移到多盘拓扑,需要创建新部署并通过 S3 迁移数据。
- 已有多盘 Pool 的端点和 Erasure Set 宽度必须保持不变:扩容方式只能是追加新 Pool。使用省略号表达式扩容时,每个 Pool 参数都必须包含省略号表达式,且展开后至少包含两个磁盘端点。
- 允许的拓扑:单节点多盘 Pool、以及多节点每节点一盘的 Pool 均被接受,但必须满足 Erasure Set 布局与 EC 配置要求;配置合法不代表能容忍整台主机故障。
README 特别指出:这些拓扑规则与 MinIO 一致,但两者的默认 parity 选择方式存在差异。扩容前请阅读 docs/testing/pool-layout-compatibility.md 了解布局兼容性与回归测试说明。
访问 RustFS:控制台与第一桶金
服务启动后按以下步骤开始使用:
- 访问控制台:浏览器打开
http://localhost:9001。- 默认凭据:
rustfsadmin/rustfsadmin
- 默认凭据:
- 创建存储桶:在控制台创建一个新 bucket。
- 上传对象:可直接通过控制台上传,也可以使用任何 S3 兼容 API/客户端交互。
如需通过 HTTPS 访问,请参考仓库中的 TLS 配置文档(docs/operations/reverse-proxy.md、docs/operations/two-factor-auth.md 等运维文档涉及相关安全配置)。
值得补充的是容器入口脚本 entrypoint.sh 的凭据策略:它支持RUSTFS_ACCESS_KEY/RUSTFS_ACCESS_KEY_FILE、RUSTFS_SECRET_KEY/RUSTFS_SECRET_KEY_FILE两对"环境变量/文件"来源,且二者互斥;镜像不内置凭据,默认或缺失凭据只告警不阻断启动(二进制回落到内置默认值),而配置冲突、文件不可读、值为空则会硬失败退出。生产部署务必设置非默认凭据,多节点全默认凭据组合下还需要RUSTFS_RPC_SECRET来派生节点间 RPC 认证。
OIDC Roles Claim:对接 Microsoft Entra ID 应用角色
RustFS 支持将 OIDC claim 中的角色值映射进既有授权管线。roles_claim设置是可选的:未设置或为空时,只有groupsclaim 参与授权(与旧版本行为一致)。对接 Microsoft Entra ID 应用角色时,设置roles_claim=roles,即可让控制台管理员检查和存储桶 IAM 策略都评估这些角色。
示例环境配置(可选 roles claim):
RUSTFS_IDENTITY_OPENID_ENABLE=on RUSTFS_IDENTITY_OPENID_CONFIG_URL="https://login.microsoftonline.com/<tenant-id>/v2.0/.well-known/openid-configuration" RUSTFS_IDENTITY_OPENID_CLIENT_ID="<client-id>" RUSTFS_IDENTITY_OPENID_CLIENT_SECRET="<client-secret>" RUSTFS_IDENTITY_OPENID_SCOPES="openid,profile,email" RUSTFS_IDENTITY_OPENID_GROUPS_CLAIM="groups" RUSTFS_IDENTITY_OPENID_ROLES_CLAIM="roles"策略条件示例(直接用jwt:roles评估应用角色;配置roles_claim后,RustFS 也会将角色值合并进jwt:groups,以兼容旧策略):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["admin:*"], "Resource": ["arn:aws:s3:::*"], "Condition": { "ForAnyValue:StringEquals": { "jwt:roles": ["RustFS.ConsoleAdmin"] } } } ] }Webhook 事件通知快速开始(Docker)
docker run -d --name rustfs -p 9000:9000 \ -e RUSTFS_NOTIFY_ENABLE=true \ -e RUSTFS_NOTIFY_WEBHOOK_ENABLE_PRIMARY=on \ -e RUSTFS_NOTIFY_WEBHOOK_ENDPOINT_PRIMARY=http://<host-ip>:3020/webhook \ -e RUSTFS_NOTIFY_WEBHOOK_QUEUE_DIR_PRIMARY=/tmp/rustfs-events \ -e RUSTFS_OUTBOUND_ALLOW_ORIGINS=http://<host-ip>:3020 \ rustfs/rustfs:latest关键说明:
RUSTFS_NOTIFY_ENABLE=true开启全局通知模块开关。- 对 ARN
arn:rustfs:sqs::primary:webhook,使用带_PRIMARY后缀的实例级环境变量。 - 若省略队列目录,默认为
/opt/rustfs/events,需保证容器运行用户可写。 RUSTFS_NOTIFY_WEBHOOK_SKIP_TLS_VERIFY_PRIMARY默认false;开启会跳过 webhook TLS 证书校验,允许 MITM 攻击并输出启动告警。私有 CA 场景优先使用RUSTFS_NOTIFY_WEBHOOK_CLIENT_CA_PRIMARY。- 自
1.0.0-beta.11起,位于私有网络或容器网络(Compose 服务名、host.docker.internal、RFC 1918 地址)上的 webhook 端点默认被拦截,除非其精确的scheme://host:portorigin 被列入RUSTFS_OUTBOUND_ALLOW_ORIGINS(仅 origin,不含路径)。详见 docs/operations/outbound-connection-policy.md。
这里的出站连接策略是 RustFS 防 SSRF 的重要设计:RUSTFS_OUTBOUND_ALLOW_ORIGINS是进程级设置,启动时读取一次,单个 target 配置无法扩展它。其校验规则包括:必须是精确 origin(http://logstash:8080不能授权:9090或 https 变体)、仅限http/https、只接受 origin 不接受路径/query/fragment、拒绝 userinfo、非法列表直接 fail closed。即便放行后,云元数据端点(169.254.169.254)、链路本地地址(169.254.0.0/16、fe80::/10)与未指定地址(0.0.0.0、::)依然永久拦截,且 IPv4-mapped 形式(如::ffff:127.0.0.1)无法绕过(见 crates/utils/src/egress.rs 对应实现,文档事实来源为 docs/operations/outbound-connection-policy.md)。
分布式存储的底层原理:纠删码与数据耐久
要理解 RustFS 的"分布式与容错",需要看它的数据布局模型。仓库中的规范性文档 docs/architecture/erasure-coding.md 定义了算法与磁盘格式契约,几个核心事实如下:
- 模型:每个对象以 Reed–Solomon 纠删码存储在某个 erasure set 的多个盘上。一个含
N块盘的 set 被划分为data_blocks个数据分片与parity_blocks个校验分片(N = data_blocks + parity_blocks),采用 MDS(最大距离可分)编码,任意data_blocks个分片即可重建整个对象,最多容忍parity_blocks块盘同时丢失。 - 几何约束:
SET_SIZES = [2, 3, …, 16],每个多盘 erasure set 的盘数N ∈ 2..=16;单盘部署是唯一例外(N = 1、parity 0)。Set 大小选择在 crates/ecstore/src/layout/disks_layout.rs。 - 默认 parity:
default_parity_count(N)按盘数分档——N=1 为 0,N=2–3 为 1,N=4–5 为 2,N=6–7 为 3,N≥8 为 4(crates/ecstore/src/config/storageclass.rs)。 - 存储类:仅支持
STANDARD与REDUCED_REDUNDANCY两类,通过EC:<parity>形式的standard/rrs配置键或RUSTFS_STORAGE_CLASS_STANDARD/RUSTFS_STORAGE_CLASS_RRS环境变量覆盖;AWS 的STANDARD_IA、GLACIER等标签因未实现对应语义而被拒绝(InvalidStorageClass)。 - 与 MinIO 的对齐:采用 GF(2⁸) 上的字节级 RS(Vandermonde 矩阵)、1 MiB 纠删块、HighwayHash-256 bitrot 校验和——与 MinIO 同一族默认值,这是实现字节级
xl.meta互操作的基础。
这一层正是"Bitrot 防护、自愈与扫描器、Pool 扩容/退役"等 README 功能表条目的实现根基。相关 crate 在 Cargo.toml 中均有对应成员:rustfs-ecstore(纠删码存储实现)、rustfs-filemeta(文件元数据)、rustfs-heal(自愈)、rustfs-scanner(完整性扫描)等,整个 workspace 共 40+ 个 crate,覆盖 IAM、KMS、审计、通知、S3 Select、对象数据缓存等横切能力。
源码结构速览:从入口到核心模块
对想深入源码的读者,几个关键入口与模块路径如下:
- 进程入口:rustfs/src/main.rs(
run_process()进入 rustfs/src/startup_entrypoint.rs),启动流程被拆分为startup_*系列文件,涵盖存储、IAM、TLS、服务、通知、可观测性等阶段的初始化。 - 存储实现:crates/ecstore 是核心(
Cargo.toml注释为 "Erasure coding storage implementation"),其下bucket/、erasure/、layout/、object_api/、set_disk/、services/等子模块对应上文提到的各项能力。 - 配置模型:crates/config 负责服务端配置解析(
RUSTFS_*环境变量体系)。 - 身份与安全:crates/iam(IAM/策略/OIDC)、crates/kms(密钥管理)、crates/keystone(OpenStack Keystone)、crates/credentials。
- 协议:crates/protocols(FTPS/SFTP/WebDAV 等,对应 cargo features)、crates/s3select-query(S3 Select 查询引擎)。
- 运维观测:crates/obs(可观测性)、crates/audit(审计)、crates/notify(事件通知)。
- 测试体系:crates/e2e_test 提供大规模端到端测试(含
*_test.rs系列),docs/testing 下则有 CI 门禁、分布式 E2E 与安全回归等说明。
结语
RustFS 以 Rust 的内存安全与性能为底座,通过 Apache 2.0 许可与"无遥测"取向,为数据湖、AI 与大数据场景提供了一条 S3 兼容的对象存储路径。本文从 README 出发,覆盖了从一键脚本、Docker、源码构建、Helm、Nix 到 X-CMD 的六种部署方式,Pool 扩容拓扑约束、控制台访问、OIDC 角色映射、Webhook 通知与出站策略,以及纠删码底层的几何与 parity 规则。无论是快速体验还是规划生产集群,建议以本文引用的官方文档路径为索引,结合当前仓库版本(1.0.0-rc.5)的实际情况进行部署验证。
【免费下载链接】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),仅供参考