logo

云原生时代,开源存储系统长什么样?

作者:技术大发2022.03.08 15:43浏览量:76

简介:云原生时代,开源存储系统长什么样?

根据《2021年中国数字经济发展白皮书》统计,2020年中国数字经济规模达 39.2 万亿元,占 GDP 的 38.6% 。
伴随数字化社会的来临,数据的体量不断激增。越来越多的企业业务系统亟待驱动数据引领业务创新,进行数字化转型。
在此背景之下,云原生成为企业数字化进程的助推力。那么,在海量数据云原生场景落地的大爆发时刻,企业和开发者们应该如何把握先机?

01.云原生重新定义存储

CNCF调研报告显示,存储系统是企业云原生场景使用/部署容器面临的最主要的障碍之一。
其中,存储成为基础软件领域的重要一环。同时,在云原生的技术架构之下,存储正在被重新定义。
具体来看,企业若是要想将云原生技术落地,需要将企业应用负载从原来的虚拟化平台和云平台迁移到容器平台上。然而面对海量的数据存储,存储容器平台的存储能力面临更高要求的挑战。
基于此,被称作「混合云第一股」的 QingStore 开始了一个全新的创新。
2021年起,QingStor 牵头建立了一个厂商中立的开源存储社区—— BeyondStorage 。这是一个以厂商中立的开源存储社区,专注于提供跨云数据服务,当前社区内共有 40 多个开源项目。

这些开源项目的构建思路是建设一套统一的存储抽象层(SAL),即逻辑层,在这里能够将数据存储和 SQL 前端、事务、查询执行等进行隔离;然后再向下对接各式各样的存储服务,进而再向上为应用提供支持。
其中,在中间的接口层有一个 Golang 的实现,名为 go-storage 。这就是我们今天推荐的项目。

02.一个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")

}

相关文章推荐

发表评论