【问题标题】:Run appengine backup from task queue从任务队列运行 appengine 备份
【发布时间】:2013-09-18 11:29:06
【问题描述】:

在 Google App Engine 的 1.8.4 release 中声明:

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

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

还有其他方法可以以编程方式运行备份任务吗?

【问题讨论】:

    标签: google-app-engine cron database-backups


    【解决方案1】:

    我通过将 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)Enable your default cloud storage bucket

    b)Enable datastore admin

    步骤:

    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.")
      

    【讨论】:

      【解决方案2】:

      您可以使用方法 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 job backups 相同,因此您也可以指定命名空间和 gs-bucket-name。

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

      【讨论】:

      • 谢谢@bryce-cutt。这有帮助,当您运行任务时,您可以指定要备份的命名空间或任何其他选项吗?
      • 任何人都知道,如何从java运行上面的?我试过 String backendAddress = BackendServiceFactory.getBackendService().getBackendAddress("ah-builtin-python-bundle"); TaskOptions taskOptions = withUrl("/_ah/datastore_admin/backup.create?name=BackupToCloud-Task&") .header("Host", backendAddress) .method(TaskOptions.Method.GET);
      • @husayt 我根本不了解 GAE 上的 Java,但似乎您可以在任务队列定义中设置目标版本。尝试为定义了目标的备份创建一个队列,并将您的任务放在该队列中。 developers.google.com/appengine/docs/java/config/queue#target
      猜你喜欢
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      相关资源
      最近更新 更多