S3 compatible · Rust 2024

把对象,吞进自己的云。

吞吞(oss)是 Rust 编写的 S3 兼容对象存储。单盘、纠删码、多站点、3-voter 强一致,再叠加全链路 TLS 与控制面滚动升级——一套服务端跑起来。

  • Apache-2.0
  • aws-cli / rclone 可用
  • Docker 一键起
项目宠物吞吞,一只装着三块彩色对象立方体的存储桶
3 个 crateoss-server · xl-s3 · xl-store
EC 8+4多盘分片、quorum 写与读时修复
3 votersA/B 数据站点 + C control witness
v1.33.0 对象控制根(唯一后端)2026-11-08 · 单根 CAS · 文件 Raft · 无 SQLite

项目介绍

吞吞(oss)是一块自己养大的对象存储:Rust 2024 编写,S3 兼容,从单盘一直长到跨站点强一致。

它不是只把文件存进去的薄壳,而是把存储内核、纠删码、多盘 quorum、多站点复制、控制面和安全能力放在同一套代码里。你可以只跑一个进程做本地备份,也可以配置 3 个 voter 和 witness,让控制面在站点故障时继续工作。

项目从单盘切片开始,依次完成可用性、分布式、运维与 IAM、安全、数据流、多站点、控制面,走到 sync 桶与 Raft 强一致。2026-10-23 的能力边界清零补齐了 S3 协议细节、全链路 TLS、控制面作业/清单/分层/访问点与滚动升级;2026-10-24 的 v1.15.0 完成 AP/账户、TLS/CMK、tier 流式与多站点复制等硬化收口,v1.16.0 又补上 WebIdentity、MPU 跨节点、OSSCTL2、Batch 抢占与 M8 leader 门控等 backlog,v1.17.0 继续推进账户 MVP、DP-0 数据面握手、M7 对账与 M8 运行态 fencing;2026-10-25 的 v1.18.0 精简 README 并更新英文 README 与站点,无功能变更;2026-10-26 的 v1.19.0 完成 Wave1 地基:DP-1 数据面混版门控、能力级别 1..3 与 OSSCTL3、租户与 M8 运行态快照、维护模式与缩容只读规划;2026-10-27 的 v1.20.0 修复 Wave2 缺口:mesh gRPC 入站 TLS 物料热轮换、账户写路径改走 Raft、缩容 topology v4 与离线 apply/verify/commit/rollback,并补上真实滚动 e2e;2026-10-28 的 v1.20.1 补上账户软字节配额告警、缩容 4→3 真进程 loopback e2e,并修复 v1.20.0 源码归档的 Cargo.lock 错误;同日的 v1.21.0 补上控制台一致读、账户管理员 UI、tier 归档/直读摘要绑定与 AP 端点 registry,并修复 Raft follower 滞后导致的成员操作误 404;2026-10-29 的 v1.21.1 同步文档与站点;同日的 v1.22.0 修复桶配额并发与 follower 权限误 403,并补 tier-audit 与升级/迁移脚本;2026-10-30 的 v1.23.0 把 jobs/job_tasks 与 Restore 受理行纳入 Raft 复制(feature level 4),并修复任务重试抖动;同日的 v1.24.0 把 inventory 三表与 lifecycle 游标纳入复制(feature level 5);2026-10-31 的 v1.25.0 完成全对象 GET 流式直出、列举键缓存、分片并行写、异步审计与 feature level 6 作业保留;同日的 v1.26.0 交付 feature level 7 的恢复后续状态/调度租约复制、账户硬配额与规范化 worker,并补齐流式批量读与复制过滤;同日的 v1.27.0 交付 feature level 8 的硬配额配置/动态 VPC 端点命令、跨版本 MPU 有界回退、Level C Ext 能力协商、AP attested-proxy、Raft 快照分块与日志压缩/分段,以及停写蓝绿 preflight 与单机→集群工具化;2026-11-01 的 v1.28.0 加固 Raft 日志格式标记与旧区间压缩、M8 follower restore fencing、AP 直连 mTLS/AWS PrivateLink API 身份、CMK→legacy 离线全量迁移、Level C 只读排空与 JWT 多密钥轮换,并交付 feature level 9 的 opt-in 复制用量账本(严格硬配额),同时补上真实 v1.26.0 蓝绿、MPU 排空与单机→集群 e2e;2026-11-01 的 v1.28.1 为补丁版:CI 安装 protoc、修复最小配额夹具、收紧 AWS 端点测试与 mixed-MPU 脚本、裁剪历史计划文档;v1.28.2 修复其 CI 暴露的桶配额并发测试夹具;v1.28.3 修复 OLAP 变换流式输入超限的错误映射(400 而非 500);v1.28.4 仅稳定测试(等待异步缓存重载),无功能变更;v1.28.5 做性能与 CI 加固:DeleteObjects 请求级授权预加载、对象/版本列表批量并发读与 peer fan-out、健康探测并发、复制/审计索引、aether ingest 限流、sync 流式 tee,以及 CI 构建缓存与发布脚本;无 API/配置/Wire/数据格式变更;2026-11-03 的 v1.29.0 交付控制面去数据库化第一阶段:xl-store 系统命名空间 .oss.sys、控制对象 CAS/单调 fencing/持久化锁 token/提交证书与 quorum 读,vpc_endpoints 迁移到 ControlStore/ControlTxn 缝,SQLite 仍为默认后端,无外部行为变更;2026-11-05 的 v1.30.0 继续控制面去数据库化:访问点/OLAP、lifecycle/inventory/tier、buckets/bucket_policies/event_configs/replication_rules 的读写、快照与桶删除级联迁移到 ControlStore/ControlTxn 缝,并加入集群遗留控制对象重认证工具(只读 ReadControlRaw、canonical 分组、fenced 标记、CLI dry-run/apply),同时修复策略覆盖写的 SQLite UPSERT 触发器误报。2026-11-06 的 v1.31.0 交付对象控制存储后端(opt-in):27 张控制表的节点本地 COW B+tree、单根 CAS 与盘级多数派 quorum,文件 Raft 日志/元数据/快照与 witness,站点 LWW apply/ship/配对走缝,账户用量本地缓存,10 万行快照导入 8.3s。v1.32.0 移除 SQLite,对象控制根成为唯一后端:根 control/state/root CAS 提交,节点/大值内容寻址存于 .oss.sys/control/state/,本地运行态在 .oss.sys/local/,Raft 文件在 <raft.db_path>.d/;[cluster]/[stretch] 与 database_url 移除。割接需停全部节点,用归档的 v1.31.0 二进制执行 control-migrate,首次新写入后无反向写入器。v1.32.0 的缺省配置仍选择已删除的 SQLite 后端,未写 [server].control_backend 的安装启动即 panic;v1.32.1 让对象控制根无条件装配,并拒绝显式 sqlite。每个阶段都有验收记录和对应文档;当前可运行的 e2e 见 tests/(S3、M8、no-db、Kafka)。

