我有大量对象,目前约有 100 万个,存储在 GCP 云存储桶中。对象以每天 1-2 千个的速度添加。我想根据这些对象的元数据(包括文件名中缀/后缀、创建日期、存储类别等)高效地运行查询以查找存储桶中的对象。
Cloud Storage API 允许按文件名前缀进行搜索(文档),但回调需要几秒钟才能完成。我可以使用 进行中缀查询gsutil
,例如gsutil ls gs://my-bucket/foo-*-bar.txt
,但这更慢。此外,这些查询被认为是A 类操作,从而产生费用。
与其使用 Cloud Storage API 搜索存储桶,我考虑将存储桶中所有对象的列表添加到 Bigtable 或 SQL 等数据库中。数据库应该与存储桶的所有更改保持同步,至少在创建或删除对象时如此,理想情况下在修改、存储类别更改等时也是如此。
实现这一目标的最佳方法是什么?
答案1
第一步是设计数据库的表和列,确定元数据的存储方式,设计查询语句和更新语句。
然后实现 Cloud Storage Triggers 来通知您编写的服务以处理来自 Cloud Storage 的事件。Cloud Functions 和 Cloud Run 通常用于处理事件。作为处理事件的一部分,您的代码将更新数据库。
触发器正常工作后的最后一步是扫描整个存储桶并使用每个 Cloud Storage 对象的元数据更新数据库。
您的问题没有包含细节。最好使用数字陈述,而不是我在 GCP Cloud Storage Bucket 中存储了大量对象。对我来说,这意味着至少有数千万个对象。您的问题不包含有关云存储中发生更改的速度的信息,也不包含您需要执行的实际查询。
请记住,Cloud Storage 是一个平面命名空间。层次结构(文件夹/目录)的概念是在软件中模拟的。如果您将命名空间存储在数据库中的方式与存储在 Cloud Storage 中的方式相同,那么性能可能不会更好。
我已经多次为 AWS、Google Cloud 和 Azure 实现了您的设计类型。除非您真的想要事件驱动系统的复杂性,否则我建议您偶尔读取存储桶并创建一个可以使用 grep、awk 等处理的简单文本电子表格。