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