它适合想理解对象存储内部实现的人,也适合需要一套可自托管、可审计、能继续改的 S3 兼容服务的团队。代码是开放的,边界也写清楚了:能做什么,不能做什么,都在 README 和版本日志里。

一块对象存储,
该有的都有。

从单机盘到跨站点控制面,oss 把常用的 S3 能力做进同一条数据路径,不靠外部组件拼装。

S3 协议,现有工具直接连

aws-cli、rclone 与 S3 SDK 走标准 SigV4。大文件自动 multipart,支持 UploadPartCopy、ListMultipartUploads、partNumber、v1 列表与 HEAD Range;浏览器也能分块上传与断点续传。

v1 listMPUpartNumberRange
aws --endpoint-url http://127.0.0.1:9000 s3 ls
aws s3 cp ./backup.tar s3://backup/

EC 8+4,多盘也不怕掉一块

每盘一份命名空间镜像,分片按 quorum 写入。拔盘可读、可修,启动与周期任务负责清理残骸。

8 data4 parity

多盘与自愈

多盘分片、quorum 读写、读修复、heal、scrub 与 rebalance,盘故障不靠重启恢复。

quorumslotshealscrub

安全与锁定

SSE-S3 / SSE-KMS、对象锁与保留期、匿名桶策略、STS 临时凭据、SK 加密存库,以及监听器/节点间/出站全链路 TLS;权限从管理员到桶主再到三档读写删。

