为 Cloud Spanner 部署每个项目或集中式自动扩缩器工具


本教程介绍如何为 Cloud Spanner 设置自动扩缩器工具的基础架构。本教程根据您的要求演示了两种设置基础架构的方法:

  • 每个项目的部署拓扑。对于希望管理自己的自动扩缩器配置和基础架构的独立团队,我们建议使用此拓扑。此外,每个项目的部署拓扑也是测试自动扩缩器功能的良好起点。
  • 集中式部署拓扑。对于管理一个或多个 Spanner 实例的配置和基础架构的团队,我们建议使用此拓扑结构,同时保持自动扩缩程序的组件和配置位于中心位置。在集中式拓扑中,除了自动扩缩程序,您还设置了第二个项目,本教程中称为“应用项目”。应用项目包含应用资源,包括 Cloud Spanner。在本教程中,您将为这两个项目分别设置和启用结算功能以及 API。

本文档是以下系列文章中的一篇:

本系列文章适用于想要降低运营开销和优化 Cloud Spanner 部署费用的 IT、运营和站点可靠性工程 (SRE) 团队。

目标

  • 使用每个项目或集中式部署拓扑部署自动扩缩器。
  • 将现有 Cloud Spanner 实例导入 Terraform 状态。
  • 配置自动扩缩器。

费用

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

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

实施本教程时,与自动扩缩器组件操作相关的费用应为零或接近零。但是,此估算不包括 Cloud Spanner 实例的费用。有关如何计算 Cloud Spanner 实例费用的示例,请参阅自动扩缩 Cloud Spanner

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

准备工作

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

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

    git clone https://github.com/cloudspannerecosystem/autoscaler
    
  3. 导出每个拓扑的 Terraform 配置文件所在的工作目录的变量:

    export AUTOSCALER_DIR="$(pwd)/autoscaler/terraform/cloud-functions/per-project"
    

准备自动扩缩器项目

在本部分中,您将准备要部署的自动扩缩器项目。

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

    转到“项目选择器”

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

  3. 启用 Identity and Access Management (IAM), Resource Manager, App Engine Admin, Firestore, Cloud Spanner, Pub/Sub, Cloud Functions, Cloud Build, and Cloud Scheduler API。

    启用 API

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

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

    export REGION=us-central1
    export ZONE=us-central1-c
    export 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 "${PROJECT_ID}" \
        --member "serviceAccount:terraformer@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/owner
    
  8. 创建服务账号密钥文件

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

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

准备应用项目

如果要按项目模式部署自动扩缩器,则可以跳至部署自动扩缩器

在集中式部署拓扑中,自动调节程序的所有组件都属于同一项目。Spanner 实例可位于不同的项目中。

在本部分中,您将配置您的 Spanner 实例所在的 Application 项目。Spanner 实例提供一个或多个特定应用。在本教程中,假定负责这些应用的团队与负责自动扩缩基础架构和配置的团队分开。

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

    转到“项目选择器”

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

  3. 启用 Spanner API。

    启用 API

  4. 在 Cloud Shell 中,设置环境变量:

    export APP_PROJECT_ID=INSERT_YOUR_APP_PROJECT_ID
    

    INSERT_YOUR_APP_PROJECT_ID 替换为应用项目的 ID。

  5. 为您在应用项目中创建的所有者角色 (roles/owner) 授予 terraformer 服务账号:

    gcloud projects add-iam-policy-binding "${APP_PROJECT_ID}" \
        --member "serviceAccount:terraformer@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/owner
    

    将角色授予服务账号可创建资源。

  6. 在相应的 Terraform 环境变量中设置应用项目 ID:

    export TF_VAR_app_project_id="${APP_PROJECT_ID}"
    

部署自动扩缩器

在本部分中,您将使用预先配置的 Terraform 模块部署构成自动扩缩程序的组件。定义这些模块的 Terraform 文件位于以下目录:

