[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-83301":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":13,"contributorsCount":13,"subscribersCount":13,"size":13,"stars1d":15,"stars7d":16,"stars30d":16,"stars90d":13,"forks30d":13,"starsTrendScore":17,"compositeScore":13,"rankGlobal":10,"rankLanguage":10,"license":10,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":20,"hasPages":20,"topics":21,"createdAt":10,"pushedAt":10,"updatedAt":22,"readmeContent":23,"aiSummary":10,"trendingCount":13,"starSnapshotCount":13,"syncStatus":24,"lastSyncTime":25,"discoverSource":26},83301,"mini-minio","sanbei101\u002Fmini-minio","sanbei101","从0到1实现一个简化版本的minio","https:\u002F\u002Fsanbei101.github.io\u002Fmini-minio\u002F",null,"Go",58,0,53,1,5,6,false,"main",true,[],"2026-06-12 02:04:33","\u003Cp align=\"center\">\n  \u003Ch1 align=\"center\">mini-minio\u003C\u002Fh1>\n  \u003Cp align=\"center\">🪣 一个精简、高性能的 S3 兼容对象存储,内置纠删码\u003C\u002Fp>\n  \u003Cp align=\"center\">\n    \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsanbei101\u002Fmini-minio\u002Factions\u002Fworkflows\u002Ftest.yml\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fsanbei101\u002Fmini-minio\u002Factions\u002Fworkflows\u002Ftest.yml\u002Fbadge.svg\" alt=\"CI\">\u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Fpkg.go.dev\u002Fgithub.com\u002Fsanbei101\u002Fmini-minio\">\u003Cimg src=\"https:\u002F\u002Fpkg.go.dev\u002Fbadge\u002Fgithub.com\u002Fsanbei101\u002Fmini-minio.svg\" alt=\"Go Reference\">\u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Fgolang.org\u002F\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGo-1.26-blue.svg\" alt=\"Go Version\">\u003C\u002Fa>\n    \u003Ca href=\"LICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-green.svg\" alt=\"License\">\u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Fgoreportcard.com\u002Freport\u002Fgithub.com\u002Fsanbei101\u002Fmini-minio\">\u003Cimg src=\"https:\u002F\u002Fgoreportcard.com\u002Fbadge\u002Fgithub.com\u002Fsanbei101\u002Fmini-minio\" alt=\"Go Report Card\">\u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Fsanbei101.github.io\u002Fmini-minio\u002F\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F📖_电子书-Live_Site-purple\" alt=\"Book\">\u003C\u002Fa>\n  \u003C\u002Fp>\n\u003C\u002Fp>\n\n---\n\n**mini-minio** 是 [MinIO](https:\u002F\u002Fgithub.com\u002Fminio\u002Fminio) 核心功能的精简实现。保留了纠删码、并行磁盘 I\u002FO、多集合架构等高性能设计,去掉了分布式通信、自愈、加密、IAM 等生产级复杂度--专注于**学习和理解**对象存储的核心原理。\n\n> 如果你想了解 S3 协议、Reed-Solomon 纠删码、高并发磁盘 I\u002FO 是如何协同工作的,这个项目就是为你准备的。\n\n## 📖 配套电子书\n\n本项目附带一本 **电子书**,讲解 MinIO 的核心原理与 mini-minio 的实现细节:\n\n> **[Mini-Minio 开发指南](https:\u002F\u002Fsanbei101.github.io\u002Fmini-minio\u002F)** - 从零构建一个轻量级对象存储系统\n\n| 章节 | 内容 |\n|------|------|\n| **第 1 章 · S3 协议基础** | Bucket \u002F Object \u002F Key 三大概念,AWS SigV4 签名四步流程,API 路由设计 |\n| **第 2 章 · 纠删码原理与实现** | Reed-Solomon 算法、Galois 域、流式编解码、multiWriter \u002F parallelReader、缓冲池 |\n| **第 3 章 · Bucket 操作** | 并行创建 \u002F 删除 \u002F 列举,Quorum 一致性,与原版 MinIO 的架构对比 |\n| **第 4 章 · Object 操作** | PutObject 11 步流程、GetObject 流式解码、Range 请求、元数据投票机制 |\n| **第 5 章 · 二级接口** | 分片上传、Presigned URL、认证中间件、Range 下载与纠删码的集成 |\n| **第 6 章 · 分布式设计** | Erasure Set 分区、CRC32 路由、跨集合列举、Quorum 机制、write-then-rename |\n\n每章均包含:核心概念讲解 → 源码逐行分析 → 与原版 MinIO 的详细对比表。\n\n**[开始阅读 →](https:\u002F\u002Fsanbei101.github.io\u002Fmini-minio\u002F)**\n\n## ✨ 特性\n\n- **S3 兼容 REST API** - 完整支持 10 个核心操作(GetObject \u002F PutObject \u002F DeleteObject \u002F ListObjects \u002F Multipart Upload \u002F Bucket CRUD \u002F Presigned URL)\n- **Reed-Solomon 纠删码** - 基于 [klauspost\u002Freedsolomon](https:\u002F\u002Fgithub.com\u002Fklauspost\u002Freedsolomon),数据分片存储到多块磁盘,容忍磁盘故障\n- **多集合架构** - 对象通过 CRC32 哈希分配到不同 Erasure Set,实现负载均衡\n- **并行磁盘 I\u002FO** - 读写删查全部并行执行,通过 Quorum 机制保证一致性\n- **AWS Signature V4** - 支持 Header 认证和 Presigned URL,兼容标准 AWS SDK \u002F CLI\n- **流式编解码** - 10 MiB 分块流式编码,pipe-based 并行解码,内存占用可控\n- **4K 对齐缓冲池** - channel 实现的有界缓冲池,配合纠删码库的对齐分配\n- **HTTP Range 请求** - 支持 `bytes=start-end` 和 `bytes=-suffix` 格式\n- **原子元数据写入** - write-then-rename 模式保证 `xl.meta` 一致性\n\n## 🚀 快速开始\n\n### 安装\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fsanbei101\u002Fmini-minio.git\ncd mini-minio\ngo build -o mini-minio .\n```\n\n### 启动\n\n```bash\n# 无认证模式(开发\u002F测试用)\n.\u002Fmini-minio --addr :9000 --data .\u002Fdata\n\n# 带认证\n.\u002Fmini-minio --addr :9000 --data .\u002Fdata \\\n  --access-key minioadmin \\\n  --secret-key minioadmin\n```\n\n### 使用 MinIO 客户端测试\n\n```bash\n# 安装 mc(如果还没有)\n# https:\u002F\u002Fmin.io\u002Fdocs\u002Fminio\u002Flinux\u002Freference\u002Fminio-mc.html\n\n# 配置别名\nmc alias set local http:\u002F\u002Flocalhost:9000 minioadmin minioadmin\n\n# 创建 bucket\nmc mb local\u002Fmybucket\n\n# 上传文件\nmc cp myfile.txt local\u002Fmybucket\u002F\n\n# 下载文件\nmc cp local\u002Fmybucket\u002Fmyfile.txt .\u002Fdownloaded.txt\n\n# 列出对象\nmc ls local\u002Fmybucket\u002F\n```\n\n## 🏗️ 架构\n\n```\n                           ┌─────────────────────────────────────────┐\n                           │              S3 Client                  │\n                           │   (mc \u002F AWS SDK \u002F curl \u002F warp)          │\n                           └────────────────┬────────────────────────┘\n                                            │ HTTP\n                           ┌────────────────▼────────────────────────┐\n                           │          Auth Middleware                 │\n                           │       (AWS Signature V4)                │\n                           └────────────────┬────────────────────────┘\n                                            │\n                           ┌────────────────▼────────────────────────┐\n                           │          S3 API Router                  │\n                           │         (gorilla\u002Fmux)                   │\n                           └────────────────┬────────────────────────┘\n                                            │\n                           ┌────────────────▼────────────────────────┐\n                           │         ObjectLayer Interface           │\n                           └────────────────┬────────────────────────┘\n                                            │\n                    ┌───────────────────────┼───────────────────────┐\n                    │                       │                       │\n           ┌────────▼────────┐    ┌────────▼────────┐    ┌────────▼────────┐\n           │  erasureSets    │    │  Buffer Pool    │    │  Hash Reader    │\n           │  (CRC32 路由)   │    │  (4K 对齐)      │    │  (MD5\u002FSHA256)   │\n           └────────┬────────┘    └─────────────────┘    └─────────────────┘\n                    │\n     ┌──────────────┼──────────────┐\n     │              │              │\n┌────▼─────┐  ┌────▼─────┐  ┌────▼─────┐\n│  Set 0   │  │  Set 1   │  │  Set N   │\n│ 4+2 纠删 │  │ 4+2 纠删 │  │ 4+2 纠删 │\n├──────────┤  ├──────────┤  ├──────────┤\n│ D D D D  │  │ D D D D  │  │ D D D D  │\n│ P P      │  │ P P      │  │ P P      │\n└──────────┘  └──────────┘  └──────────┘\n  D = 数据分片    P = 校验分片\n```\n\n**数据流:**\n1. 客户端发送 S3 请求(带 SigV4 签名)\n2. 路由器解析请求,转发到对应的 handler\n3. `erasureSets` 根据对象名的 CRC32 哈希选择目标 Set\n4. `erasureObjects` 将数据流式编码为 N 个分片,并行写入磁盘\n5. 元数据通过 write-then-rename 原子写入 `xl.meta`\n\n## ⚙️ 配置\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `--addr` | `:9000` | 监听地址 |\n| `--data` | `.\u002Fdata` | 数据目录 |\n| `--data-blocks` | `4` | 每个 Set 的数据分片数 |\n| `--parity-blocks` | `2` | 每个 Set 的校验分片数 |\n| `--sets` | `1` | Erasure Set 数量 |\n| `--access-key` | *(空)* | 访问密钥(空则跳过认证) |\n| `--secret-key` | *(空)* | 秘密密钥 |\n\n> 磁盘总数 = `(data-blocks + parity-blocks) × sets`,程序会自动创建对应数量的磁盘目录。\n\n## 📡 API 参考 (s3兼容)\n\n| 操作 | 方法 | 路径 | 说明 |\n|------|------|------|------|\n| 列出 Bucket | `GET` | `\u002F` | 返回所有 Bucket |\n| 创建 Bucket | `PUT` | `\u002F{bucket}\u002F` | 创建新 Bucket |\n| 删除 Bucket | `DELETE` | `\u002F{bucket}\u002F` | 删除空 Bucket |\n| 检查 Bucket | `HEAD` | `\u002F{bucket}\u002F` | 检查 Bucket 是否存在 |\n| 列出对象 | `GET` | `\u002F{bucket}\u002F` | 支持 prefix \u002F delimiter \u002F continuation-token |\n| 上传对象 | `PUT` | `\u002F{bucket}\u002F{key}` | 支持 aws-chunked 编码 |\n| 下载对象 | `GET` | `\u002F{bucket}\u002F{key}` | 支持 HTTP Range |\n| 检查对象 | `HEAD` | `\u002F{bucket}\u002F{key}` | 返回对象元数据 |\n| 删除对象 | `DELETE` | `\u002F{bucket}\u002F{key}` | 删除指定对象 |\n| 初始化分片上传 | `POST` | `\u002F{bucket}\u002F{key}?uploads` | 返回 uploadId |\n| 上传分片 | `PUT` | `\u002F{bucket}\u002F{key}?partNumber=&uploadId=` | 上传单个分片 |\n| 完成分片上传 | `POST` | `\u002F{bucket}\u002F{key}?uploadId=` | 合并所有分片 |\n| 中止分片上传 | `DELETE` | `\u002F{bucket}\u002F{key}?uploadId=` | 取消上传 |\n\n## 📂 项目结构\n\n```\nmini-minio\u002F\n├── main.go                        # 入口:参数解析、磁盘初始化、启动服务\n├── cmd\u002F\n│   ├── api-handlers.go            # HTTP 路由、S3 处理器、中间件\n│   ├── erasure-object.go          # 单集合 ObjectLayer 实现、元数据、分片上传\n│   ├── erasure-sets.go            # 多集合 ObjectLayer、CRC32 路由\n│   ├── object-api-interface.go    # ObjectLayer 接口定义(9 个方法)\n│   ├── object-api-datatypes.go    # 数据类型:BucketInfo \u002F ObjectInfo \u002F ...\n│   ├── signature-v4.go            # AWS SigV4 认证实现\n│   ├── httprange.go               # HTTP Range 解析\n│   ├── errors.go                  # 错误类型定义\n│   ├── *_test.go                  # 集成测试 + 基准测试\n│   └── erasure_bench_test.go      # 性能基准测试\n├── internal\u002F\n│   ├── erasure\u002F\n│   │   ├── erasure.go             # 纠删码引擎:Encode \u002F Decode \u002F multiWriter \u002F parallelReader\n│   │   └── errors.go              # ErrWriteQuorum\n│   ├── storage\u002F\n│   │   └── disk.go                # 磁盘抽象:文件系统操作、xl.meta 读写\n│   ├── bpool\u002F\n│   │   └── bpool.go               # 4K 对齐的有界缓冲池\n│   └── hash\u002F\n│       └── reader.go              # 流式 MD5\u002FSHA256 校验\n├── copy\u002F                          # MinIO 源码参考(仅用于学习)\n├── data\u002F                          # 运行时数据目录\n└── .github\u002Fworkflows\u002F\n    ├── test.yml                   # CI:测试 + 基准 + pprof\n    └── warp-bench.yml             # CI:warp S3 压力测试\n```\n\n## 📊 基准测试\n\n项目内置了全面的基准测试,CI 中会自动运行 [warp](https:\u002F\u002Fgithub.com\u002Fminio\u002Fwarp) S3 压力测试:\n\n```bash\n# 运行所有基准测试\ngo test -bench=. -benchmem .\u002Fcmd\u002F\n\n# 运行特定基准\ngo test -bench=BenchmarkPutObject -benchmem .\u002Fcmd\u002F\ngo test -bench=BenchmarkGetObject -benchmem .\u002Fcmd\u002F\ngo test -bench=BenchmarkErasure -benchmem .\u002Fcmd\u002F\n```\n\n**内置基准测试项:**\n\n| 基准测试 | 说明 |\n|----------|------|\n| `BenchmarkPutObject_SmallFile` | 1KB 文件写入 |\n| `BenchmarkPutObject_MediumFile` | 100KB 文件写入 |\n| `BenchmarkPutObject_LargeFile` | 1MB 文件写入 |\n| `BenchmarkGetObject` | 100KB 文件读取 |\n| `BenchmarkPutObject_Parallel` | 并行写入(4+2 配置) |\n| `BenchmarkGetObject_Parallel` | 并行读取(4+2 配置) |\n| `BenchmarkErasureEncode` | 原始编码(4+2 \u002F 6+2) |\n| `BenchmarkErasureDecode` | 原始解码(4+2) |\n| `BenchmarkListObjects` | 列举 100 个对象 |\n| `BenchmarkDiskWriteComparison` | 2+1 \u002F 4+2 \u002F 6+2 写入对比 |\n\n## 🗺️ 路线图\n\n### ✅ 已完成\n\n- [x] S3 兼容 REST API(10 个核心操作)\n- [x] Reed-Solomon 纠删码(流式编解码)\n- [x] 多集合架构 + CRC32 路由\n- [x] 并行磁盘 I\u002FO + Quorum 一致性\n- [x] AWS Signature V4 认证(Header + Presigned URL)\n- [x] HTTP Range 请求支持\n- [x] 分片上传(内存模式)\n- [x] 4K 对齐缓冲池\n- [x] 原子元数据写入(write-then-rename)\n- [x] 完整的集成测试和基准测试\n- [x] CI 自动化测试 + warp 压力测试\n\n### 🔜 计划中\n\n- [ ] 磁盘化分片上传(当前为内存模式,大文件会 OOM)\n- [ ] Content-Type 自动检测\n- [ ] hashOrder 磁盘分片分布(优化 I\u002FO 均衡)\n- [ ] StorageAPI 接口抽象\n- [ ] FileInfo 数据类型\n- [ ] MessagePack 元数据编码\n\n## 🔄 与 MinIO 的对比\n\n| 特性 | mini-minio | MinIO |\n|------|:----------:|:-----:|\n| S3 核心 API | ✅ | ✅ |\n| 纠删码 | ✅ | ✅ |\n| 多集合架构 | ✅ | ✅ |\n| AWS SigV4 | ✅ | ✅ |\n| 分片上传 | ✅ (内存) | ✅ (磁盘) |\n| 分布式模式 | ❌ | ✅ |\n| 自愈 (Healing) | ❌ | ✅ |\n| 加密 (SSE) | ❌ | ✅ |\n| IAM \u002F 策略 | ❌ | ✅ |\n| 版本控制 | ❌ | ✅ |\n| 事件通知 | ❌ | ✅ |\n| 生命周期管理 | ❌ | ✅ |\n| 监控指标 | ❌ | ✅ |\n| 依赖数量 | **4** | 50+ |\n| 代码行数 | **~2000** | ~200K |\n\n> mini-minio 的目标不是替代 MinIO,而是**帮助你理解 MinIO 的核心设计**。\n\n## 🤝 参与贡献\n\n1. Fork 本仓库\n2. 阅读 `.\u002Fcopy` 目录中的 MinIO 源码,理解原版实现\n3. 在 `cmd\u002F` 或 `internal\u002F` 中实现你的改动\n4. 运行代码检查和测试:\n   ```bash\n   golangci-lint run --fix   # 检查代码质量\n   golangci-lint fmt          # 格式化代码\n   go test .\u002F...              # 运行所有测试\n   ```\n5. 提交 Pull Request\n",2,"2026-06-11 04:10:51","CREATED_QUERY"]