从Google Cloud Datastore进行可扩展的全部删除

时间:2018-11-06 10:35:40

标签: google-cloud-datastore

我正在尝试为我的Google appengine / datastore解决方案实现完整的备份/还原功能。我正在使用推荐的https://cloud.google.com/datastore/docs/export-import-entities进行定期备份和还原。 关于该怎么办,我无能为力的一件事是如何还原到一个空的数据存储区?导入功能不会在导入之前清除数据存储,因此我必须自己对数据存储进行完全擦除。 (而且,出于测试目的等目的,清除数据存储区的方法也可能是一件好事。)

数据存储管理员无法使用,因为它已被淘汰。

根据google文档,推荐的方法是使用批量删除:https://cloud.google.com/dataflow/docs/templates/provided-templates#cloud-datastore-bulk-delete。 这种方法的问题在于,我必须为每个名称空间/种类组合启动1个数据流作业。我有一个多租户解决方案,每个租户一个名称空间,每个命名空间约20种。因此,如果我有100个租户,这将提供2000个数据流作业以擦除数据存储。但是默认的配额是25个同时进行的工作...是的,我可以联系Google以获得更高的配额,但是数量上的差异表明我做错了。

那么,关于如何擦除整个数据存储区的任何建议?我希望有一个可扩展的解决方案(不会超出请求超时限制等),而不必编写数百行代码...

2 个答案:

答案 0 :(得分:1)

一种可能性是在该项目中创建一个简单的第一代python 2.7 GAE应用程序(或仅一个服务),并使用guide(通常比通用数据存储区API更有效)来实现按需选择性/ total数据存储区按照ndb library

中所述进行擦除

答案 1 :(得分:0)

此解决方案删除所有名称空间中的所有条目。 通过使用 ndb.metadata ,不需要模型类。 通过使用 ndb.delete_multi_async ,它将能够在达到请求时间限制之前处理相当大的数据存储。

from google.appengine.api import namespace_manager
from google.appengine.ext import ndb

...

    def clearDb():
        for namespace in ndb.metadata.get_namespaces():
            namespace_manager.set_namespace(namespace)
            for kind in ndb.metadata.get_kinds():
                keys = [k for k in ndb.Query(kind=kind).iter(keys_only=True)]
                ndb.delete_multi_async(keys)

解决方案是答案的组合:

请参阅后者,以获取有关如何在达到时间限制时进行改进以及如何避免实例爆炸的提示。