项目成熟度
GitHub - ceph/ceph: Ceph is a distributed object, block, and file storage platform
项目 | GitHub Star 数量(截至 2025 年 5 月) | 贡献者数量 | 初始发布时间 | 主要开源协议 |
---|---|---|---|---|
Ceph | ≈15.0K(稳定增长,社区成熟)410 | 1172+ | 2010 年 | LGPL |
MinIO | ≈52.7K(快速增长,高人气)58 | 421+ | 2014 年 | GNU AGPL v3 |
SeaweedFS | ≈24.2K(中等增速,技术优势驱动)39 | 146+ | 2015 年 | Apache-2.0 |
功能区别
对比维度 | Ceph | MinIO | SeaweedFS |
---|---|---|---|
功能定位 | 统一存储(对象、块、文件) | 专注对象存储(100% S3兼容) | 专注对象存储(支持小文件优化,兼顾大文件) |
适用场景 | 超大规模、多协议需求(混合云、实时处理) | 中小规模、云原生、单一对象存储需求 | 高并发读写、海量小文件场景(如日志、图片),也可用于大文件存储 |
性能 | 依赖硬件和调优(如SSD加速),多协议负载均衡 | 高吞吐量,适合大文件(MP4)的并发读写 | 高吞吐低延迟,支持并行读写(通过Volume服务器分散负载) |
数据冗余 | 支持多副本或纠删码,跨数据中心容灾 | 纠删码(默认),容错能力高(半数节点故障容忍) | 支持纠删码和复制策略,容错灵活(可自定义副本数) |
部署复杂度 | 复杂(需配置Monitor/OSD/MDS等组件) | 简单(单文件或容器化部署) | 较简单(Master+Volume架构,单机或分布式一键部署) |
运维成本 | 高(依赖专业团队调优) | 低(自动化管理,Web界面监控) | 中等(需管理Master节点,但组件轻量) |
扩展性 | 动态扩容(在线添加节点,自动平衡数据) | 静态扩容(需手动添加节点,扩展期间可能影响性能) | 动态扩容(可添加Volume节点,自动分配数据) |
生态兼容性 | 多协议支持(与OpenStack/Kubernetes集成) | 无缝兼容S3生态(AWS CLI/SDK等) | 兼容S3(部分API支持),提供Filer网关扩展文件系统接口 |
硬件成本 | 高(需高性能硬件支撑多协议负载) | 低(普通硬件即可满足) | 极低(轻量级设计,普通硬件高效运行) |
一致性模型 | 强一致性(数据立即可用) | 最终一致性(大规模并发时可能延迟) | 最终一致性(默认),可配置强一致性 |
单点风险 | 无(分布式架构无中心节点) | 无(分布式架构无中心节点) | 依赖Master节点(需部署多Master避免单点故障) |
选型建议 | 超大规模、多协议、强一致性需求 | 中小规模、轻量级、S3兼容需求 | 高并发读写、海量文件存储、低成本场景 |
总结
-
MinIO 适合 S3 兼容和快速交付;
-
Ceph 适合复杂企业级需求;
-
SeaweedFS 适合高并发、低成本场景,需注意 Master 节点的高可用设计。
MinIO C++ SDK
MinIO C++ SDK 是简单存储服务(又名 S3)客户端,用于对任何 Amazon S3 兼容的对象存储服务执行存储桶和对象作。使用时需遵循 Apache License 2.0 协议。商用时的具体要求:
-
保留版权声明和许可证声明 :在软件的文档和源代码中,必须保留原始的版权声明和许可证声明。这是对原作者权益的基本尊重,也是确保软件合法使用的重要依据。
-
明确专利授权 :如果软件中包含了贡献者的专利技术,Apache License 2.0 要求明确专利授权,但不对专利授权的范围做出限制,贡献者向用户提供良好的法律保障。
-
免责声明 :提供代码的组织或个人应提供免责声明,说明本软件只用于非商业性质的个人学习、研究或其他非商业活动。
除了 MinIO 服务器外,还兼容以下对象存储服务:
存储服务 | 说明 |
---|---|
Amazon S3 | 最知名的云存储服务,提供高扩展性和耐用性。 |
阿里云 OSS | 阿里云的对象存储服务,适合大规模数据存储。 |
腾讯云 COS | 腾讯云的对象存储服务,支持多种数据存储场景。 |
华为云 OBS | 华为云的对象存储服务,提供高性能和高可靠性的存储。 |
Google Cloud Storage | Google 提供的云存储服务,与 S3 兼容。 |
IBM Cloud Object Storage | IBM 的云存储服务,支持多种数据存储需求。 |
MinIO C++ SDK 的兼容性基于其对 Amazon S3 协议的实现,因此任何支持该协议的对象存储服务理论上都可以与 MinIO C++ SDK 配合使用。
版本和依赖项
MinIO C++ SDK 目前的版本为 0.3.0,需要:
-
C++17 编译器支持
-
CMake 3.10 或更高版本(用于建筑)
-
vcpkg 包管理器(建议用于依赖项管理)
关键依赖项包括:
Library | 目的 |
---|---|
curlpp | HTTP communication |
openssl | 加密和 TLS 支持 |
nlohmann-json | JSON parsing |
pugixml | XML parsing |
inih | 配置解析 |
zlib | 压缩(Windows 平台) |
核心功能
桶操作相关
存储桶作允许您在与 S3 兼容的存储中创建、列出、检查是否存在和删除存储桶。存储桶充当对象的容器,并提供一种组织和控制对数据的访问的方法。
操作 | 描述 | 方法 |
---|---|---|
生成存储桶 | 创建新存储桶 | Client::MakeBucket |
列出存储桶 | 列出经过身份验证的用户的所有存储桶 | Client::ListBuckets |
存储桶存在 | 检查存储桶是否存在 | Client::BucketExists |
删除存储桶 | 删除空存储桶 | Client::RemoveBucket |
其他存储桶操作
SDK 还支持用于管理 Bucket 配置的作:
-
存储桶策略 :使用 和 控制对存储桶和对象的访问
GetBucketPolicy``SetBucketPolicy
-
存储桶加密 :使用 和 管理服务器端加密设置
GetBucketEncryption``SetBucketEncryption
-
存储桶生命周期 :使用 和 定义对象生命周期规则
GetBucketLifecycle``SetBucketLifecycle
-
存储桶通知 :使用 和 配置事件通知
GetBucketNotification``SetBucketNotification
-
存储桶标记 :将元数据标签分配给具有 和 的存储桶
GetBucketTags``SetBucketTags
-
存储桶版本控制 :使用 和 启用和配置对象版本控制
GetBucketVersioning``SetBucketVersioning
-
存储桶复制 :使用 和 配置跨区域复制
GetBucketReplication``SetBucketReplication
对象操作相关
对象作提供了上传、下载、复制和管理存储桶中的对象(文件)的核心功能。
操作 | 描述 | 方法 |
---|---|---|
放置对象 | 将对象上传到存储桶 | Client::PutObject |
获取对象 | 下载带有 callback 的对象以进行数据处理 | Client::GetObject |
下载对象 | 将对象下载到本地文件 | Client::DownloadObject |
上传对象 | 将本地文件作为对象上传 | Client::UploadObject |
复制对象 | 将对象从一个位置复制到另一个位置 | Client::CopyObject |
Stat 对象 | 检索对象元数据 | Client::StatObject |
删除对象 | 删除单个对象 | Client::RemoveObject |
移除对象 | 在单个请求中删除多个对象 | Client::RemoveObjects |
列出对象 | 列出支持迭代的存储桶中的对象 | Client::ListObjects |
高级功能
-
大文件的分段上传
-
对象保留和依法保留
-
对象保留是一种机制,可以防止对象在指定时间段内被删除或修改。
-
依法保留是一种独立于时间的保护机制,无论保留期是否到期,都无法删除对象。
-
-
服务器端加密
-
预签名 URL
-
存储桶通知
- 允许您实时监听存储桶中发生的事件,当对象被创建、删除或访问时,系统会发送通知
-
选择对象内容(查询对象)
对象分段
允许将大型对象分成较小的部分,以实现更高效、更可靠的上传。**MinIO C++ SDK 本身未明确提供自动重传的接口,但可以通过编程逻辑实现重传功能。**例如,在上传文件时,如果出现网络错误等异常情况,可以在代码中捕获异常并重新发起上传请求。
操作 | 描述 | 方法 |
---|---|---|
创建分段上传 | 启动分段上传并返回上传 ID | Client::CreateMultipartUpload |
上传 Part | 在分段上传中上传段 | Client::UploadPart |
完成分段上传 | 通过组装之前上传的段来完成分段上传 | Client::CompleteMultipartUpload |
Abort Multipart Upload | 中止分段上传并释放所有资源 | Client::AbortMultipartUpload |
选择对象内容(查询对象)
支持使用 SQL 表达式从对象中检索数据子集。
S3 Select 功能 :允许用户使用 SQL 语法查询存储在 MinIO 中的 CSV、JSON 或 Parquet 格式对象。通过 SQL 类型的语句实现高效的文件内容检索。例如,可以查询 CSV 文件中特定列的值,或者从 JSON 文件中提取符合条件的数据。
使用场景:结合 Elasticsearch 在上传文件到 MinIO 时,将文件的元数据和内容摘要同步到 Elasticsearch 中创建索引。这样可以通过 Elasticsearch 的全文搜索功能实现更灵活和高效的查询,尤其适用于需要复杂搜索逻辑的场景