SSETLSretentionSTSanonymous

数据会流动

事件通知接 Kafka(SASL/SSL),S3 Select 做查询,桶复制与多站点复制负责把版本送到另一端;读访问也会发 ObjectAccessed 事件。

多站点与强一致控制面

sync 桶 remote-first 写与删,多站点数据面,3-voter Raft 控制面([site] + [raft]),witness、11 表快照与 force recovery;控制面支持滚动升级窗口,数据面仍非滚动。v1.32.0 起静态 [cluster]/[stretch] 拓扑移除。图为多站点复制拓扑,强一致控制面在其上叠加 Raft 与 witness。

控制台与作业

访问点(含 -s3alias / DeleteObjects / SourceIp)、Object Lambda 与 Batch(WASM)、Inventory(Parquet/Hive)、分层(本地冷盘 / 远端 GC)与生命周期完整 Filter,以及一个能看见集群状态的 React 控制台。

对象控制根,v1.32 移除 SQLite

v1.31.0 已把 27 张控制表存为节点本地 COW B+tree,单根 CAS 提交、盘级多数派 quorum、启动 flock;Raft 使用文件日志/元数据/快照与元数据型 witness。v1.32.0 起对象控制根成为唯一后端:.oss.sys/control/state/{node,blob}/ 内容寻址、.oss.sys/local/ 本地运行态、<raft.db_path>.d/ 文件 Raft;sqlx/SQLite、migrations/、[cluster]/[stretch] 与 database_url 移除。升级为停全部节点的一次性单向割接:用归档的 oss-server-v1.31.0-linux-x86_64(sha256 fc2ea96fd0eb1777724da7b9ad07b4ad6520da7373bc9780099d8a211560b1ae)先 control-migrate --dry-run 再 --apply,首次新写入后只能前进。10 万行快照导入 8.3s(此前超时)、导出 1.5s;控制写 release build 实测单写 p99 9.2ms、8 写线程中位 p99 12.7ms、吞吐约 1.4k 次/s(SSD);高负载机械盘有 >20ms 尾尖峰,不宣称任意负载达标。v1.32.1 修复 v1.32.0 缺省配置选择已删除 SQLite 后端导致的启动 panic。

object controlno SQLiteone-way cutoverfile Raftsite seamv1-32-1

发布前四闸

fmt 与 clippy -D warnings 0 警告;库测试、S3 全量 e2e、E2E_LONG、M8 与 M9 分组验证;独立安全复审按 Critical/High 清零把关。

fmtclippye2esecurity

从单盘,到强一致。

每个里程碑都带着可运行的测试与文档往前走。吞吞不是一次写完的,它是被一轮轮验收喂大的。

内核与分布式

存储内核与分布式底座

单盘直存、Multipart、Range GET、多盘 EC 8+4、quorum 读写与混沌用例。

运维与安全

运维、IAM 与安全

版本控制、生命周期、桶策略、审计、heal/scrub、rebalance、多 set、SSE、对象锁与 STS。

数据流与多站点

数据流与多站点

事件通知 + Kafka、S3 Select、桶复制、站点对、LWW 控制面 changelog、快照出货与对象 outbox。

控制面与强一致

控制面与强一致

