GO语言工程实践课后作业 | 豆包MarsCode AI刷题

49 阅读4分钟

本文实现一个对象存储的客户端,首先对对象存储进行一些基础理论的介绍

抖音背后的存储需求

把短视频生产/消费链路做更细粒度分解,到处都有视频/图片的公共存储需求,如源视频、不同码率视频的存储、抽帧图片的存储。简单计算每个月就需要51900TB,12960块4TB磁盘,622亿个视频/图片。

合适的存储需求:易用,海量,便宜

分布式存储分为:1.分布式文件系统HDFS 2.对象存储TOS

对象存储的特点,支持>EB海量存储,对象数量无限制,支持云原生按需申请使用,Restful HTTP接口,使用普通的X86服务器(便宜),具备冷热数据分级存储能力。

使用

Restful接口:get,head,put,delete接口

MultiUpload,Listprefix接口

随着对象存储在公有云的使用量、数据量大规模增长,开始自研。对象存储经典的三层架构

容量型,QPS型

分布式存储=分布式+单机存储

分布式:存储均匀分布、计算均匀分布、压力均匀分布

可扩展性partition:不同的数据映射至不同的Partition,Partition Logic:Hash/Range。数据量的增加,扩容机器新建Partition

持久度解法-Replication,数据在单节点存储时,有较大概率丢失无法找回。

复制:数据复制多份,即多个副本,放置策略;多机架、多机房、多Region。带来:高持久度,强吞吐能力。问题:拷贝方式有哪些,(异步复制,同步复制等?)。如何解决一致性的问题。

成本解法之EC:Erasure Coding

低冗余度、额外计算

温热转换,将冷的数据转移到性能更差的但更廉价的存储介质上

架构细化

需要高可用性:1.一个集群分成多个集群,有效降低爆炸半径。2.镜像灾备,主bucket和备,增量双向同步

实践

对象存储 OSS_云存储服务_企业数据管理_存储-阿里云 (aliyun.com) 阿里云对象存储服务(Alibaba Cloud Object Storage Service,简称OSS),是阿里云提供的高度可扩展的云端对象存储服务,提供了多语言SDK(OSS管理控制台 (aliyun.com)),提供了丰富的OSS操作接口,能够通过SDK自带函数直接实现上传、下载、列举、删除等操作,同时支持数据迁移、数据加密、访问控制、数据生命周期管理等操作,使用非常方便,可以支持大文件的分片上传和断点续传,性能高效;附带详细的文档和示例代码(Go SDK文档:OSSGoSDK示例代码_对象存储 OSS-阿里云帮助中心 (aliyun.com)),并且云原生集成,能够很好的与阿里云的其他云服务集成使用,也支持跨平台使用。

使用Go语言连接阿里云OSS实现一个简单的命令行存储对象客户端,要求能够实现以下功能:

  • 创建对象:创建时超过1GB的对象需要使用MultiUpload即分片上传的方式,小于1GB的用普通的PUT
  • 下载对象;
  • 删除对象;
  • 查看对象是否存在;
  • 列举对象;
  • 列举CommonPrefix:CommonPrefixes表示与给定前缀匹配的对象键的一部分,是前缀下的子目录或对象键的集合,是一个用于组织对象的元数据字段,通常用于构建虚拟目录结构。

进入阿里云的oss对象存储平台后,进入控制台选择bucket列表,配置选默认即可。

之后我们可以申请accesskey,把鼠标放在头像上,点击访问控制,为了安全性,我们可以选择创建一个子用户,并在子用户中申请accesskey。

账户部分就配置好了,之后我们进行编程实践

之后的操作按照地址:aliyun-oss-go-sdk/sample/put_object.go at master · aliyun/aliyun-oss-go-sdk 就可以完成各实践操作 比如以上传为例

    accessKeyID := "" 
    accessKeySecret := "" 
    endpoint := "oss-cn-beijing.aliyuncs.com" 
    bucketName := "l-test-bucket"
    err := bucket.PutObjectFromFile(objectName, localFilePath, oss.ObjectACL(oss.ACLPublicRead)) 
    if err != nil { fmt.Errorf("上传文件到OSS时发生错误: %v", err) } 
    fmt.Println("文件已成功上传到OSS")