[toc]
Bucket
Bucket 是什么?
对象存储里面只有两个跟资源相关的名词:Bucket,Object。 Bucket 中文直译为”桶“,Object 显而易见就是”对象“。所有 Object 都必须属于某个 Bucket,无一例外。Bucket 通常也是计费、权限控制、生命周期等高级功能的管理实体。
一般来讲,公有云厂商会确保 Bucket 名称在全球地域服务具有全局唯一性,且不能修改。比如说,你使用 AWS 的 S3 服务,在北美地域有个叫做 Test 的 Bucket,在其他地域就不允许有同名的 Bucket 了。其实国内的公有云厂商个别做差异化的时候,在这个地方会有不一样,比如允许不同地域可以有同名的 Bucket。这个带来的好处就是用户方便了,因为不同地域可以设置相同 Bucket 了,不好的地方就是对象存储系统本身的实现可能会相对复杂。
一般来讲,Bucket 作为一个抽象的容器概念,空间是无限的,也就是说,用户存放的 Object 的数量和大小总量没有限制,空间大小只依赖于实际的物理资源,公有云厂商也是希望你存储进来的数据越多越好(机器不够他们随时可以扩容,这个用户是不感知的)。
Bucket 命名规范
公有云厂商一般都会有这个限制,这个和 S3 限制的一致:
- 只能包括小写字母,数字,短横线(-)
- 必须以小写字母或者数字开头
- 长度必须在 3-63 字节之间
Bucket 权限类别
Bucket默认提供三种访问权限:私有读写、公有读私有写和公有读写。其访问权限可通过对象存储控制台上Bucket的权限管理进行修改。
私有读写
只有 Bucket 的创建者或者被授权的账号才对该 Bucket 中的 Object 有读写权限,其他人对该 Bucket 中的 Object 都没有读写权限。Bucket 访问权限默认就是私有读写,也就是要 AK/Sk 来访问。
公有读私有写
任何人(包括匿名访问者)都对该 Bucket 中 Object 有读权限,但只有 Bucket 创建者及被授权的账号才对该 Bucket 中 Object 有写权限。
公有读写
任何人(包括匿名访问者)都对该 Bucket 中对象有读权限和写权限。这种方式用起来要慎重点,方便是方便了,但是安全系数最低。
Bucket 的创建
一般可以使用 3 种方式来创建一个 Bucket,这三种方式也是操作对象的三种方式(本质上都是一种啦,发送正确的 S3 协议包给到对象存储服务系统):
方式一:使用公有云的用户 Portal 系统
这个是新手最早接触到,也是容易接受的一种方式。一般用来体验对象存储简单的上传下载。
方式二:使用 SDK
按照自己的技术栈,选定特定语言的 SDK 版本。比如你可以选择 S3 的 golang 版本的 SDK。
方式三:使用第三方工具
- 可以用公有云厂商自己提供的工具。比如,阿里 OSS 提供了 ossutil 命令行工具和 ossbrowser 图形化工具。腾讯 COSCMD 命令行工具,七牛提供了 qshell 工具;
- 也可以用开源免费的第三方工具,比如 S3Browser、S3Cmd 等第三方工具;
Bucket 的删除
S3 的实现中,必须要是空 Bucket 才能被删除。
思考问题
问题一:Bucket 到底是什么,有没有一个实体?
我们知道 Object 的概念很容易理解,因为 Object 就是用户实实在在上传的数据。Bucket 呢?有没有一个实体?
其实 Bucket 就是一个命名空间而已。对象存储系统内部实现的方式也是各式各样。比如开源的 Minio 举例,Bucket 就是实现成了目录,对象就是目录下的文件。
或者,你自己实现的对象存储可以实现成字符串,这个 Bucket 里的对象只需要前缀加上这个 Bucket 前缀,等等。
问题二:对象存储有没有目录的概念?
首先明确一点,对象存储中只有 Bucket,Object 的两层关系。没有目录概念!!!
那有些小伙伴可能质疑了,我明明用 S3Browser ,ossbrowser 这样的工具就看到了目录,比如你上传一个 key 名为:”/root/dir1/test.txt” 到 Bucket 里面,root
,dir1
这个明明就是给我显示成了目录关系。
其实不是的。对于对象存储后端来讲,你只是上传了一个 key = “/root/dir1/test.txt” 的对象,还是只有 Bucket/Object 两层关系。目录只是 s3Browser, ossbrowser 这样的客户端工具为了好看做出来的效果。他识别到 key 里面包含了斜线 “/” 之后,就用最经典的目录层次效果给你呈现了。
坚持思考,方向比努力更重要。微信公众号关注我:奇伢云存储