访问点、Object Lambda、Batch、Inventory、分层 Restore、sync 桶、stretch 2×6、3-voter Raft 与 witness。

2026-10

能力边界清零

补齐 S3 协议细节、全链路 TLS、控制面作业/清单/分层/访问点与滚动升级;四闸、全量 e2e 与安全复审收口。

2026-10-24

v1.15 硬化收口

AP/账户、TLS/CMK、tier 流式、多站点复制、Select Parquet、Inventory 跨账户与生命周期门控;强一致四组、控制面长跑、S3 全量 e2e 与 Web 9/9 复跑。

2026-10-24

v1.16 backlog 第二轮

WebIdentity、BZIP2、CMK 删除/rewrap、MPU 跨节点、OSSCTL2/LC-0、M6 token 远端、Batch 抢占/跨账户、M8 leader 门控、tier 清扫/预留;E2E_LONG、M8 tier/repl、M9 四组与安全复审收口。

查看完整版本日志

三个 crate,一条单向依赖。

存储内核不依赖框架,S3 适配层只做协议翻译,服务端负责把控制台、S3 与节点间通信装进一个 axum Router。

  • xl-store:提交协议、xl.meta、EC、盘布局与锁。
  • xl-s3:s3s trait 实现、SigV4、SSE、对象锁与访问点路由。
  • oss-server:控制台 API、上传、作业引擎、Raft 与 S3 fallback。

两条命令,先跑起来。

Docker 是最快路径。想改代码、做单机调试,就用源码构建。两种方式都会自动创建数据目录与管理员。

  1. 准备环境Docker 与 Compose,或者 Rust 1.89 与 protoc。
  2. 启动服务Docker 默认映射 9000 与 8080,源码模式默认 9000。
  3. 登录控制台首次启动会生成管理员口令,登录后创建访问密钥。
  4. 连接 S3把 endpoint、AK、SK 填进 aws-cli 或 rclone。
docker-compose.yml
git clone https://github.com/erikwang2013/oss.git
cd oss
docker compose up -d --build

# 首次启动后读取管理员口令
cat docker/secrets/generated.env

# S3: http://127.0.0.1:9000
# 控制台: http://127.0.0.1:8080

用你熟悉的 S3 工具。

把 endpoint 指向 oss,剩下的交给 aws-cli。建桶、上传、列目录、删除,都是标准 S3 操作。

  • 大文件自动 multipart,支持 Range GET 与断点续传。
  • 版本控制、生命周期、桶策略与对象锁按桶开启。
  • sync 桶写入先到远端,远端不可达时返回 503,不静默降级。

打开使用说明

aws-cli
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...
export AWS_DEFAULT_REGION=us-east-1

aws --endpoint-url http://127.0.0.1:9000 s3 mb s3://backup
aws --endpoint-url http://127.0.0.1:9000 s3 cp ./data.tar s3://backup/
aws --endpoint-url http://127.0.0.1:9000 s3 ls s3://backup/
aws --endpoint-url http://127.0.0.1:9000 s3 rm s3://backup/data.tar

最近的版本。

每个已发布版本都有对应的 tag、Release 与验收记录。完整历史在版本日志页。

v1.33.0

清理版:移除无生产调用的 xl-client/xl-proto(gRPC mesh)及 mesh TLS 代码与测试,工作区收敛为三个 crate;删除未引用表情资源,字体栈切换为开源/系统字体。无 API/数据格式变更。

查看
v1.32.4

控制台基础镜像更新:node 24-alpine 构建、nginx 1.30-alpine 运行,CI Node 24;workspace MSRV 修正为 1.96 以匹配 s3s 0.17。无 API/数据格式变更。

查看
v1.32.3

依赖更新与清理:ecat 7.3、jwt-rust 1.0.5 等 Rust 同主版本升级,web 37 个 npm 包更新(audit 0),Actions v7;删除约 290 行不可达双后端代码、pre-H1 夹具和失效的 cluster docker 示例。无 API/数据格式变更。