目录 目录内容
terraform/ 顶级配置,其中包括每个部署选项和可重复使用的模块。
terraform/cloud-functions/per-project/ 每个项目部署选项的说明。
terraform/modules/autoscaler-functions/ 轮询器和扩缩器 Cloud Functions 及 Pub/Sub 主题的配置。
terraform/modules/scheduler/ 用于触发轮询的 Cloud Scheduler 配置。
terraform/modules/spanner/ Cloud Spanner 数据库配置
terraform/cloud-functions/centralized/ 有关集中式部署选项的说明。
  1. 在 Cloud Shell 中,在相应的 Terraform 环境变量中设置项目 ID、区域和可用区:

    export TF_VAR_project_id="${PROJECT_ID}"
    export TF_VAR_region="${REGION}"
    export TF_VAR_zone="${ZONE}"
    
  2. 在此步骤中,您将设置供自动扩缩器监控的现有实例,或创建并设置新实例。

    如果您已有 Spanner 实例,请在以下变量中设置实例名称:

    export TF_VAR_spanner_name=INSERT_YOUR_SPANNER_INSTANCE_NAME
    

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

    export TF_VAR_terraform_spanner=true
    

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

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

  3. 将您的工作目录更改为 Terraform 每个项目目录:

    cd "${AUTOSCALER_DIR}"
    terraform init
    

    此命令还初始化每个项目的 Terraform 目录。

  4. 将现有 App Engine 应用导入 Terraform 状态:

    terraform import module.scheduler.google_app_engine_application.app "${PROJECT_ID}"
    
  5. 创建自动扩缩器基础架构:

    terraform apply -parallelism=2
    

    您会看到以下消息,要求您验证 Terraform 创建的资源列表是否正确:

       Do you want to perform these actions?
       Terraform will perform the actions described above.
       Only 'yes' will be accepted to approve.
       Enter a value:
       

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

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

    "Error: cannot assign requested address"

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

导入 Spanner 实例

如果您想要导入 Terraform 以管理这些实例,因此请按照本部分中的说明操作。否则,请跳至配置自动扩缩器

  1. 在 Cloud Shell 中,列出您的 Spanner 实例:

    gcloud spanner instances list
    
  2. 将以下变量设置为您想要自动扩缩的实例名称:

    SPANNER_INSTANCE_NAME=YOUR_SPANNER_INSTANCE_NAME
    
  3. 使用空的 google_spanner_instance 资源创建 Terraform 配置文件:

    echo "resource \"google_spanner_instance\" \"${SPANNER_INSTANCE_NAME}\" {}" > "${SPANNER_INSTANCE_NAME}.tf"
    
  4. 将 Spanner 实例导入 Terraform 状态:

    terraform import "google_spanner_instance.${SPANNER_INSTANCE_NAME}" "${SPANNER_INSTANCE_NAME}"
    
  5. 导入完成后,使用实际实例属性更新实例的 Terraform 配置文件:

    terraform state show -no-color "google_spanner_instance.${SPANNER_INSTANCE_NAME}" \
        | grep -vE "(id|num_nodes|state|timeouts).*(=|\{)" \
        > "${SPANNER_INSTANCE_NAME}.tf"
    

    如果要导入其他 Spanner 实例,请重复导入过程。

配置自动扩缩器

