雲原生時代,開源存儲系統長什麼樣
根據《2021 年中國數字經濟發展白皮書》統計,2020 年中國數字經濟規模達 39.2 萬億元,佔 GDP 的 38.6% 。
伴隨數字化社會的來臨,數據的體量不斷激增。越來越多的企業業務系統亟待驅動數據引領業務創新,進行數字化轉型。
在此背景之下,雲原生成爲企業數字化進程的助推力。那麼,在海量數據雲原生場景落地的大爆發時刻,企業和開發者們應該如何把握先機?
雲原生重新定義存儲
CNCF 調研報告顯示,存儲系統是企業雲原生場景使用 / 部署容器面臨的最主要的障礙之一。
其中,存儲成爲基礎軟件領域的重要一環。同時,在雲原生的技術架構之下,存儲正在被重新定義。
具體來看,企業若是要想將雲原生技術落地,需要將企業應用負載從原來的虛擬化平臺和雲平臺遷移到容器平臺上。然而面對海量的數據存儲,存儲容器平臺的存儲能力面臨更高要求的挑戰。
基於此,被稱作「混合雲第一股」的 QingStore 開始了一個全新的創新。
2021 年起,QingStor 牽頭建立了一個廠商中立的開源存儲社區—— BeyondStorage 。這是一個以廠商中立的開源存儲社區,專注於提供跨雲數據服務,當前社區內共有 40 多個開源項目。
這些開源項目的構建思路是建設一套統一的存儲抽象層(SAL),即邏輯層,在這裏能夠將數據存儲和 SQL 前端、事務、查詢執行等進行隔離;然後再向下對接各式各樣的存儲服務,進而再向上爲應用提供支持。
其中,在中間的接口層有一個 Golang 的實現,名爲 go-storage 。這就是我們今天推薦的項目。
一個 Golang 實現,能在任意存儲服務中運行
go-storage
**項目作者:**BeyondStorage
**開源許可證:**Apache-2.0
項目簡介: go-storage 是一個開源的廠商中立的存儲開發庫。具體說,這是一個向下通過插件的方式,對接支持市場上所有主流的雲存儲產品和服務。項目地址:
https://gitee.com/beyondstorage/go-storage
BeyondStorage 基於這個開發庫,在接口層上構建了應用層,生長出了數據遷移、數據管理、FTP、FUSE 等應用。
在未來,go-storage 的願景是隻需一次編寫,即可在任意存儲服務中運行。
go-storage 支持多種本地服務
目前已經有 16 個穩定的服務通過了所有的 集成測試;另外還有 3 個公測版本的服務已實現了所需功能,但還沒有通過集成測試,最後還有 4 個處於內測階段的服務仍在開發中。
go-storage 是如何提供一個完整且易擴展的接口?
- 獲取 storager 元數據
_ := meta.GetWorkDir() // 獲取對象的工作目錄
_, ok := meta.GetWriteSizeMaximum() // 獲取寫操作的最大尺寸
- 讀取對象的內容
n, err := store.Read("path", w, pairs.WithOffset(1024), pairs.WithSize(2048))
- 將內容寫入對象中
n, err := store.Write("path", r, 2048)
- 獲取對象元數據並檢查是否存在
if errors.Is(err, services.ErrObjectNotExist) {
// 對象不存在
}
length, ok := o.GetContentLength() // 獲取對象的內容長度
- 刪除一個對象
err := store.Delete("path") // 刪除對象 "路徑"
- 列出給定前綴或目錄中的對象
for {
o, err := it.Next()
if err != nil && errors.Is(err, types.IteratorDone) {
// 列表結束
}
length, ok := o.GetContentLength() // 獲取對象的內容長度
}
項目示例
import (
"log"
"go.beyondstorage.io/v5/services"
"go.beyondstorage.io/v5/types"
// 添加 fs 支持
_ "go.beyondstorage.io/services/fs/v4"
// 添加 s3 支持
_ "go.beyondstorage.io/services/s3/v3"
// 添加 gcs 支持
_ "go.beyondstorage.io/services/gcs/v3"
// 添加 azblob 支持
_ "go.beyondstorage.io/services/azblob/v3"
// 更多支持,可在 BeyondStorage 下獲取
_ "go.beyondstorage.io/services/xxx"
)
func main() {
// 使用連接字符串初始化 storager
store, err := services.NewStoragerFromString("s3://bucket_name/path/to/workdir")
if err != nil {
log.Fatalf("service init failed: %v", err)
}
// 將 io.Reader 中的數據寫入 hello.txt
n, err := store.Write("hello.txt", r, length)
// 從 hello.txt 中讀取數據到 io.Writer
n, err := store.Read("hello.txt", w)
// 檢查 hello.txt 是否存在並獲取其元數據
o, err := store.Stat("hello.txt")
// 使用對象的函數獲取元數據
length, ok := o.GetContentLength()
// List 將創建路徑下對象的迭代器
it, err := store.List("path")
for {
// 使用迭代器檢索下一個對象,直到迭代完成
o, err := it.Next()
if errors.Is(err, types.IteraoorDone) {
break
}
}
// 刪除 hello.txt
err = store.Delete("hello.txt")
}
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/CIqjRy_g_Q58CXfZGQd-Zg