安排 Cloud SQL 数据库备份

安排 Cloud SQL 数据库备份

本教程介绍如何使用 Cloud SchedulerCloud FunctionsCloud SQL 数据库安排手动备份。

完成本教程大约需要 30 分钟。

首先,克隆包含测试数据库的 Git 代码库并将这些数据库存储在 Cloud Storage 存储桶中以设置环境。

然后,您将创建一个 Cloud SQL for MySQL 数据库实例,并将测试数据库从 Cloud Storage 存储桶导入该实例中。

设置环境后,您将创建一个 Cloud Scheduler 作业,该作业会在计划的日期和时间发布有关 Pub/Sub 主题的备份触发器消息。该消息包含有关 Cloud SQL 实例名称和项目 ID 的信息。该消息会触发一个 Cloud Functions 函数。该函数使用 Cloud SQL Admin API 在 Cloud SQL 上启动数据库备份。下图演示了此工作流。

从 Cloud Scheduler 到 Pub/Sub 的工作流,该工作流会触发启动备份的 Cloud Functions 函数。

Google Cloud 组件

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

  • Cloud Storage:存储您导入 Cloud SQL 的测试数据库。
  • Cloud SQL 实例:包含要备份的数据库。
  • Cloud Scheduler:按设定的时间表将消息发布到 Pub/Sub 主题。
  • Pub/Sub:包含从 Cloud Scheduler 发送的消息。
  • Cloud Functions:订阅 Pub/Sub 主题,并在触发时对 Cloud SQL 实例进行 API 调用以启动备份。

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  2. 确保您的 Google Cloud 项目已启用结算功能

  3. 在 Google Cloud Console 中,转到 API 页面,并启用以下 API:

    • Cloud SQL Admin API
    • Cloud Functions API
    • Cloud Scheduler API
    • Cloud Build API
    • App Engine Admin API

    转到“API”

在本教程的其余部分,您将通过 Cloud Shell 运行所有命令。

设置环境

首先,您需要克隆包含示例数据的代码库。然后,您需要配置环境并创建具有本教程所需权限的自定义角色。

您可以在 Cloud Shell 中执行本教程中的所有操作。

  1. 克隆包含示例数据的代码库:

    git clone https://github.com/GoogleCloudPlatform/training-data-analyst.git
    

    您将使用 training-data-analyst 代码库中的数据创建包含一些模拟记录的数据库。

  2. 配置以下环境变量:

    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"
    
  3. 创建两个仅具有本教程所需权限的自定义角色:

    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 Functions 和 Cloud SQL 服务账号的访问权限范围,从而遵循最小权限原则

创建 Cloud SQL 实例

在本部分中,您将创建 Cloud Storage 存储桶和 Cloud SQL for MySQL 实例。然后将测试数据库上传到 Cloud Storage 存储桶,并数据库从该位置导入 Cloud SQL 实例。

创建 Cloud Storage 存储桶

您将使用 gsutil 命令行工具创建 Cloud Storage 存储桶。

```sh
gsutil mb -l ${REGION} gs://${BUCKET_NAME}
```

创建 Cloud SQL 实例并向其服务账号授予权限

接下来,您将创建 Cloud SQL 实例并向其服务账号授予创建备份运行的权限。

  1. 创建 Cloud SQL for MySQL 实例:

    sh gcloud sql instances create ${SQL_INSTANCE} --database-version MYSQL_5_7 --region ${REGION}

    此操作需要几分钟时间才能完成。

  2. 验证 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
    

  3. 使用 Simple Storage 角色向您的 Cloud SQL 服务账号授予将数据导出到 Cloud Storage 的权限:

    export SQL_SA=(`gcloud sql instances describe ${SQL_INSTANCE} \
        --project ${PROJECT_ID} \
        --format "value(serviceAccountEmailAddress)"`)
    
    gsutil iam ch serviceAccount:${SQL_SA}:projects/${PROJECT_ID}/roles/${STORAGE_ROLE} gs://${BUCKET_NAME}
    

使用示例数据填充 Cloud SQL 实例

现在,您可以将文件上传到存储分区并创建和填充示例数据库。

  1. 转到您克隆的代码库:

    cd training-data-analyst/CPB100/lab3a/cloudsql
    
  2. 将目录中的文件上传到新的存储桶:

    gsutil cp * gs://${BUCKET_NAME}
    
  3. 创建一个示例数据库;在“是否继续 (Y/n)?”提示处,输入 Y(是)以继续。

    gcloud sql import sql ${SQL_INSTANCE} gs://${BUCKET_NAME}/table_creation.sql --project ${PROJECT_ID}
    
  4. 填充数据库;在“是否继续”(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 Functions 函数,并使用 Cloud SQL Admin API 启动备份。最后,您将创建一个 Cloud Scheduler 作业以定期将消息发布到 Pub/Sub 主题。

为 Cloud Functions 函数创建服务账号

第一步是创建一个自定义服务账号并将其绑定到您在设置环境中创建的自定义 SQL 角色。

  1. 创建一个供 Cloud Functions 函数使用的 IAM 服务账号:

    gcloud iam service-accounts create ${GCF_NAME} \
        --display-name "Service Account for GCF and SQL Admin API"
    
  2. 向 Cloud Functions 函数服务账号授予对自定义 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 Functions 函数。

```sh
gcloud pubsub topics create ${PUBSUB_TOPIC}
```

创建 Cloud Functions 函数

接下来,您将创建 Cloud Functions 函数。

  1. 通过将以下内容粘贴到 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
    
  2. 通过将以下内容粘贴到 Cloud Shell 中来创建 requirements.txt 文件:

    cat <<EOF > requirements.txt
    google-api-python-client
    Oauth2client
    EOF
    
  3. 部署代码:

    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 实例进行部署。

  1. 为 Cloud Scheduler 作业创建 App Engine 实例:

    gcloud app create --region=${REGION}
    
  2. 创建 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 作业。

  1. 手动运行 Cloud Scheduler 作业以触发数据库的 MySQL 转储。

    gcloud scheduler jobs run ${SCHEDULER_JOB}
    
  2. 列出在 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 账号收取费用。为避免支付费用,最简单的方法是删除您为本教程创建的项目。

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

如果您不想删除整个项目,可删除您创建的每项资源。为此,请转到 Google Cloud 控制台中的相应页面,选择资源并将其删除。

后续步骤