本教程介绍如何使用 Cloud Scheduler 和 Cloud Run 函数为 Cloud SQL 数据库安排手动备份。
完成本教程大约需要 30 分钟。
首先,克隆包含测试数据库的 Git 代码库并将这些数据库存储在 Cloud Storage 存储桶中以设置环境。
然后,您将创建一个 Cloud SQL for MySQL 数据库实例,并将测试数据库从 Cloud Storage 存储桶导入该实例中。
设置环境后,您将创建一个 Cloud Scheduler 作业,该作业会在计划的日期和时间发布有关 Pub/Sub 主题的备份触发器消息。该消息包含有关 Cloud SQL 实例名称和项目 ID 的信息。该消息会触发一个 Cloud Run 函数。该函数使用 Cloud SQL Admin API 在 Cloud SQL 上启动数据库备份。下图演示了此工作流。
Google Cloud 组件
在本文档中,您将使用 Google Cloud 的以下收费组件:
您可使用价格计算器根据您的预计使用情况来估算费用。
- Cloud Storage:存储您导入 Cloud SQL 的测试数据库。
- Cloud SQL 实例:包含要备份的数据库。
- Cloud Scheduler:按设定的时间表将消息发布到 Pub/Sub 主题。
- Pub/Sub:包含从 Cloud Scheduler 发送的消息。
- Cloud Run 函数:订阅 Pub/Sub 主题,并在触发时对 Cloud SQL 实例进行 API 调用以启动备份。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
在 Google Cloud 控制台中,转到 API 页面,并启用以下 API:
- Cloud SQL Admin API
- Cloud Run Functions API
- Cloud Scheduler API
- Cloud Build API
- App Engine Admin API
在本教程的其余部分,您将通过 Cloud Shell 运行所有命令。
设置环境
首先,您需要克隆包含示例数据的代码库。然后,您需要配置环境并创建具有本教程所需权限的自定义角色。
您可以在 Cloud Shell 中执行本教程中的所有操作。
克隆包含示例数据的代码库:
git clone https://github.com/GoogleCloudPlatform/training-data-analyst.git
您将使用
training-data-analyst
代码库中的数据创建包含一些模拟记录的数据库。配置以下环境变量:
export PROJECT_ID=`gcloud config get-value project` export DEMO="sql-backup-tutorial" export BUCKET_NAME=${USER}-MySQL-$(date +%s) export SQL_INSTANCE="${DEMO}-sql" export GCF_NAME="${DEMO}-gcf" export PUBSUB_TOPIC="${DEMO}-topic" export SCHEDULER_JOB="${DEMO}-job" export SQL_ROLE="sqlBackupCreator" export STORAGE_ROLE="simpleStorageRole" export REGION="us-west2"
创建两个仅具有本教程所需权限的自定义角色:
gcloud iam roles create ${STORAGE_ROLE} --project ${PROJECT_ID} \ --title "Simple Storage role" \ --description "Grant permissions to view and create objects in Cloud Storage" \ --permissions "storage.objects.create,storage.objects.get"
gcloud iam roles create ${SQL_ROLE} --project ${PROJECT_ID} \ --title "SQL Backup role" \ --description "Grant permissions to backup data from a Cloud SQL instance" \ --permissions "cloudsql.backupRuns.create"
这些角色可以缩小 Cloud Run functions 和 Cloud SQL 服务账号的访问权限范围,从而遵循最小权限原则。
创建 Cloud SQL 实例
在本部分中,您将创建 Cloud Storage 存储桶和 Cloud SQL for MySQL 实例。然后将测试数据库上传到 Cloud Storage 存储桶,并数据库从该位置导入 Cloud SQL 实例。
创建 Cloud Storage 存储桶
可以使用 gcloud CLI 创建 Cloud Storage 存储桶。
```sh
gcloud storage buckets create gs://${BUCKET_NAME} --location=${REGION}
```
创建 Cloud SQL 实例并向其服务账号授予权限
接下来,您将创建 Cloud SQL 实例并向其服务账号授予创建备份运行的权限。
创建 Cloud SQL for MySQL 实例:
sh gcloud sql instances create ${SQL_INSTANCE} --database-version MYSQL_5_7 --region ${REGION}
此操作需要几分钟时间才能完成。
验证 Cloud SQL 实例是否正在运行:
gcloud sql instances list --filter name=${SQL_INSTANCE}
输出类似于以下内容:
NAME DATABASE_VERSION LOCATION TIER PRIMARY_ADDRESS PRIVATE_ADDRESS STATUS sql-backup-tutorial MYSQL_5_7 us-west2-b db-n1-standard-1 x.x.x.x - RUNNABLE
使用 Simple Storage 角色向您的 Cloud SQL 服务账号授予将数据导出到 Cloud Storage 的权限:
export SQL_SA=(`gcloud sql instances describe ${SQL_INSTANCE} \ --project ${PROJECT_ID} \ --format "value(serviceAccountEmailAddress)"`) gcloud storage buckets add-iam-policy-binding gs://${BUCKET_NAME} \ --member=serviceAccount:${SQL_SA} \ --role=projects/${PROJECT_ID}/roles/${STORAGE_ROLE}
使用示例数据填充 Cloud SQL 实例
现在,您可以将文件上传到存储桶并创建和填充示例数据库。
转到您克隆的代码库:
cd training-data-analyst/CPB100/lab3a/cloudsql
将目录中的文件上传到新的存储桶:
gcloud storage cp * gs://${BUCKET_NAME}
创建一个示例数据库;在“是否继续 (Y/n)?”提示处,输入 Y(是)以继续。
gcloud sql import sql ${SQL_INSTANCE} gs://${BUCKET_NAME}/table_creation.sql --project ${PROJECT_ID}
填充数据库;在“是否继续”(Y/n)?”提示处,输入 Y(是)以继续。
gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/accommodation.csv \ --database recommendation_spark \ --table Accommodation
gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/rating.csv \ --database recommendation_spark \ --table Rating
创建主题、函数和调度器作业
在本部分中,您将创建一个自定义 IAM 服务账号,并将其绑定到您在设置环境中创建的自定义 SQL 角色。然后,您将创建一个 Pub/Sub 主题以及订阅该主题的 Cloud Run 函数,并使用 Cloud SQL Admin API 启动备份。最后,您将创建一个 Cloud Scheduler 作业以定期将消息发布到 Pub/Sub 主题。
为 Cloud Run 函数创建服务账号
第一步是创建一个自定义服务账号并将其绑定到您在设置环境中创建的自定义 SQL 角色。
创建一个供 Cloud Run 函数使用的 IAM 服务账号:
gcloud iam service-accounts create ${GCF_NAME} \ --display-name "Service Account for GCF and SQL Admin API"
向 Cloud Run 函数服务账号授予对自定义 SQL 角色的访问权限:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \ --role="projects/${PROJECT_ID}/roles/${SQL_ROLE}"
创建 Pub/Sub 主题
下一步是创建一个 Pub/Sub 主题,用于触发与 Cloud SQL 数据库交互的 Cloud Run 函数。
```sh
gcloud pubsub topics create ${PUBSUB_TOPIC}
```
创建 Cloud Run 函数
接下来,您将创建 Cloud Run 函数。
通过将以下内容粘贴到 Cloud Shell 中来创建
main.py
文件:cat <<EOF > main.py import base64 import logging import json from datetime import datetime from httplib2 import Http from googleapiclient import discovery from googleapiclient.errors import HttpError from oauth2client.client import GoogleCredentials def main(event, context): pubsub_message = json.loads(base64.b64decode(event['data']).decode('utf-8')) credentials = GoogleCredentials.get_application_default() service = discovery.build('sqladmin', 'v1beta4', http=credentials.authorize(Http()), cache_discovery=False) try: request = service.backupRuns().insert( project=pubsub_message['project'], instance=pubsub_message['instance'] ) response = request.execute() except HttpError as err: logging.error("Could NOT run backup. Reason: {}".format(err)) else: logging.info("Backup task status: {}".format(response)) EOF
通过将以下内容粘贴到 Cloud Shell 中来创建
requirements.txt
文件:cat <<EOF > requirements.txt google-api-python-client Oauth2client EOF
部署代码:
gcloud functions deploy ${GCF_NAME} \ --trigger-topic ${PUBSUB_TOPIC} \ --runtime python37 \ --entry-point main \ --service-account ${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
创建 Cloud Scheduler 作业
最后,您将创建一个 Cloud Scheduler 作业以定期触发每小时数据备份函数。Cloud Scheduler 使用 App Engine 实例进行部署。
为 Cloud Scheduler 作业创建 App Engine 实例:
gcloud app create --region=${REGION}
创建 Cloud Scheduler 作业:
gcloud scheduler jobs create pubsub ${SCHEDULER_JOB} \ --schedule "0 * * * *" \ --topic ${PUBSUB_TOPIC} \ --message-body '{"instance":'\"${SQL_INSTANCE}\"',"project":'\"${PROJECT_ID}\"'}' \ --time-zone 'America/Los_Angeles'
测试您的解决方案
最后一步是测试您的解决方案。首先,您需要运行 Cloud Scheduler 作业。
手动运行 Cloud Scheduler 作业以触发数据库的 MySQL 转储。
gcloud scheduler jobs run ${SCHEDULER_JOB}
列出在 MySQL 实例上执行的操作,并验证是否存在类型为
BACKUP_VOLUME
的操作:gcloud sql operations list --instance ${SQL_INSTANCE} --limit 1
输出会显示已完成的备份作业,例如:
NAME TYPE START END ERROR STATUS 8b031f0b-9d66-47fc-ba21-67dc20193749 BACKUP_VOLUME 2020-02-06T21:55:22.240+00:00 2020-02-06T21:55:32.614+00:00 - DONE
清理
您可以按照以下步骤操作,以避免系统因本教程中使用的资源而向您的 Google Cloud 账号收取费用。为避免支付费用,最简单的方法是删除您为本教程创建的项目。
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
如果您不想删除整个项目,可删除您创建的每项资源。为此,请转到 Google Cloud 控制台中的相应页面,选择资源并将其删除。
后续步骤
- 了解如何使用 Cloud Scheduler 安排计算实例。
- 详细了解 Cloud SQL 备份。
- 探索有关 Google Cloud 的参考架构、图表和最佳实践。查看我们的 Cloud 架构中心。