自动扩缩器工具概览

本页面介绍了适用于 Spanner 的自动扩缩器工具 (Autoscaler),这是一种开源工具,可用作 Spanner 的配套工具。借助此工具,您可以根据使用的容量自动增加或减少一个或多个 Spanner 实例中的计算容量。

如需详细了解如何在 Spanner 中进行伸缩,请参阅自动伸缩 Spanner。如需了解如何部署自动扩缩器工具,请参阅以下内容:

本页面介绍自动扩缩器的功能、架构、配置和部署拓扑。本系列后续主题将引导您在每个不同拓扑中部署自动扩缩器。

自动扩缩器

自动扩缩器工具用于管理 Spanner 部署的利用率和性能。为帮助您在费用控制与性能需求之间取得平衡,自动扩缩器工具会监控您的实例,并自动添加或移除节点或处理单元,以帮助确保它们不超出以下参数:

自动扩缩 Spanner 部署可让您的基础架构自动进行调整和扩缩,以满足负载要求,几乎不需要干预。自动扩缩功能还可为预配的基础架构设置适当的容量,从而帮助您降低费用。

架构

本部分详细介绍了自动扩缩器的各个组件及其各自的用途。

自动扩缩器工具架构由 Cloud Scheduler、两个 Pub/Sub 主题、两个 Cloud FunctionsFirestore 组成。Cloud Monitoring API 用于获取 Spanner 实例的 CPU 利用率和存储指标。

Cloud Scheduler

使用 Cloud Scheduler,您可以定义自动伸缩器工具验证 Spanner 实例伸缩指标阈值的频率。Cloud Scheduler 作业可以同时检查一个或多个实例。您可以根据需要定义任意数量的作业时间表。

轮询器 Cloud Functions 函数

轮询器 Cloud Functions 函数负责收集和处理一个或多个 Spanner 实例的时间序列指标。轮询器会预处理每个 Spanner 实例的指标数据,以便仅评估最相关的数据点并发送到 Scaler Cloud Functions 函数。Poller Cloud Functions 函数完成的预处理还简化了评估单区域、双区域和多区域 Spanner 实例的阈值的过程。

扩缩器 Cloud Functions 函数

Scaler Cloud Functions 函数会评估从 Poller Cloud Functions 函数收到的数据点,并确定是否需要调整节点数量或处理单元数量,以及调整幅度。Cloud Functions 函数会将指标值与阈值(加上或减去允许的外边距)进行比较,并根据配置的伸缩方法调整节点或处理单元的数量。如需详细了解伸缩方法,请参阅自动伸缩器功能

操作流程

本部分详细介绍了自动扩缩器工具的操作模式,如以下架构图所示。

自动扩缩器操作模型。

  1. 您可以在 Cloud Scheduler 中定义自动扩缩作业的时间表、时间和频率。
  2. Cloud Scheduler 会根据您定义的时间表,将一条包含 JSON 载荷的消息以及一个或多个 Spanner 实例的自动扩缩器工具配置参数推送至轮询 Pub/Sub 主题。
  3. 当消息发布到轮询主题时,会创建一个轮询器 Cloud Functions 函数实例来处理该消息。
  4. Poller Cloud Functions 函数会读取消息载荷并查询 Cloud Monitoring API 以检索每个 Spanner 实例的利用率指标。
  5. 对于消息中枚举的每个 Spanner 实例,Poller 函数都会将一条消息推送到扩缩 Pub/Sub 主题,其中包含要评估特定 Spanner 实例的指标和配置参数。
  6. 对于推送到 Scaler 主题的每条消息,Scaler Cloud Function 都会执行以下操作:

    1. 将 Spanner 实例指标与配置的阈值进行比较,加上或减去一个可配置的外边距

    您可以自行配置外边距,也可以使用默认值。 1. 决定是否应对实例进行扩缩。 1. 计算应根据所选的伸缩方法将实例扩缩到的节点数或处理单元数。

  7. Scaler Cloud Functions 函数会检索上次从 Firestore 中伸缩实例的时间,并将其与当前时间进行比较,以确定是否允许基于冷却期进行纵向扩容或缩容。

  8. 如果配置的冷却期已过,则 Scaler Cloud Function 会向 Spanner 实例发送纵向扩容或缩容请求。

在整个流程中,自动扩缩器工具会将其建议和操作的摘要写入 Cloud Logging 以进行跟踪和审核。

无论您选择哪种部署拓扑,自动扩缩器工具的整体操作将保持不变。

自动扩缩器功能

本部分介绍自动扩缩器工具的主要功能。

管理多个实例