核心功能总结
客户端 API 提供了一组全面的作来管理存储桶和对象。下表列出了主要操作:
类别 | 描述 |
---|---|
存储桶作 | 创建新存储桶 |
列出所有存储桶 | |
检查存储桶是否存在 | |
删除存储桶 | |
对象作 | 上传对象 |
下载对象 | |
获取对象元数据 | |
删除对象 | |
列出存储桶中的对象 | |
复制对象 | |
将文件作为对象上传 | |
将对象下载到文件 | |
删除多个对象 | |
Multipart | 启动分段上传 |
上传对象的一部分 | |
完成分段上传 | |
中止分段上传 | |
特殊作 | 使用 SQL 查询对象内容 |
获取存储桶事件的通知 | |
通过组合其他对象来创建对象 |
流媒体特别功能
HTTP-Range支持 :MinIO通过HTTP-Range请求实现音视频的在线拉流播放与进度条拖拽功能。当用户在播放器中拖动进度条时,浏览器会向MinIO服务端发送一条包含Range字段的Http-Request请求,指定当前请求视频进度的开始字节数及缓存结束字节数。MinIO根据收到的请求范围返回相应的数据,从而使播放器能够快速定位到指定位置进行播放,实现了进度条的精准拖拽。

多版本支持 :MinIO支持多版本的功能,这在处理多媒体文件时非常有用。例如,当需要对视频进行编辑或修复时,用户可以基于原始文件的不同版本进行操作,而不用担心破坏原有的数据,同时也便于在出现问题时快速回滚到之前的状态。
MinIO实现短视频对象存储与点播案例
笔者团队使用MinIO对象存储作为底层存储,开发部署短视频点播地址映射、地址动态代理等服务,实现一套短视频存储点播平台。其实现框架如下图:

