对象存储服务的元数据检索特性

依据AWS S3Amazon 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数量不支持变更,需要设计搬迁数据的方案。

参考资料

posted @ 2024-04-27 22:03  jackieathome  阅读(20)  评论(0编辑  收藏  举报