依据AWS S3的Amazon S3 REST API Introduction,当前提供的对象列举接口,如下:
上述接口仅支持使用前缀、对象版本作为检索条件,在业务交付时使用非常不方便。
为提供类似Everything的检索能力,可以参考ECS Data Access Guide 3.5.0.2中描述的Metadata Search特性,设计相应的实现方案。
对象支持的属性
依据AWS S3官方文档,对象支持的元数据,比如:
- HTTP基本属性
- Cache-Control
- Content-Disposition
- Content-Length
- Content-Type
- Last-Modified
- Content-Encoding
- Content-Language
- Expires
- 对象的基本属性
- 对象名称
- 存储桶
- 桶的归属用户
- 用户自定义元数据
- x-amz-meta-*
- 对象的tagging
- x-amz-tagging
- 多版本
- x-amz-version-id
- x-amz-delete-marker
- 分级
- x-amz-storage-class
- x-amz-restore
- WORM
- x-amz-object-lock-mode
- x-amz-object-lock-retain-until-date
- x-amz-object-lock-legal-hold
- 生命周期
- x-amz-expiration
依据客户业务的特点,可以选取一部分字段,作为元数据检索支持的检索条件。
技术方案
为支持元数据的存储和检索,可使用业界常用的全文本检索产品Elasticsearch。
基于Elasticsearch提供的检索API,可以提供如下能力:
- 精确查询,即
==
。 - 范围查询,即
>/>=/</<=
。 - 丰富的数据类型,比如:
- 数值
- 字符串
- 时间
- 排序规则
- 分页
- 总数量
提取元数据的方案,可选项比如:
- 方案一,实时方案,即在对象写入时,将相应的元数据记录下来。
- 方案二,离线方案,基于扫描。采用定时扫描的方式,扫描桶内的对象,将各对象的元数据记录下来。
- 方案三,离线方案,基于快照。假如对象存储服务的底层支持快照,则可以使用定时打快照、比较快照之间的差异。
考虑到Elasticsearch的写入性能、并发度和对象存储服务对客户提供的性能规格存在一定的差异,因此可能需要考虑在对象存储服务和Elasticsearch中间增加元数据的缓冲层,比如使用消息队列如Apache Kafka,避免Elasticsearch集群在大规模并发写操作时出现运行不稳定的现象。
元数据检索的请求、响应消息的定义方式,可以依据客户的诉求、本团队的技能来选择,比如JSON、XML等。
技术规格
规划方案时,需要定义元数据检索服务的技术规格,方便和客户交流。
- 检索请求的并发度。
- 检索请求的响应时延。
- 支持检索的字段。
- 检索请求支持的操作,比如:
- 精确查询
- 范围查询
- 模糊查询
- 排序
- 分页
- Elasticsearch集群的节点的数量。
- Elasticsearch集群中节点占用的资源,比如:
- CPU
- 内存
- 数据盘的类型
- 数据盘的容量
注意事项
使用Elasticsearch存储对象的元数据时,关键的注意事项如下:
- 元数据检索服务支持的数据量的规模。
- 单个对象的元数据,平均占用的存储空间。
- 对象存储的IOPS的规格。
- 索引的创建方式,比如按桶创建,或者所有桶的元数据均放在同一个索引中。
- 索引的shard的数量。
- Elasticsearch集群的节点的数量。
- Elasticsearch集群中节点占用的资源,比如:
- CPU
- 内存
- 数据盘的类型
- 数据盘的容量
- Elasticsearch集群的建设思路,比如:
- 一次建设到位。
- 逐步扩容。考虑到索引的shard数量不支持变更,需要设计搬迁数据的方案。