对象存储 | 青训营笔记

200 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记

什么是对象存储

对象存储(Object Storage Service,OSS),也叫基于对象的存储,是一种解决和处理离散单元的方法,可提供基于分布式系统之上的对象形式的数据存储服务。对象存储和我们经常接触到的块和文件系统等存储形态不同,它提供RESTful API数据读写接口及丰富的SDK接口,并且常以网络服务的形式提供数据的访问。对象存储经常被比作在一家高级餐厅代客停车。当一个顾客需要代客停车时,他就把钥匙交给别人,换来一张收据。这个顾客不用知道他的车被停在哪,也不用知道在他用餐时服务员会把他的车移动多少次。在这个比喻中,一个存储对象的唯一标识符就代表顾客的收据。即经典的key-value形式,只是你不用关心数据存在哪。

对象存储与其他存储的对比

先来看一下存储的分类

image.png

与他们之间的对比 image.png

如果在一个需要存储大量数据且存储的数据结构不是复杂多维化的话,选用分布式存储是一个明显的选择

而在分布式存储中又应该选择对象存储还是分布式文件系统呢?先看一下他们之间的区别:

image.png

很明显,分布式文件系统能做的对象存储也能做,而且做得更好!而且对象存储还采用了http接口得方式,使得开发极其简单,你甚至不用懂对象存储得原理就能使用它。

对象存储的使用方式

对象存储根本上改变了存储蓝图。它处理和解决了曾经被认为是棘手的存储问题:不间断可扩展性、弹性下降、限制数据持久性、无限技术更新和成本失控。存储专家对其潜在的优势感到兴奋,尤其是他们的绝大多数数据都碰巧是被动的或者是冷数据。

对象存储的本地应用程序接口是一个RESTful API。RESTful本质上是HTTP输入和输出,或者是互联网语言。这个语言对于Web浏览器是本地化的,但是对于大多数IT应用并非如此。这也为这个问题提供了一个答案,对RESTful API是一种检验,检测其变化、标准、事实标准以及在本地使用有哪些必须要做的事情,以及有哪些现成的软件可以实现。

例如你想要得到一个在对象存储中的对象,那么你只要使用http的GET请求({Bucket/{ObjectKey}},Bucket是你的存储桶地址,ObjectKey是你的对象的key)就能够返回一个对象。例如douying-1312334430.cos.ap-guangzhou.myqcloud.com/0_1.jpg 就是一个经典的请求

对象存储的使用实例-cos的使用

首先在腾讯云的对象存储COS里创建一个存储桶

image.png 接着就是编写http请求。

当然,你也可以在COS的界面你直接上传文件

image.png

一下是基于腾讯自研的SDK(cos-go-sdk-v5)的代码

GET请求获取对象

package main

import (
   "context"
   "github.com/tencentyun/cos-go-sdk-v5"
   "net/http"
   "net/url"
)


func main() {
   // 将 examplebucket-1250000000 和 COS_REGION 修改为真实的信息
   // 存储桶名称,由bucketname-appid 组成,appid必须填入,可以在COS控制台查看存储桶名称。https://console.cloud.tencent.com/cos5/bucket
   // COS_REGION 可以在控制台查看,https://console.cloud.tencent.com/cos5/bucket, 关于地域的详情见 https://cloud.tencent.com/document/product/436/6224
   u, _ := url.Parse("https://test-1312334430.cos.ap-guangzhou.myqcloud.com")
   b := &cos.BaseURL{BucketURL: u}
   c := cos.NewClient(b, &http.Client{
      Transport: &cos.AuthorizationTransport{
         SecretID:  "SecretId",   // 替换为用户的 SecretId,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi
         SecretKey: "SecretKey",  // 替换为用户的 SecretKey,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi
      },
   })
   // 1.通过响应体获取对象
   key := "bear.mp4"
   file := "./static/bearCloud.mp4"

   opt := &cos.MultiDownloadOptions{
      ThreadPoolSize: 5,
   }
   _, err := c.Object.Download(
      context.Background(), key, file, opt,
   )
   if err != nil {
      panic(err)
   }
}

可以看到返回的对象直接放在body上

PUT

put请求是把对象上传到存储桶里

package main

import (
   "context"
   "fmt"
   "github.com/tencentyun/cos-go-sdk-v5"
   "log"
   "net/http"
   "net/url"
   "os"
)

func main() {
   // 存储桶名称,由bucketname-appid 组成,appid必须填入,可以在COS控制台查看存储桶名称。 https://console.cloud.tencent.com/cos5/bucket
   // 替换为用户的 region,存储桶region可以在COS控制台“存储桶概览”查看 https://console.cloud.tencent.com/ ,关于地域的详情见 https://cloud.tencent.com/document/product/436/6224 。
   u, _ := url.Parse("https://test-1312334430.cos.ap-guangzhou.myqcloud.com")
   b := &cos.BaseURL{BucketURL: u}
   client := cos.NewClient(b, &http.Client{
      Transport: &cos.AuthorizationTransport{
         // 通过环境变量获取密钥
         // 环境变量 SECRETID 表示用户的 SecretId,登录访问管理控制台查看密钥,https://console.cloud.tencent.com/cam/capi
         SecretID: "SecretId",
         // 环境变量 SECRETKEY 表示用户的 SecretKey,登录访问管理控制台查看密钥,https://console.cloud.tencent.com/cam/capi
         SecretKey: "SECRETKEY",
      },
   })

   key := "bear2.mp4"

   file, error := os.Open("./static/bear.mp4");
   if error != nil {
      fmt.Println(error)
   }
   log.Println(file)

   _, _, err := client.Object.Upload(
      context.Background(), key, "./static/bear.mp4", nil,
   )
   if err != nil {
      panic(err)
   }
}

当然,你也可以直接使用原生的标准库发送http请求.