部署自动扩缩器后,您可以配置其参数。

  1. 在 Google Cloud Console 中,前往 Cloud Scheduler 页面。

    前往 Cloud Scheduler

  2. 选中由自动扩缩器部署创建的 poll-main-instance-metrics 作业旁边的复选框。

  3. 点击修改

  4. 修改载荷字段中显示的自动扩缩器的参数。

    以下是日志的示例:

        [
            {
                "projectId": "my-spanner-project",
                "instanceId": "spanner1",
                "scalerPubSubTopic": "projects/my-spanner-project/topics/spanner-scaling",
                "units": "NODES",
                "minSize": 1,
                "maxSize": 3
            },{
                "projectId": "different-project",
                "instanceId": "another-spanner1",
                "scalerPubSubTopic": "projects/my-spanner-project/topics/spanner-scaling",
                "units": "PROCESSING_UNITS",
                "minSize": 500,
                "maxSize": 3000,
                "scalingMethod": "DIRECT"
            }
        ]
       

    载荷使用 JSON 数组定义。数组中的每个元素代表一个共享同一自动扩缩程序作业时间表的 Spanner 实例。

    如需详细了解参数及其默认值,请参阅轮询器组件的 README

  5. 如需保存更改,请点击更新

    该自动扩缩器现已配置完毕,可以开始监控和安排下次安排的作业运行中的实例。

    如果 JSON 载荷中有语法错误,您可以在 Google Cloud Console 的日志浏览器页面中将其作为 tf-poller-function 函数的日志条目进行检查。

    前往日志浏览器

    以下是您可能会看到的错误示例:

    SyntaxError: Unexpected token errortext in JSON at position 15 JSON.parse

    为避免出现语法错误,请使用可重新格式化和验证 JSON 的编辑器

监控自动扩缩器

在此步骤中,您将设置对轮询器和扩缩器 Cloud Functions 函数的监控。

  1. 在 Google Cloud Console 中,打开日志浏览器页面。

    前往日志浏览器

  2. 点击查询预览,然后在查询构建器中输入以下过滤条件:

    resource.type="cloud_function"
    resource.labels.function_name=~"tf-.*-function"
    
  3. 点击运行查询

    在查询结果下方,您可以看到来自自动扩缩程序函数的所有消息。由于轮询器每 2 分钟运行一次,因此您可能需要重新运行该查询才能接收日志消息。

  4. 如需仅查看来自扩缩器 Cloud Functions 的消息,请点击查询预览框,并将查询构建器文本框中的过滤条件替换为以下内容:

    resource.type="cloud_function"
    resource.labels.function_name="tf-scaler-function"
    
  5. 点击运行查询

    查询结果下,由于应用于文本载荷的过滤条件,您只会看到来自扩缩器函数中与缩放建议和决策相关的消息。

    使用过滤条件查询或类似过滤条件,您可以创建基于日志的指标。这些指标适用于记录自动扩缩事件频率以及 Cloud Monitoring 图表和提醒政策等功能。

测试自动扩缩器

在本部分中,您将通过更改实例大小下限并监控日志来验证自动扩缩器的操作。

使用测试数据库部署自动扩缩器时,自动扩缩器配置为使用 NODES 作为计算容量单位。您可以通过将最小大小 (minSize) 的设置更改为 2 来验证该工具是否正常运行。如果工具按预期运行,则 Cloud Spanner 实例会扩展到 2 个节点。如果您在本教程中使用的是现有数据库,则可能会看到不同的值。

  1. 在 Google Cloud 控制台中,转到 Cloud Scheduler 页面。

    前往 Cloud Scheduler

  2. 选中由自动扩缩器部署创建的 poll-main-instance-metrics 作业旁边的复选框。

  3. 点击修改

  4. 作业载荷字段中,将 minSize 值从 1 更改为 2

    "minSize": 2
    
  5. 如需保存更改,请点击更新

  6. 转到日志浏览器页面。

    打开日志浏览器

  7. 点击查询预览,然后在查询构建器中输入以下过滤条件:

    resource.type="cloud_function"
    resource.labels.function_name="tf-scaler-function"
    
  8. 点击运行查询

  9. 点击跳至现在,直至看到以下日志消息:

    Scaling spanner instance to 2 NODES

  10. 如需验证 Cloud Spanner 是否已扩容到两个节点,请在 Google Cloud 控制台中转到 Cloud Spanner 控制台页面。

    前往 Cloud Spanner

  11. 点击 autoscale-test 实例。

    在概览下,验证节点数现在是否为 2。此快速测试通过修改自动扩缩器参数来演示缩减事件。您可以使用 YCSB 等工具执行负载测试,以模拟自动扩缩器基于利用率触发扩缩事件。

清理

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

删除项目

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

    转到“管理资源”

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

后续步骤