自动扩缩器工具能够管理多个项目中的多个 Spanner 实例。多区域实例、双区域实例和单区域实例都具有不同的利用率阈值,可用于伸缩。例如,多区域部署和双区域部署的高优先级 CPU 利用率扩缩为 45%,而单区域部署的高优先级 CPU 利用率扩缩为 65%(无论是增加还是减少允许的外边距)。如需详细了解不同的伸缩阈值,请参阅 CPU 利用率高的提醒

独立的配置参数

每个自动扩缩的 Spanner 实例可以有一个或多个轮询时间表。每个轮询时间表都有自己的一组配置参数。

这些参数确定以下因素:

  • 节点或处理单元的最小和最大数量,用于控制实例的大小,可帮助您控制费用。
  • 伸缩方法,用于根据工作负载调整 Spanner 实例。
  • 让 Spanner 管理数据拆分的冷却期

针对不同的工作负载采用不同的扩缩方法

自动伸缩器工具提供三种不同的伸缩方法来伸缩 Spanner 实例:分步伸缩、线性伸缩和直接伸缩。每种方法旨在支持不同类型的工作负载。创建独立轮询时间表时,您可以将一个或多个方法应用于自动扩缩的每个 Spanner 实例。

阶梯

分步伸缩对于具有较小或多个峰值的工作负载非常有用。它会预配容量,通过单个自动扩缩事件来顺畅执行所有任务。

下图显示了具有多个负载水平或阶梯的负载模式,其中每个阶梯有多个小峰值。此模式非常适合阶梯方法。

加载模式包含多个阶梯。

当超过负载阈值时,此方法会使用固定但可配置的数值来预配和移除节点或处理单元。例如,为每个伸缩操作添加或移除三个节点。通过更改配置,您可以随时添加或移除更大的容量增量。

线性

线性扩缩最适合负载逐步变化或具有一些大峰值的负载模式。该方法会计算将利用率保持在伸缩阈值以下所需的最小节点数或处理单元数。在每个伸缩事件中添加或移除的节点或处理单元数量不限于固定的步长。

下图中的示例负载模式显示了负载较大的突然增加和减少。这些波动不会像在上一张图表中的阶梯一样明显。使用线性扩缩可以更轻松地处理此模式。

具有波动的负载模式。

自动扩缩器工具使用观察到的利用率与利用率阈值的比率,来计算是否在当前总数中增加或减少节点或处理单元。

计算新节点或处理单元数的公式如下所示:

newSize = currentSize * currentUtilization / utilizationThreshold

直接

直接扩缩功能可以即时提升容量。此方法旨在支持批处理工作负载,在其中,需要定期按已知的开始时间调度预先定义的较高节点计数。此方法可将实例扩容到时间表中指定的节点或处理单元数上限,旨在与线性方法或分步方法结合使用。

下图描述了负载计划的计划大幅增加,而自动扩缩器为使用直接方法提前预配了容量。

预配置直接扩缩的负载模式。

当批量工作负载完成并且利用率达到正常水平(具体取决于您的配置)后,系统将应用线性或阶梯扩缩功能来自动缩减实例。

部署方法

自动扩缩器工具可以部署在单个项目中,也可以与其管理的 Spanner 实例一同部署。自动扩缩器工具旨在实现灵活性,并且可以适应运营团队和应用团队之间的现有责任分离。配置 Spanner 实例自动扩缩的责任可以集中在单个运营团队中,也可以分发到更靠近这些 Spanner 实例所处理应用的团队。

部署拓扑中更详细地讨论了不同的部署模型。

无服务器方便部署和管理

自动扩缩器工具仅使用无服务器和低管理 Google Cloud 工具构建,例如 Cloud Functions、Pub/Sub、Cloud Scheduler 和 Firestore。此方法可最大限度地减少运行自动扩缩器工具的费用和运营开销。

通过使用内置的 Google Cloud 工具,自动扩缩器工具可以充分利用 IAM (IAM) 进行身份验证和授权。

配置

自动伸缩器工具具有不同的配置选项,您可以使用这些选项来管理 Spanner 部署的伸缩。接下来的部分将介绍基本配置选项和更高级的配置选项。

基本配置

自动扩缩器工具通过 Cloud Scheduler 中定义的配置管理 Spanner 实例。如果需要以相同的间隔对多个 Spanner 实例进行轮询,我们建议您在同一 Cloud Scheduler 作业中配置这些实例。每个实例的配置都表示为一个 JSON 对象。以下是使用一个 Cloud Scheduler 作业管理两个 Spanner 实例的配置示例:

   [
    {
        "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"
    }
   ]

Spanner 实例可以在不同的 Cloud Scheduler 作业中具有多项配置。例如,一个实例可以有一个包含用于正常操作的线性方法的自动扩缩器配置,但还有另一个包含用于计划批量工作负载的直接方法的自动扩缩器配置。