查看
v1.32.2

依赖安全补丁:vendor 修复移除 protobuf 2.28、lru 0.7.8 与 unmaintained instant,cargo audit 退出 0;同时修正站点/贡献者文档中的旧版本与已删除脚本引用。无 API/数据格式变更。

查看
v1.32.1

修复 v1.32.0 缺省配置仍选择已删除 SQLite 后端导致的启动 panic:对象控制根无条件装配,显式 control_backend = "sqlite" 以迁移指引拒绝;清理冻结 goldens 与 no-db 门禁,修正归档 v1.31.0 二进制 sha256。

查看
v1.32.0

移除 SQLite,对象控制根成为唯一后端;根 control/state/root CAS、内容寻址节点/大值、本地运行态与文件 Raft;删除 sqlx/SQLite、migrations/、[cluster]/[stretch] 与 database_url。升级为停全部节点的一次性单向割接,使用归档的 v1.31.0 二进制与 sha256 校验;首次新写入后无反向写入器。

查看
v1.31.0

对象控制存储根(opt-in):27 张控制表的节点本地 COW B+tree、单根 CAS、盘级多数派 quorum;文件 Raft 日志/元数据/快照与 witness;站点 LWW apply/ship/配对走缝;账户用量本地缓存;10 万行快照导入 8.3s、导出 1.5s。v1.32.0 已移除 SQLite 并使其成为唯一后端;v1.32.1 修复默认配置启动。

查看
v1.30.0

控制面读写缝全覆盖:访问点/OLAP、lifecycle/inventory/tier、buckets 策略/事件/复制迁移到 ControlStore/ControlTxn,快照与桶删除级联同路径;新增集群遗留控制对象重认证工具;修复策略覆盖写的 SQLite UPSERT 触发器误报。SQLite 仍为默认后端,无 API/配置/Wire/数据格式变更。

查看
v1.29.0

控制面去数据库化第一阶段:.oss.sys 系统命名空间、控制对象 CAS/单调 fencing、持久化锁 token,vpc_endpoints 迁移到 ControlStore 缝;SQLite 仍为默认后端,无 API/配置/Wire/数据格式变更。

查看
v1.28.5

性能与 CI 加固:DeleteObjects 授权预加载、列表并发读/peer fan-out、健康探测并发、查询索引、aether 限流、sync 流式 tee,以及 CI 缓存与发布脚本。

查看
v1.28.4

补丁版:仅稳定测试,等待 apply 后的异步 AP/OLAP 缓存重载;无功能、配置或数据格式变更。

查看
v1.28.3

补丁版:修复 OLAP 变换流式输入超限返回 500 而非 400 EntityTooLarge;同时识别 BodySizeLimitExceeded 与 LengthLimitError。

查看
v1.28.2

补丁版:修复 v1.28.1 CI 暴露的桶配额并发测试夹具(并发下复用实际成功的桶名);无功能变更。

查看
v1.28.1

补丁版:CI 安装 protoc、最小配额夹具兼容缺 users 表、收紧 AWS 端点测试与 mixed-MPU shell 局部变量、裁剪历史计划/SDD 文档;无功能变更。

查看
v1.28.0

升级安全版:Raft 日志格式标记/旧区间压缩、M8 restore fencing、AP mTLS/AWS API、CMK→legacy 离线迁移、feature 9 严格硬配额账本、只读排空、JWT 轮换与真实升级 e2e。

查看
v1.27.0

分布式存储版:feature 8 硬配额/VPC 端点命令、跨版本 MPU 有界回退、Ext 能力协商、AP attested-proxy、Raft 日志压缩/分段与停写蓝绿 preflight。

查看
v1.25.0

硬化版:全对象 GET 流式直出、列举键缓存、分片并行写、异步审计队列、feature 6 JobPurge 保留,并合入授权/DoS 审计修复。

查看
v1.24.0