点播平台大致可分为存储层、服务层与应用层。存储层主要部署MinIO对象存储系统及关系数据库,MinIO用来存储视频对象,关系数据库用来存储视频元数据;服务层提供各类存储访问服务接口,如文件上传下载、视频播放地址生成、对象地址映射等;应用层为前端提供应用功能,包括视频上传、查询、播放等功能。
基于MinIO对象存储的点播平台数据访问流程如下图所示:

**1)视频上传与转码,**统一采用mp4格式作为视频存储和点播格式,为了兼容多种格式视频文件上传,需开发转码模块将其转码成mp4格式进行存储,将其首先存入本地磁盘缓存。
**2)直播录制,**在直播的过程中开启录制,将录制的文件首先存入本地磁盘缓存。
**3)上传文件,**视频转码完成或录制完成后,调用MinIO文件上传接口,将视频文件上传至MinIO集群/联邦,由etcd对MinIO集群提供注册发现服务。
**4)点播地址映射,**服务端部署点播地址映射服务模块,实现MinIO视频点播地址与视频ID的映射,使存储介质的改变不影响视频点播拉流。
**5)地址动态代理服务,**出于系统安全性考虑,我们不希望暴露MinIO存储地址与存储细节,希望增加一层网关进行媒体流的转发或地址的代理,对外提供统一的服务地址,使用地址动态代理,可以根据点播请求的视频ID不同,动态代理至不同的视频播放地址,实现视频存储细节与服务地址的解耦。
**6)拉流播放,**客户端或浏览器使用HTTP协议流式拉取视频文件并播放。
缺点
内置不含重连重传,需在应用层捕获异常重新请求。
基于 MinIO 对象存储框架的短视频点播平台设计-CSDN博客