不同于文件系统,对象存储是一个扁平的架构,在海量数据的场景下统计某个目录(对象前缀)下所有文件的大小是一个非常难的操作,只能列出该目录下所有文件,然后将所有文件大小相加的方式获取总大小。根据客户的实际反馈,在文件数目非常大的情况下,这种方式不是特别友好,耗时非常久,还需要长期占有主机端资源做list object以及统计容量操作。
如果对于容量统计的时效性要求不高,可以采用清单的方式。COS支持每天生成一次清单,清单中包含了存储桶中所有对象的列表以及每个对象对应的一些信息,包括每个对象的大小。清单生成之后,可以将清单导入到数据库,利用数据库的查询获取想要的统计信息。这里推荐使用ClickHouse数据库,使用列式存储的方式,提供卓越的查询性能。
参考如下文档查看清单的描述以及如何配置清单:
对象存储 清单功能概述 - 开发者指南 - 文档中心 - 腾讯云 (tencent.com)
对象存储 开通清单功能 - 控制台指南 - 文档中心 - 腾讯云 (tencent.com)
用户配置一项清单任务后,COS 将根据配置定时扫描用户存储桶内指定的对象,并输出一份清单报告,清单报告支持 CSV 格式文件。目前 COS 清单报告中支持记录以下信息:
清单信息 | 描述 |
---|---|
AppID | 账号的 ID |
Bucket | 执行清单任务的存储桶的名称 |
fileFormat | 文件格式 |
listObjectCount | 列出的对象数量 |
listStorageSize | 列出的对象大小 |
filterObjectCount | 筛选的对象数量 |
filterStorageSize | 筛选的对象大小 |
Key | 存储桶中的对象文件名称。使用 CSV 文件格式时,对象文件名称采用 URL 编码形式,必须解码然后才能使用 |
VersionId | 对象版本 ID。在存储桶上启用版本控制后,COS 会为添加到存储桶的对象指定版本号。如果列表仅针对对象的当前版本,则不包含此字段 |
IsLatest | 如果对象的版本为最新,则设置为 True。如果列表仅针对对象的当前版本,则不包含此字段 |
IsDeleteMarker | 如果对象是删除标记,则设置为 True。如果列表仅针对对象的当前版本,则不包含此字段 |
Size | 对象大小(以字节为单位) |
LastModifiedDate | 对象的最近修改日期(以日期较晚者为准) |
ETag | 实体标签是对象的哈希。ETag 仅反映对对象的内容的更改,而不反映对对象的元数据的更改。ETag 可能是也可能不是对象数据的 MD5 摘要。是与不是取决于对象的创建方式和加密方式 |
StorageClass | 用于存储对象的存储类,有关更多信息,请参见 存储类型 |
IsMultipartUploaded | 如果对象以分块上传形式上传,则设置为 True,有关更多信息,请参见 分块上传 |
Replicationstatus | 设置为 PENDING、COMPLETED、FAILED 或 REPLICA。有关更多信息,请参见 跨地域复制行为说明 |
清单报告及相关的 Manifest 相关文件会发布在目标存储桶中,其中清单报告会发布在以下路径:
destination-prefix/appid/source-bucket/config-ID/YYYYMMDD/manifest.json
destination-prefix/appid/source-bucket/config-ID/YYYYMMDD/manifest.checksum
有关 Mainfest 文件的介绍如下:
根据清单生成的manifest.json文件,可以获取当次清单涉及到的所有文件的列表。清单文件是压缩之后的CSV。
在数据导入之前,先安装ClickHouse,可以参照如下文档安装ClickHouse:
数据库安装完成之后,先在ClickHouse中创建表:
CREATE TABLE default.cos_inventory
(
`appid` UInt64,
`bucket` String,
`key` String,
`versionid` String,
`islatest` String,
`isdeletemarker` String,
`size` UInt64,
`LastModifiedDate` DateTime,
`etag` String,
`storage_class` String,
`IsMultipartUploaded` String,
`Replicationstatus` String
)
ENGINE = MergeTree
ORDER BY LastModifiedDate;
由于发起清单时选择的清单信息可能不太相同,上述建表语句中表中各列仅供参考,实际建表分析的时候,可参考manifest.json文件中的fileSchema确定建表需要的列。
建表完成后,将对应的清单文件下载到本地一个目录,并解压。使用如下命令将所有CSV文件中的数据导入到cos_inventory表中:
for i in *csv; do echo $i; cat $i |sed 's/\+08:00//g' |clickhouse-client --query="INSERT INTO cos_inventory FORMAT CSV"; done
数据导入之后就可以进入到ClickHouse-Client进行先关的查询:
root@VM-16-2-ubuntu:~# clickhouse-client
ClickHouse client version 21.3.8.76 (official build).
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 21.3.8 revision 54447.
localhost.localdomain :) select count() from cos_inventory;
SELECT count()
FROM cos_inventory
Query id: 6dc11b6a-4f5d-497a-8193-2b120bc8e3a5
┌───count()─┐
│ 187953674 │
└───────────┘
1 rows in set. Elapsed: 0.002 sec.
统计cos_user目录下(以cos_user/为前缀)的所有文件的容量综合:
localhost.localdomain :) select formatReadableSize(sum(size)) from cos_inventory where (key like 'cos_user/%');
SELECT formatReadableSize(sum(size))
FROM cos_inventory
WHERE key LIKE 'cos_user/%'
Query id: 0e24f1cd-0bee-4ccf-83d7-6fe661b1dc4b
┌─formatReadableSize(sum(size))─┐
│ 34.56 PiB │
└───────────────────────────────┘
1 rows in set. Elapsed: 18.776 sec. Processed 187.95 million rows, 22.18 GB (10.01 million rows/s., 1.18 GB/s.)
localhost.localdomain :) select count() from cos_inventory where (key like 'cos_user/%');
SELECT count()
FROM cos_inventory
WHERE key LIKE 'cos_user/%'
Query id: 442eba9a-a3cc-4bd2-8857-911e1c97cb28
┌───count()─┐
│ 187792634 │
└───────────┘
1 rows in set. Elapsed: 20.190 sec. Processed 187.95 million rows, 20.67 GB (9.31 million rows/s., 1.02 GB/s.)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。