为 Spanner 部署分布式自动扩缩器工具


本教程介绍如何使用分布式部署拓扑为 Spanner 设置自动扩缩器工具的基础架构。在本教程介绍的部署选项中,自动扩缩器的所有组件均位于单个项目中,但 Cloud Scheduler、转发器主题及其相应功能除外。

本教程适用于想要降低运营开销和优化 Spanner 部署费用的 IT、运营和站点可靠性工程团队。本文档是以下系列文章中的一篇:

分布式部署拓扑结合了每个项目和集中式部署的以下优势:

  • 拥有 Spanner 实例的团队(称为应用团队)使用其拥有的 Cloud Scheduler 作业来管理其实例的自动扩缩器配置参数。
  • 在配置参数之外,中央团队负责管理其余的自动扩缩器基础架构,从而最大限度地减少管理开销。

架构

下图展示了分布式部署拓扑中的自动扩缩器架构:

分布式部署拓扑。

关于自动扩缩器的组件以及每个 请参阅自动扩缩 Spanner

转发器函数

Cloud Scheduler 只能向同一项目中的主题发布消息,因此,对于分布式拓扑,本教程引入了一个名为转发器函数的中间组件。

转发器函数将消息从 Cloud Scheduler 中发布到 Pub/Sub,检查其 JSON 语法,然后将其转发到“轮询器 Pub/Sub”主题。该主题可以属于 Cloud Scheduler 的一个单独项目。

下图显示了用于转发机制的组件:

转发机制。

如上图所示,Spanner 实例位于项目中 应用 1应用 2

  1. Cloud Scheduler 与 Spanner 相同的项目 实例。
  2. (2a) Cloud Scheduler 会将其消息发布到应用 1 和应用 2 项目中的转发器主题。

    (2b) 转发器函数从转发器主题中读取消息。

    (2c) 转发器函数将消息转发到自动扩缩器项目中的轮询主题。

  3. 轮询器函数从轮询主题中读取消息,然后继续执行该过程,如自动扩缩 Spanner 中所述。

目标

  • 使用分布式部署模型部署自动扩缩器。
  • 将现有 Spanner 实例导入 Terraform 状态。
  • 配置自动扩缩器。

费用

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

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

当您按照本教程中的说明进行操作时,与自动扩缩器组件操作相关的费用应为零或接近零。但是,此估算值不包括 Spanner 的费用 实例。有关如何计算 Spanner 实例费用的示例,请参阅自动扩缩 Spanner

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

准备工作

在分布式拓扑中,除了自动扩缩程序,您还设置了第二个项目,本教程中称为“应用项目”。Application 项目用于保存应用资源 包括 Spanner。在本教程中,您将为这两个项目分别设置和启用结算功能以及 API。

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  2. 在 Cloud Shell 中,克隆以下 Git 代码库:

    git clone https://github.com/cloudspannerecosystem/autoscaler
    
  3. 导出工作目录的变量:

    export AUTOSCALER_DIR="$(pwd)/autoscaler/terraform/cloud-functions/distributed/autoscaler-project"
    export APP_DIR="$(pwd)/autoscaler/terraform/cloud-functions/distributed/app-project"
    

准备自动扩缩器项目