功能版:M8-2 inventory 三表与 lifecycle 游标 Raft 复制(feature 5)、独立激活守卫、桶删除级联。

查看
v1.23.0

功能版:M8-2 jobs/Restore 受理行 Raft 复制(feature 4)、重试抖动修复、LC-4 与 4 节点 re-ingest e2e。

查看
v1.22.0

功能版:桶配额并发、follower 权限追赶、tier-audit、升级 preflight 与单机→集群 re-ingest。

查看
v1.21.1

文档补丁:同步文档与站点,清理已删除的旧兼容线引用;无代码变更。

查看
v1.21.0

功能版:控制台一致读、账户管理员 UI、tier 摘要绑定、AP 端点 registry,修复 Raft follower 滞后误 404。

查看
v1.20.1

补丁:账户软字节配额告警、shrink 4→3 真进程 e2e、修复 v1.20.0 源码归档的 Cargo.lock。

查看
v1.20.0

Wave2 修复:mesh 入站 TLS 热轮换、Raft 账户命令、缩容 topology v4 与离线 apply/verify/commit/rollback、真实滚动 e2e。

查看
v1.19.0

Wave1 地基:DP-1 混版门控、能力级别 1..3/OSSCTL3、租户与 M8 运行态快照、维护模式与缩容只读规划。

查看
v1.18.0

文档精简:README 移除进度/验收/计划,英文 README 更新;功能与 API 无变化。

查看
v1.17.0

架构切片:账户 MVP、AP 跨账户、DP-0 数据面握手、M7 对账、M8 运行态 fencing、CMK 运维与 WebIdentity 加固。

查看
v1.16.0

backlog 第二轮:WebIdentity、BZIP2、CMK 删除/rewrap、MPU 跨节点、OSSCTL2、Batch 抢占/跨账户、M8 leader 门控。

查看
v1.15.0

硬化收口:AP 匿名/账户、TLS 热加载与 CMK、tier 流式、多站点版本复制、Select Parquet、Inventory 跨账户。

查看
v1.14.0

能力边界清零:S3 协议补全、全链路 TLS、控制面边界与滚动升级。

查看
v1.13.1

灾备恢复基线快照、Raft RPC target 校验、stretch 配对镜像比较、cutover 字段级冲突。

查看
v1.13.0

同步强一致:sync 桶、stretch 2×6、3-voter Raft 控制面与 witness。

查看
v1.12.0

控制面:访问点、Object Lambda、Batch、Inventory、分层 Restore 与控制台。

查看
v1.11.0

多站点异步复制:站点对、changelog 快照出货与对象 outbox。

查看

完整版本日志

标准 S3 API,现有工具直接连。

oss 的对外协议是 S3,直接用 aws-cli、rclone 或任意 S3 SDK 接入,不引入私有客户端。

  • API 文档:端点、认证、最小请求与协议边界。
  • oss README:安装、配置、完整 S3 操作与运维命令(随发布同步)。
  • 支持 SigV4、Multipart Upload、Range、版本控制、生命周期、桶策略、对象锁、事件通知、Select、复制与访问点。
aws-cli官方 CLI,路径风格直接连兼容
rclone同步、挂载与断点续传兼容
SDK任意 S3 SDK(SigV4)兼容
Console浏览器控制台分块上传与管理说明

下载 v1.33.0

Release 提供源码归档,以及用于 v1.32.0 割接的归档二进制 oss-server-v1.31.0-linux-x86_64(sha256 fc2ea96fd0eb1777724da7b9ad07b4ad6520da7373bc9780099d8a211560b1ae);割接步骤见 runbook。日常部署仍推荐 Docker Compose 或按安装文档从源码构建。

赞赏二维码

赞赏二维码

扫码请吞吞喝一杯,感谢支持。

架构图

架构图

滚轮/双指缩放,拖动平移,双击切换适配/2×;点击背景或按 Esc 关闭。