Cloud Scheduler 作业运行时,它将向 Polling Pub/Sub 主题发送 Pub/Sub 消息。此消息的载荷是在同一作业中配置的所有实例的配置对象的 JSON 数组。如需查看配置选项的完整列表,请参阅轮询器 README 文件

高级配置

自动扩缩器工具具有高级配置选项,可让您更精细地控制 Spanner 实例的管理时间和方式。以下部分介绍了一些这些控件。

自定义阈值

自动扩缩器工具会根据以下负载指标的建议的 Spanner 阈值确定要为实例增减的节点数或处理单元数:

  • 高优先级 CPU
  • CPU 24 小时滚动平均值
  • 存储空间利用率

我们建议您使用为 Spanner 指标创建提醒中所述的默认阈值。但在某些情况下,您可能希望修改自动扩缩器工具使用的阈值。例如,您可以使用较低的阈值来使自动扩缩器工具的反应比针对更高阈值的反应更快。此修改有助于防止在达到较高阈值时触发提醒。

自定义指标

虽然自动伸缩器工具中的默认指标适用于大多数性能和伸缩场景,但在某些情况下,您可能需要指定自己的指标,用于确定何时进行伸缩。对于这些场景,您可以使用 metrics 属性在配置中定义自定义指标。

边际

边际定义了阈值的上限和下限。只有在指标值高于上限或低于下限时,自动扩缩器工具才会触发自动扩缩事件。

此参数的目标是避免自动扩缩事件围绕阈值附近的小工作负载波动触发,从而减少自动扩缩器操作中的波动量。根据所需的指标值,阈值和外边距共同定义了以下范围:

[threshold - margin, threshold + margin]
。外边距越小,范围越窄,触发自动扩缩事件的可能性越高。

指定指标的边际参数是可选的,并且默认为该参数前后的 5 个百分点。

部署拓扑

要部署自动扩缩器工具,请确定以下哪种拓扑最能满足您的技术和运营需求:

  • 每个项目的拓扑:自动扩缩器基础架构部署在需要自动扩缩的与 Spanner 相同的项目中。
  • 集中式拓扑:自动扩缩器工具部署在一个项目中,用于管理不同项目中的一个或多个 Spanner 实例。
  • 分布式拓扑:大多数自动扩缩器基础架构部署在一个项目中,但一些基础架构组件部署时 Spanner 实例在不同项目中自动扩缩。

每个项目的拓扑

在每个项目的拓扑部署中,每个需要 Spanner 实例进行自动缩放的项目也具有自己的自动扩缩器组件独立部署。对于希望管理自己的自动扩缩器配置和基础架构的独立团队,我们建议使用此拓扑。这也是测试自动扩缩器工具功能的理想起点。

下图展示了每个项目部署的高度概括的概念视图。

概念性的每个项目部署。

上图中描述的每个项目的部署具有以下特征:

  • 两个应用(应用 1 和应用 2)分别使用自己的 Spanner 实例。
  • Spanner 实例 (A) 位于相应的应用 1 和应用 2 项目中。
  • 每个项目中都部署了一个独立的自动扩缩器 (B),以控制项目中实例的自动扩缩。

如需查看每个项目的部署的详细图表,请参阅架构部分。

每个项目部署具有以下优点和缺点。

优点:

  • 最简单的设计:每个项目拓扑是三种拓扑中最简单的设计,因为所有自动扩缩器组件都与自动扩缩的 Spanner 实例一起部署。
  • 配置:对调度器参数的控制属于拥有 Spanner 实例的团队,与集中式或分布式拓扑相比,这使得该团队可以更自由地根据其需求调整自动扩缩器工具。
  • 明确承担基础架构责任:每个项目的拓扑设计可以为自动扩缩器基础架构建立明确的责任与安全性,因为 Spanner 实例的团队所有者也是自动扩缩器基础架构的所有者。

缺点:

  • 更多整体维护:每个团队负责自动扩缩器配置和基础架构,因此可能很难确保公司内的所有自动扩缩器工具都遵循相同的更新准则。
  • 更复杂的审核:由于每个团队都具有更高级别的控制,因此集中式审核可能会更复杂。

如需了解如何使用项目拓扑设置自动扩缩器,请参阅为 Spanner 部署每个项目或集中式自动扩缩器工具

集中式拓扑

与在每个项目拓扑中一样,在集中式拓扑部署中,自动扩缩器工具的所有组件都位于同一项目中。但是,Spanner 实例位于不同的项目中。如果团队通过一个集中位置部署自动扩缩器工具,就可以管理多个 Spanner 实例的配置和基础架构。

下图显示集中式项目部署的高度概括的概念视图:

概念性的集中式项目部署。

上图中显示的集中式部署具有以下特征:

  • 两个应用(应用 1 和应用 2)分别使用自己的 Spanner 实例。
  • Spanner 实例 (A) 分别位于应用 1 和应用 2 项目中。
  • 自动扩缩器 (B) 部署到单独的项目中,以控制应用 1 和应用 2 项目中 Spanner 实例的自动扩缩。