在本部分中,您将为项目部署包含除 Cloud Scheduler 之外的所有集中式自动扩缩器基础架构的项目。

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the Identity and Access Management (IAM), Resource Manager, App Engine Admin, Firestore, Spanner, Pub/Sub, Cloud Run functions, and Cloud Build APIs.

    Enable the APIs

  4. 在 Cloud Shell 中,使用自动扩缩器项目的 ID 设置环境变量:

    export AUTO_SCALER_PROJECT_ID=INSERT_YOUR_PROJECT_ID
    gcloud config set project "${AUTO_SCALER_PROJECT_ID}"
    
  5. 设置区域和可用区App Engine 位置 (适用于 Firestore) 适用于自动扩缩器基础架构:

     export AUTO_SCALER_REGION=us-central1
     export AUTO_SCALER_ZONE=us-central1-c
     export AUTO_SCALER_APP_ENGINE_LOCATION=us-central
    
  6. 创建服务账号

    gcloud iam service-accounts create terraformer --display-name "Terraform service account"
    

    Terraform 会使用此账号创建基础架构中的资源。

  7. 为服务账号授予项目所有者角色:

     gcloud projects add-iam-policy-binding "${AUTO_SCALER_PROJECT_ID}" \
        --member "serviceAccount:terraformer@${AUTO_SCALER_PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/owner
    
  8. 创建服务账号密钥文件

     gcloud iam service-accounts keys create \
        --iam-account "terraformer@${AUTO_SCALER_PROJECT_ID}.iam.gserviceaccount.com" "${AUTOSCALER_DIR}/key.json"
    
  9. 如果您的项目还没有 Firestore 实例,请创建一个:

     gcloud app create --region="${AUTO_SCALER_APP_ENGINE_LOCATION}"
     gcloud alpha firestore databases create --region="${AUTO_SCALER_APP_ENGINE_LOCATION}"
    

部署自动扩缩器

在本部分中,您将使用以下目录中的 Terraform 文件来部署构成自动扩缩器的组件:

目录 目录内容
terraform/ 顶级配置,其中包括每个部署选项和可重复使用的模块。
terraform/cloud-functions/distributed/autoscaler-project/ 自动扩缩器所在的项目的配置。委托给自动扩缩器模块。
terraform/modules/autoscaler-functions 轮询器和扩缩器 Cloud Run 函数及 Pub/Sub 主题的配置。
  1. 在 Cloud Shell 中,在相应的 Terraform 环境变量中设置项目 ID、区域、可用区和 App Engine 位置:

    export TF_VAR_project_id="${AUTO_SCALER_PROJECT_ID}"
    export TF_VAR_region="${AUTO_SCALER_REGION}"
    export TF_VAR_zone="${AUTO_SCALER_ZONE}"
    export TF_VAR_location="${AUTO_SCALER_APP_ENGINE_LOCATION}"
    
  2. 将目录更改为 Terraform 扩缩器项目目录并将其初始化:

    cd "${AUTOSCALER_DIR}"
    terraform init
    
  3. 创建自动扩缩器基础架构:

    terraform apply -parallelism=2
    

    验证资源后,请在看到提示时输入 yes

    在 Cloud Shell 中运行此命令时,您可能会遇到以下错误消息:"Error: cannot assign requested address"

    此错误是 Terraform Google 提供程序中的已知问题。在这种情况下,请使用以下命令重试:

    terraform apply -parallelism=1
    

准备应用项目

在本部分,在包含 Spanner 实例的项目中,准备部署 Cloud Scheduler 和转发器主题及功能。

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the Identity and Access Management, Resource Manager, App Engine Admin, Firestore, Spanner, Pub/Sub, Cloud Run functions, and Cloud Build APIs.

    Enable the APIs

  4. 在 Cloud Shell 中,使用应用项目的 ID 设置环境变量:

    export APP_PROJECT_ID=INSERT_YOUR_APP_PROJECT_ID
    gcloud config set project "${APP_PROJECT_ID}"
    
  5. 设置区域和可用区App Engine 位置 (针对 Application 项目):

    export APP_REGION=us-central1
    export APP_ZONE=us-central1-c
    export APP_APP_ENGINE_LOCATION=us-central
    
  6. 创建服务账号 让 Terraform 用于在基础设施中创建资源:

    gcloud iam service-accounts create terraformer --display-name "Terraform service account"
    
  7. 为服务账号授予项目所有者角色 (roles/owner):

     gcloud projects add-iam-policy-binding "${APP_PROJECT_ID}" \
        --member "serviceAccount:terraformer@${APP_PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/owner
    
  8. 创建服务账号密钥文件

     gcloud iam service-accounts keys create \
        --iam-account "terraformer@${APP_PROJECT_ID}.iam.gserviceaccount.com"  "${APP_DIR}/key.json"
    
  9. 创建一个应用以启用 Cloud Scheduler:

    gcloud app create --region="${APP_APP_ENGINE_LOCATION}"
    

    您无需创建 Firestore 数据库,因为该状态存储在自动扩缩器项目中。

