自动保留最新的数据存储备份

时间:2017-09-21 15:12:34

标签: google-app-engine google-cloud-datastore google-cloud-storage google-app-engine-python

我正在寻找收集存储在云端存储中的特定数据存储* .backup_info文件的最佳策略,并将其复制为"最新的"每种类型的backup_info文件,所以我有一个每种类型的修复位置,其中找到了最新的backup_info文件,例如

gs://MY-PROJECT.appspot.com/latest/Comment.backup_info

基本上,我有一个Google App Engine应用程序(Python标准),其中包含Cloud Datastore中的数据。我可以运行一个cron-job来自动和定期执行备份,如文档Scheduled Backups中所述,我还可以编写一些Python代码来执行备份任务,这些任务由described in this SO answer手动触发。我打算编写一个小的Python cron-job,它将执行任务以查找给定类型的最新backup_info文件,并将其复制/重命名为所需位置。

无论哪种方式,原始备份位置在一天内都会挤满大量文件和文件夹,特别是如果某种备份有多个备份。例如,在gs://MY-PROJECT.appspot.com/我会找到:

VeryLoooooongRandomLookingString.backup_info
OtherStringForSecondBackup.backup_info
OtherStringForThirdBackup.backup_info

字符串似乎是每次备份执行的唯一标识符。我假设它包含一个* .backup_info文件列表,每个文件对应一种备份。

VeryLoooooongRandomLookingString.Comment.backup_info
OtherStringForSecondBackup.Comment.backup_info
OtherStringForThirdBackup.Comment.backup_info

对于备份中的每种类型,例如"注释&#34 ;.它似乎包含此类和此备份的实际备份数据列表。

datastore_backup_CUSTOM_PREFIX_2017_09_20_Comment/
datastore_backup_CUSTOM_PREFIX_2017_09_20_1_Comment/
datastore_backup_CUSTOM_PREFIX_2017_09_20_2_Comment/

每个备份和种类的数据文件夹。这里是善待"评论",在9月20日备份了三次。

我的问题与数据存储和/或存储有关:

  1. 调用/_ah/datastore_admin/backup.create时是否可以将自定义UID显式指定为查询参数(或在HTTP标头中)?
  2. 如果没有,是否可以在备份完成后将带有UID的消息发送到挂钩或其他什么位置?
  3. 如果无法使用(1)和(2):在存储中哪种方法最适合查找给定类型的最新* .backup_info文件?似乎listbucket()不允许过滤,我不认为迭代数百或数千个文件寻找某些名称模式会很有效。

1 个答案:

答案 0 :(得分:0)

我找到了两个问题的解决方案,一个是GA,一个是Beta。

答案简短:

  1. GA Datastore Export & Import service允许自定义和可预测的备份路径

  2. 及其long-running operations的API允许获取备份作业的输出网址(例如,对于带有时间戳的路径)。

  3. 由云存储事件触发的云功能只允许在将特定[KIND].backup_info文件添加到存储桶时处理它们,而不是每次都对存储桶中的数千个文件进行分页。 / p>

  4. 数据存储导出&导入

    此新服务具有用于运行导出作业的API(manuallyscheduled)。该作业允许指定路径并产生可预测的完整路径,因此如果在任何时候只需要最新的备份,则可以覆盖现有的备份文件,例如:

    gs://[YOUR_BUCKET]/[PATH]/[NAMESPACE]/[KIND]/[NAMESPACE]_[KIND].export_metadata
    

    对于cron-jobs,App Engine处理程序URL为/cloud-datastore-export(而不是旧/_ah/datastore_admin/backup.create)。此外,导出的格式与旧导出的格式不同。它也可以导入BigQuery,就像旧的[KIND].backup_info文件一样。

    云功能

    部署由备份存储桶中的任何更改触发的云功能(JavaScript / Node.js),如果该文件存在(file.resourceState === 'not_exists'),则为新(file.metageneration === '1'),实际上是我们想要的[KIND].backup_info文件之一,它将被复制到另一个桶(" latest_backups"左右)。副本上的自定义元数据可用于在以后的函数执行中比较timeCreated(因此我们不会意外地用较旧的文件覆盖更新的备份文件)。复制或移动实际的备份有效负载会破坏[KINDNAME].backup_info文件中的引用。