2

在Google App Engine的1.8.4 版本中,它声明:

此版本中的 Datastore Admin 修复通过确保计划备份现在只能由 cron 或任务队列任务启动来提高安全性。管理员仍然可以通过转到 Admin Console 中的 Datastore Admin 来启动备份。

记录了使用 cron 运行计划备份的方法,但是我们如何从任务队列任务中启动备份呢?

是否有任何其他方式可以以编程方式运行备份任务?

4

2 回答 2

7

您可以使用方法 GET 和 URL“/_ah/datastore_admin/backup.create”创建任务队列任务,并将您的参数指定为 URL 的参数,并将任务定位为在“ah-builtin-python-bundle”版本上运行。例子:

url = '/_ah/datastore_admin/backup.create?filesystem=blobstore&name=MyBackup&kind=Kind1&kind=Kind2'
taskqueue.add(
        url=url,
        target='ah-builtin-python-bundle',
        method='GET',
        )

我有 cron 作业触发我自己的处理程序,然后查找配置并基于该配置创建任务队列备份。这让我可以更改备份设置而无需更新 cron 作业,并让我有更多的控制权。

您可以在 URL 中指定的选项与文档描述的CRON 作业备份相同,因此您也可以指定命名空间和 gs-bucket-name。

我相信要在 Java 中执行此操作,您必须在队列定义中创建一个带有目标的队列,并将您的任务添加到该队列中。

于 2013-09-13T18:29:19.930 回答
2

我通过将 Bryce 的解决方案与 google 预定备份文档中的代码相结合来做到这一点。这样,我仍在使用 cron.yaml,但我可以灵活地适应每个环境中的差异(例如,不要根据数据存储中的配置在 dev/stage 分支中运行备份,不要在 URL 中指定类型还没有从开发中脱颖而出)。

我还能够使用以下方法生成 &kind=xxx 对:

    from google.appengine.ext.ndb import metadata
    backup_types = "".join(["&kind=" + kind for kind in metadata.get_kinds()  if not kind.startswith("_")])

回想起来,这些步骤非常简单。

设置:

a)启用您的默认云存储桶

b)启用数据存储管理员

脚步:

  1. 添加 cron 作业以启动备份 (cron.yaml):

    cron:
    - description: daily backup
      url: /taskqueue-ds-backup/
      schedule: every 24 hours from 21:00 to 21:59
    
  2. 添加一个队列来处理任务(queue.yaml):

    - name: ds-backup-queue
      rate: 1/s
      retry_parameters:
        task_retry_limit: 1
    
  3. 向任务队列处理程序添加路由:

    routes = [...,
              RedirectRoute('/taskqueue-ds-backup/',
                 tasks.BackupDataTaskHandler, 
                 name='ds-backup-queue', strict_slash=True), ...]
    
  4. 添加处理程序以处理排队的项目:

    from google.appengine.api import app_identity
    from google.appengine.api import taskqueue
    from google.appengine.ext.ndb import metadata
    import config
    
    class BackupDataTaskHandler(webapp2.RequestHandler):
        def get(self):
            enable_ds_backup = bool(config.get_config_setting("enable_datastore_backup", default_value="False"))
            if not enable_ds_backup:
                logging.debug("skipping backup. backup is not enabled in config")
                return
    
            backup_types = "".join(["&kind=" + kind for kind in metadata.get_kinds() if not kind.startswith("_")])
    
            file_name_prefix = app_identity.get_application_id().replace(" ", "_") + "_"
            bucket_name = app_identity.get_default_gcs_bucket_name()
    
            backup_url = "/_ah/datastore_admin/backup.create?name={0}&filesystem=gs&gs_bucket_name={1}{2}".format(file_name_prefix, bucket_name, backup_types)
            logging.debug("backup_url: " + backup_url)
    
            # run the backup as a service in production. note this is only possible if you're signed up for the managed backups beta.
            if app_identity.get_application_id() == "production-app-id":
                backup_url += "&run_as_a_service=T"
    
            taskqueue.add(
                    url=backup_url,
                    target='ah-builtin-python-bundle',
                    method='GET',
                    )
            logging.debug("BackupDataTaskHandler completed.")
    
于 2015-07-29T20:36:57.013 回答