如需查看集中式项目部署的详细图表,请参阅为 Spanner 部署每个项目或集中式自动扩缩器工具

集中式部署具有以下优势和缺点。

优点:

  • 集中式配置和基础架构:由一个团队控制调度程序参数和自动扩缩器基础架构。这种方法在受严格监管的行业很有用。
  • 总体维护工作量更少:与按项目进行的部署相比,维护和设置通常更易于维护。
  • 集中式政策和审核:跨团队的最佳做法可能更易于指定和强制执行。审核可能更容易执行。

缺点:

  • 集中式配置:对自动扩缩器参数的任何更改都需要通过集中式团队进行,即使申请更改的团队拥有 Spanner 实例也是如此。
  • 潜在额外风险:即使自动扩缩器基础架构的设计考虑到了高可用性,集中式团队本身也可能会成为单点故障。

如需了解使用此选项设置自动扩缩器工具的分步教程,请参阅为 Spanner 部署每个项目或集中式自动扩缩器工具

分布式拓扑

在分布式拓扑部署中,需要自动扩缩的 Cloud Scheduler 和 Spanner 实例位于同一项目中。自动扩缩器工具的其余组件位于集中管理的项目中。此部署是混合部署。拥有 Spanner 实例的团队仅管理其实例的自动扩缩器配置参数,而中心团队管理其余的自动扩缩器基础架构。

下图显示了分布式项目部署的简要概念视图。

概念性的分布式项目部署。

上图中描述的混合部署具有以下特征:

  • 两个应用(应用 1 和应用 2)使用自己的 Spanner 实例。
  • Spanner 实例 (A) 位于应用 1 和应用 2 项目中。
  • 每个项目中都部署了一个独立的 Cloud Scheduler 组件 (C):应用 1 和应用 2。
  • 将其余的自动扩缩器组件 (B) 部署到单独的项目中。
  • 自动扩缩器工具使用每个项目中的独立 Cloud Scheduler 组件发送的配置,自动扩缩应用 1 和应用 2 项目中的 Spanner 实例。

如需查看集中式项目部署的更详细的图表,请参阅为 Spanner 部署分布式自动扩缩器工具

分布式部署具有以下优势和缺点。

优点:

  • 应用团队控制配置和时间表:Cloud Scheduler 与自动扩缩的 Spanner 实例一同部署,让应用团队能够更好地控制配置和调度。
  • 运营团队控制基础架构:自动扩缩器工具的核心组件集中部署,让运营团队可以控制自动扩缩器基础架构。
  • 集中维护:扩缩器基础架构是集中式的,可减少开销。

缺点:

  • 更复杂的配置:应用团队需要提供服务帐号才能写入轮询主题。
  • 可能会带来额外风险:即使共享基础架构在设计时考虑到了高可用性,它也可能会成为单点故障。

如需了解如何在分布式部署中设置自动扩缩器工具,请参阅为 Spanner 部署分布式自动扩缩器工具

数据拆分

Spanner 将称为“分块”的数据范围分配给称为处理单元的节点或节点细分。节点或处理单元在拆分的分块中独立管理和传送数据。数据拆分基于多种因素创建,包括数据量和访问模式。如需了解详情,请参阅 Spanner - 架构和数据模型

数据会被整理为多个分片,Spanner 会自动管理这些分片。因此,当自动扩缩器工具添加或移除节点或处理单元时,需要给 Spanner 后端留出足够的时间,以便在实例中添加或移除新容量时重新分配和重新整理分块。

自动扩缩器工具对纵向扩容和纵向缩容事件使用冷却期,以控制在实例中添加或移除节点或处理单元的速度。此方法为实例留出必要的时间来重新整理计算备注或处理单元与数据拆分之间的关系。默认情况下,扩容和缩容冷却期设置为以下最小值:

  • 扩容值:5 分钟
  • 缩减值:30 分钟

如需详细了解伸缩建议和冷却期,请参阅伸缩 Spanner 实例

费用

自动扩缩器工具的资源消耗极少,因此对于大多数使用场景,费用可以忽略不计。在 Google Cloud 上使用自动扩缩器不会产生任何费用。例如,您可以免费运行自动扩缩器工具来管理 3 个 Spanner 实例(每个实例的轮询间隔为 5 分钟)。此估算包括以下各项:

  • 3 个 Cloud Scheduler 作业
  • 0.15 GB 的 Pub/Sub 消息
  • 51840 次 Cloud Functions 函数 500 毫秒调用次数
  • Firestore 中的数据不到 10 MB

此估算值不包括 Spanner 数据库操作费用。您可使用价格计算器根据您的预计使用情况来估算费用。

后续步骤