部署应用项目基础架构

构成应用项目的 Terraform 组件位于以下目录中:

在本部分中,您将使用 Terraform 文件来部署构成应用项目的组件。

  1. 在 Cloud Shell 中,在相应的 Terraform 环境变量中设置项目 ID、区域、可用区和 App Engine 位置:

      export TF_VAR_project_id="${APP_PROJECT_ID}"
      export TF_VAR_region="${APP_REGION}"
      export TF_VAR_zone="${APP_ZONE}"
      export TF_VAR_location="${APP_APP_ENGINE_LOCATION}"
    
  2. 设置用于存储自动扩缩器状态的项目 ID:

    export TF_VAR_state_project_id="${AUTO_SCALER_PROJECT_ID}"
    

    自动扩缩器状态包括针对每个实例触发扩缩事件时的时间戳。

  3. 如果要创建新的 Spanner 实例来测试自动扩缩器,请设置以下变量:

    export TF_VAR_terraform_spanner=true
    

    Terraform 创建的 Spanner 实例名为 autoscale-test

    如果您不想由于需要监控自动扩缩器的实例而创建新的 Spanner 实例,请在以下变量中设置实例名称:

    export TF_VAR_spanner_name=INSERT_YOUR_SPANNER_INSTANCE_NAME
    

    如需详细了解如何设置 Terraform 以管理您的 Spanner 实例,请参阅导入 Spanner 实例

  4. 将目录更改为 Terraform 应用项目目录并将其初始化:

    cd "${APP_DIR}"
    terraform init
    
  5. 在应用项目中创建基础架构:

    terraform import module.scheduler.google_app_engine_application.app "${APP_PROJECT_ID}"
    terraform apply -parallelism=2
    

    验证 Terraform 要创建的资源列表正确无误,并在出现提示时输入 yes

    在 Cloud Shell 中运行此命令时,您可能会遇到以下错误消息:"Error: cannot assign requested address"

    此错误是 Terraform Google 提供程序中的已知问题。在这种情况下,请使用以下命令重试:

    terraform apply -parallelism=1
    

授权转发器 Cloud Run 函数发布到轮询器主题

  1. 在 Cloud Shell 中,切换回自动扩缩器项目目录,并确保 Terraform 变量设置正确:

    cd "${AUTOSCALER_DIR}"
    
    export TF_VAR_project_id="${AUTO_SCALER_PROJECT_ID}"
    export TF_VAR_region="${AUTO_SCALER_REGION}"
    export TF_VAR_zone="${AUTO_SCALER_ZONE}"
    export TF_VAR_location="${AUTO_SCALER_APP_ENGINE_LOCATION}"
    
  2. 为您的转发器服务账号设置 Terraform 变量。根据需要更新并添加服务账号:

     export TF_VAR_forwarder_sa_emails='["serviceAccount:forwarder-sa@'"${APP_PROJECT_ID}"'.iam.gserviceaccount.com"]'
      terraform apply -parallelism=2
    

    验证 Terraform 要创建的资源列表正确无误,并在出现提示时输入 yes

    在 Cloud Shell 中运行此命令时,您可能会遇到以下错误消息:"Error: cannot assign requested address"

    此错误是 Terraform Google 提供程序中的已知问题。在这种情况下,请使用以下命令重试:

    terraform apply -parallelism=1.
    

验证您的部署

自动扩缩器的基础架构准备就绪后,您可以配置其参数。 如需了解详情,请参阅配置自动扩缩器

由于您在本教程中创建了分布式部署,因此日志具有以下属性:

  • 来自轮询器和扩缩器函数的日志显示在自动扩缩器项目的日志浏览器中。
  • 关于 Cloud Scheduler 负载的 JSON 配置中的语法错误的日志显示在每个应用项目的日志浏览器中。这样,负责特定任务的团队 Spanner 实例排查其配置问题 相互独立。

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

后续步骤