項目成熟度
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(穩定增長,社區成熟)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博客
ffmpeg拉取minio里的視頻文件 - CSDN文庫
【minio】Ubuntu安裝MinIO文件服務器并通過C++上傳下載_minio c++-CSDN博客
基于 MinIO 對象存儲框架的短視頻點播平臺設計_騰訊新聞