目录
对象存储服务器
定义
也称对象存储服务,是一种专门用于存储和检索非结构数据的服务,这些服务通常用于存储大量文件。例如图像,视频,文档等,并支持通过http协议进行访问。
概念普及
最近公司的对象存储服务换到了华为云上,借着这次机会,
了解一下对象存储服务器常见的概念。
对象(Object)
对象概述
对象(Object)是OBS中数据存储的基本单位,一个对象实际是一个文件的数据与其相关属性信息(元数据)的集合体。用户上传至OBS的数据都以对象的形式保存在桶中。
对象的特点
- 键(Key):
对象有一个唯一的键(Key),用于标识该对象。键通常类似于文件名,但在对象存储中,它可以包含路径信息来模拟目录结构。 - 值(Value):
对象的值实际上就是文件的内容。对象存储服务将这些文件的内容存储在后端。 - 元数据(Metadata):
对象可以携带额外的信息,称为元数据。元数据可以包含关于对象的各种属性,如创建时间、大小、类型等。 - 版本控制:
对象存储服务通常支持版本控制,这意味着可以保留对象的不同版本,并能够恢复到先前的版本。 - 生命周期管理:
可以为对象设置生命周期规则,以自动化管理和清理数据,例如自动删除过期的对象或将其移动到成本更低的存储层。
桶(Bucket)
桶概述
桶(Bucket)是OBS中存储对象的容器。对象存储提供了基于桶和对象的扁平化存储方式,桶中的所有对象都处于同一逻辑层级,去除了文件系统中的多层级树形目录结构。
桶可以理解为一个文件夹或目录,目录中存的对象。但与传统文件系统的目录不同,
桶的特点:
- 全局唯一性:
在一个对象存储服务提供商的范围内,桶的名称必须是全局唯一的。
这意味着即使是在不同的用户或账户之间,也不能有相同的桶名称。 - 扁平化存储:
对象存储服务通常采用扁平化的存储结构,这意味着所有的对象都直接存储在桶中,而不像文件系统那样有层次化的目录结构。
对象可以通过键(Key)来唯一标识,键可以包含类似于路径的信息来模拟目录结构。 - 可扩展性:
桶可以存储大量的对象,并且可以随着数据的增长而自动扩展。 - 权限控制:
桶可以设置访问控制策略,比如私有访问、公共读取等,以控制谁可以访问桶中的对象。 - 生命周期管理:
可以为桶中的对象设置生命周期规则,例如自动删除过期的对象或者将旧对象移动到更低成本的存储层。 - 事件通知:
可以为桶配置事件通知,以便在某些事件(如新对象上传、对象删除等)发生时触发特定的动作。
终端节点(Endpoint)
OBS在不同区域的区域域名。终端节点提供了一个可访问的地址,客户端可以通过这个地址来访问对象存储服务。
访问域名
是桶在互联网中的域名地址
OBS桶访问域名的结构为:BucketName.Endpoint
其中BucketName为桶名称,Endpoint为桶所在区域的终端节点(区域域名)
知名的对象存储服务器提供商
微软云Azure:Microsoft Azure Blob Storage
from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient
#上传
blob = BlobClient.from_connection_string(conn_str=self._OSS_CONNECTION_STR, container_name=self._OSS_CONTAINER, blob_name=self._OSS_OBJECT_NAME + '/' + excelName)
#下载
blob = BlobClient.from_connection_string(conn_str=self._OSS_CONNECTION_STR, container_name=self._OSS_CONTAINER, blob_name=runtimeOssObjectName)
优势:提供多种存储类型,如Block Blobs、Page Blobs和Append Blobs,支持高吞吐量和低延迟。
华为云OBS:
from obs import ObsClient,PutObjectHeader
obsClient = ObsClient(access_key_id=ak, secret_access_key=sk, server=server)
#上传
resp = obsClient.putFile(bucketName, objectKey, file_path, headers)
#下载
resp = obsClient.getObject(bucketName,objectKey,downloadPath)
优势:提供了高性能、高可靠性和全球分布等特点,并支持多种API和SDK。
阿里云OSS :
import oss2
auth = oss2.Auth(self._OSS_AUTH_KEY, self._OSS_AUTH_KEY_SECRET)
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', self._OSS_BUCKET)
#上传
res = bucket.put_object_from_file(self._OSS_OBJECT_NAME + '/' + excelName, self._EXPORT_FILE_PATH + excelName)
#下载
res = bucket.get_object_to_file( runtimeOssObjectName, runtimeTemplateFile )
优势:提供了高可用性、数据持久性、安全性等特点,并支持多种API和SDK。
MinIO :
minio python client api 文档
优势:一个开源的高性能对象存储服务器,兼容Amazon S3 API。设计用于大规模数据存储和处理。
还有一些其他的对象存储服务商品,还没有用过,简单列一下:
Amazon S3 (Simple Storage Service)
亚马逊云科技提供的对象存储服务,是最早也是最广泛使用的对象存储服务之一。
特点包括高可用性、持久性、安全性和全球分布。
Google Cloud Storage
Google Cloud Platform提供的对象存储服务。
提供了多种存储类别,如标准、近线、冷线和档案存储,以满足不同的数据访问需求。
IBM Cloud Object Storage
IBM Cloud提供的对象存储服务。提供高度可扩展的存储解决方案,支持数据复制和加密。
具体代码使用例子
import configparser #用于读取和写入结构化的配置文件,
import os
from obs import ObsClient,Owner,Grantee,Grant,Permission,Group,ACL
# 1.获取配置文件中的华为云obs信息
config = configparser.ConfigParser() # <class 'configparser.ConfigParser'>
my_path = os.path.abspath(os.path.dirname(__file__)) #E:\AI\fastapi\fastApiProject\华为云obs
path = config.read(os.path.join(my_path,"conf\\params.conf")) #'E:\\AI\\fastapi\\fastApiProject\\华为云obs\\conf\\params.conf'
ak = config['obs']['AccessKeyID']
sk = config['obs']['SecretAccessKey']
server = config['obs']['Endpoint']
bucketName = config['obs']['BucketName']
max_keys = 1000 #返回对象列表的最大数量
prefix = 'sfpublicfiles/client720/PRTDOC/SCM_FY'
tempFileName = 'print_qa_resturn_test_y.docx'
objectKey = prefix + tempFileName # 对象名称
ownerId = config['obs']['ownerId']
# 2.创建实例
obsClient = ObsClient(access_key_id=ak, secret_access_key=sk, server=server)
# 3.获取信息
# 3.1 获取桶列表和信息
bucket_resp = obsClient.listBuckets(True)
print('桶列表信息:{}'.format(bucket_resp))
# 3.2 获取桶存储信息,包含桶的大小,桶里面的对象个数
bucket_si_resp = obsClient.getBucketStorageInfo(bucketName)
print('桶存储信息{}'.format(bucket_si_resp))
# 3.3 获取桶的ACL信息
bucket_acl_resp = obsClient.getBucketAcl(bucketName)
print('桶的ACL信息:{}'.format(bucket_acl_resp))
# 4.上传对象文件
# 4.1 设置对象的ACL
owner = Owner(ownerId)
#创建两个不同访问权限授予者,grantee类型通常用于表示对象权限的接收者
object_grantee1 = Grantee(grantee_id = ownerId)
object_grantee2 = Grantee(group = Group.ALL_USERS) # 代表所有用户组
#创建权限并授予对象
object_grant1 = Grant(grantee = object_grantee1, permission = Permission.FULL_CONTROL,delivered=False)
object_grant2 = Grant(grantee = object_grantee2, permission = Permission.READ,delivered=False)
# 4.2 设置对象的ACL
object_acl = ACL(owner = owner,grants = [object_grant1, object_grant2])
# 4.3 上传对象文件并设置对象的ACL
file_path = r'C:\Users\Administrator\Desktop\print_qa_resturn_test_y.docx'
response = obsClient.putFile(bucketName, objectKey, file_path)
obsClient.setObjectAcl(bucketName, objectKey, object_acl)
# 4.4 获取对象的ACL信息
object_acl_resp = obsClient.getObjectAcl(bucketName,objectKey)
print('对象的ACL信息:{}'.format(object_acl_resp))
# 4.5 获取对象的信息
object_resp = obsClient.listObjects(bucketName,objectKey,max_keys=max_keys)
print('对象信息:{}'.format(object_resp))
# 5.下载对象文件
downloadPath = r'C:\Users\Administrator\Desktop\from_obs_print_qa_resturn.docx'
resp = obsClient.getObject(bucketName,objectKey,downloadPath)
# 6.删除对象文件
resp = obsClient.deleteObject(bucketName,objectKey)
对象的ACL信息:
{
"status": 200,
"reason": "OK",
"body": {
"owner": {
"owner_id": "6d877d4f7a7c48a3b95d48b45c40a38e"
},
"grants": [
{
"grantee": {
"grantee_id": "6d877d4f7a7c48a3b95d48b45c40a38e"
},
"permission": "FULL_CONTROL",
"delivered": false
},
{
"grantee": {
"group": "Everyone"
},
"permission": "READ",
"delivered": false
}
],
"delivered": true
},
"requestId": "000001915F4EB348C1EAEFFC4697D483",
"header": [
("date", "Sat, 17 Aug 2024 07:47:58 GMT"),
("content-type", "application/xml"),
("content-length", "470"),
("connection", "close"),
("request-id", "000001915F4EB348C1EAEFFC4697D483"),
("id-2", "32AAAQAAEAABAAAQAAEAABAAAQAAEAABCS1oBcQWgXthTpT8O+Mr+Sf0qqrnv8dP")
]
}
这段信息表示一个对象的所有者是用户ID为 ‘XXX’ 的用户,并且这个对象有两个权限授予:
所有者拥有 FULL_CONTROL 权限,尽管 delivered 为 False。
所有用户 (Everyone) 都有 READ 权限,同样 delivered 也为 False。