python--对象存储服务器

对象存储服务器

定义

也称对象存储服务,是一种专门用于存储和检索非结构数据的服务,这些服务通常用于存储大量文件。例如图像,视频,文档等,并支持通过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:

华为云OBS python SDK官方文档

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵钱孙李的赵

感谢各位衣食父母

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值