当前位置: 首页 > news >正文

视频存储开源方案

项目成熟度

GitHub - ceph/ceph: Ceph is a distributed object, block, and file storage platform

GitHub - minio/minio: MinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license.

GitHub - seaweedfs/seaweedfs: SeaweedFS is a fast distributed storage system for blobs, objects, files, and data lake, for billions of files! Blob store has O(1) disk seek, cloud tiering. Filer supports Cloud Drive, cross-DC active-active replication, Kubernetes, POSIX FUSE mount, S3 API, S3 Gateway, Hadoop, WebDAV, encryption, Erasure Coding.

项目GitHub Star 数量(截至 2025 年 5 月)贡献者数量初始发布时间主要开源协议
Ceph≈15.0K(稳定增长,社区成熟)4101172+2010 年LGPL
MinIO≈52.7K(快速增长,高人气)58421+2014 年GNU AGPL v3
SeaweedFS≈24.2K(中等增速,技术优势驱动)39146+2015 年Apache-2.0

功能区别

对比维度CephMinIOSeaweedFS
功能定位统一存储(对象、块、文件)专注对象存储(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 StorageGoogle 提供的云存储服务,与 S3 兼容。
IBM Cloud Object StorageIBM 的云存储服务,支持多种数据存储需求。

MinIO C++ SDK 的兼容性基于其对 Amazon S3 协议的实现,因此任何支持该协议的对象存储服务理论上都可以与 MinIO C++ SDK 配合使用。

版本和依赖项

MinIO C++ SDK 目前的版本为 0.3.0,需要:

  • C++17 编译器支持

  • CMake 3.10 或更高版本(用于建筑)

  • vcpkg 包管理器(建议用于依赖项管理)

关键依赖项包括:

Library目的
curlppHTTP communication
openssl加密和 TLS 支持
nlohmann-jsonJSON parsing
pugixmlXML 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 本身未明确提供自动重传的接口,但可以通过编程逻辑实现重传功能。例如,在上传文件时,如果出现网络错误等异常情况,可以在代码中捕获异常并重新发起上传请求。

操作描述方法
创建分段上传启动分段上传并返回上传 IDClient::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博客

ffmpeg拉取minio里的视频文件 - CSDN文库

【minio】Ubuntu安装MinIO文件服务器并通过C++上传下载_minio c++-CSDN博客

基于 MinIO 对象存储框架的短视频点播平台设计_腾讯新闻

相关文章:

  • Flutter Web 3.0革命:用WebGPU实现浏览器端实时光追渲染,性能提升300%
  • 论文分享之Prompt优化
  • C++模板与字符串:从入门到精通
  • 什么是HTTP HTTP 和 HTTPS 的区别
  • SQL进阶之旅 Day 4:子查询与临时表优化
  • vue3获取两个日期之间的所有时间
  • PostgreSQL日志管理完整方案(AI)
  • 关于Python编程语言学习的入门总结
  • SQL:合并查询(UNION)
  • .gitignore 的基本用法
  • vSphere 7.0 client 提示HTTP状态 500- 内部服务器错误
  • day021-定时任务
  • 创业团队建设与管理(一)
  • 扣子平台上如何进行对象序列化,JSON序列化和反序列化节点的使用
  • MPI实现中对消息传递的优化
  • 通用的管理账号设置设计(一)
  • 学习python day8
  • leetcode 93. Restore IP Addresses
  • mac for vscode集成的源代码管理 撤销和删除文件报错Permission denied
  • 宫格导航--纯血鸿蒙组件库AUI
  • 国外h5汇总网站/营销活动策划
  • 上海做公司网站多少钱/搜索引擎优化的含义
  • 买了虚拟主机怎么做网站/seo关键词查询排名软件
  • 如何注册自己的网站/精准客户运营推广
  • 下列属于b2b网站的有/seo智能优化软件
  • 网站建设技术分析/国产免费crm系统有哪些