在Google App Engine的1.8.4 版本中,它声明:
此版本中的 Datastore Admin 修复通过确保计划备份现在只能由 cron 或任务队列任务启动来提高安全性。管理员仍然可以通过转到 Admin Console 中的 Datastore Admin 来启动备份。
记录了使用 cron 运行计划备份的方法,但是我们如何从任务队列任务中启动备份呢?
是否有任何其他方式可以以编程方式运行备份任务?
在Google App Engine的1.8.4 版本中,它声明:
此版本中的 Datastore Admin 修复通过确保计划备份现在只能由 cron 或任务队列任务启动来提高安全性。管理员仍然可以通过转到 Admin Console 中的 Datastore Admin 来启动备份。
记录了使用 cron 运行计划备份的方法,但是我们如何从任务队列任务中启动备份呢?
是否有任何其他方式可以以编程方式运行备份任务?
您可以使用方法 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 中执行此操作,您必须在队列定义中创建一个带有目标的队列,并将您的任务添加到该队列中。
我通过将 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("_")])
回想起来,这些步骤非常简单。
设置:
脚步:
添加 cron 作业以启动备份 (cron.yaml):
cron:
- description: daily backup
url: /taskqueue-ds-backup/
schedule: every 24 hours from 21:00 to 21:59
添加一个队列来处理任务(queue.yaml):
- name: ds-backup-queue
rate: 1/s
retry_parameters:
task_retry_limit: 1
向任务队列处理程序添加路由:
routes = [...,
RedirectRoute('/taskqueue-ds-backup/',
tasks.BackupDataTaskHandler,
name='ds-backup-queue', strict_slash=True), ...]
添加处理程序以处理排队的项目:
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.")