本文实现一个对象存储的客户端,首先对对象存储进行一些基础理论的介绍
抖音背后的存储需求
把短视频生产/消费链路做更细粒度分解,到处都有视频/图片的公共存储需求,如源视频、不同码率视频的存储、抽帧图片的存储。简单计算每个月就需要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")