有状态托管实例组

您可以使用有状态托管实例组(有状态 MIG)在虚拟机实例上构建可用性高的有状态工作负载部署。有状态工作负载包括采用有状态数据或配置的应用,例如数据库、旧版单体式应用以及设有检查点且长时间运行的批量计算。

借助有状态 MIG,您可以通过自动修复(自动恢复失败的工作负载)和多地区部署来改善此类有状态应用的正常运行时间和弹性,并且可以通过⁠控制更新发布

有状态托管实例组会在虚拟机重启、重新创建、自动修复或更新后保留每个实例的独有状态(包括实例名称、挂接的永久性磁盘和元数据)。

本页面介绍何时使用有状态 MIG,并简要介绍其工作原理。如需了解详情,请参阅有状态 MIG 的工作原理

如需了解如何设置有状态 MIG,请参阅配置有状态 MIG

有状态工作负载与无状态工作负载之间的区别

您可以使用托管实例组来同时支持有状态工作负载和无状态工作负载。有状态工作负载与无状态工作负载之间的主要区别在于,有状态工作负载会将各虚拟机的状态(例如数据库分片或应用配置)保留在虚拟机的磁盘上,而无状态工作负载(如 Web 前端)则不会保留各虚拟机的任何状态。

另一方面,您需要像对待定制机械那样对待运行有状态工作负载的虚拟机,您需要关注虚拟机的身份(名称)、元数据以及每台机器上的数据。您无法轻松地横向扩缩有状态工作负载,因为扩缩可能需要复制数据、创建或删除数据分片,或者更改整体应用配置。重新创建或更新运行有状态工作负载的机器时,您必须保留该虚拟机的独有状态。有状态应用的示例包括 Cassandra、ElasticSearch、mongoDB、MySQL、PostgreSQL 和 Kafka。

您可以将运行无状态工作负载的虚拟机视为可互换,只需要关注当前有效虚拟机的数量。所有虚拟机均按相同方式处理。您可以通过添加或移除虚拟机,轻松地横向扩缩无状态工作负载。更新应用时,您可以删除机器,并将其替换为具有不同名称、元数据和磁盘的新机器。当删除或重新创建无状态虚拟机时,机器上的所有数据都将丢失,也就是说,磁盘会被删除或完全重新创建。Web 前端就是无状态应用的一个示例。

有状态 MIG无状态 MIG
工作负载 有状态工作负载。在此类工作负载中,磁盘和/或元数据会在虚拟机重新创建操作中得到保留。 可用性高且可扩缩的无状态工作负载。在此类工作负载中,横向扩缩、自动修复、自动更新和重新创建虚拟机时,磁盘会完全重新创建。
MIG 特性
  • 自动修复
  • 特定实例的受控更新
  • 多区域部署
  • 自动修复
  • 自动滚动更新
  • 多区域部署
  • 自动扩缩
保留的数据项
  • 实例名称
  • 永久性磁盘,包括对未在实例模板中定义的磁盘的支持
  • 实例专属元数据
实例名称

所有 MIG 都支持自定义和可预留的实例名称。

何时使用有状态 MIG

在将有状态应用或集群部署到 Compute Engine 并希望通过自动修复多区域部署来提高可用性时,或者,在想要通过编码更新发布以及控制允许的实例中断级别来简化有状态实例的更新时,请考虑使用有状态托管实例组(有状态 MIG)。

有状态 MIG 适用于采用有状态数据或配置的应用,例如:

  • 数据库。例如:Cassandra、ElasticSearch、mongoDB 和 ZooKeeper。在确定有状态 MIG 之前,请考虑使用全代管式服务(例如 Cloud SQL 中提供了 MySQL 和 PostgreSQL)专注于您的应用,而无需处理虚拟机。
  • 数据处理应用。例如:Kafka 和 Flink。在确定有状态 MIG 之前,可以考虑使用 DataflowDataproc 等全托管式服务,这样您就能够专注于数据处理任务,而不必费心处理虚拟机。
  • 其他有状态应用。例如:TeamCity、Jenkins、Bamboo 以及自定义有状态工作负载。
  • 旧版单体式应用。这些应用会将应用状态存储在启动磁盘或其他永久性磁盘上,或者依赖于有状态配置,例如特定虚拟机实例名称或元数据键值对。
  • 设有检查点的批量工作负载。使用此配置时,您可以在发生工作负载或虚拟机故障或实例抢占之前提前保留长时间运行的计算作业的检查点结果。有状态 MIG 可以重新创建发生故障的机器,同时保留其数据磁盘,这样您的计算作业就可以从最后一个检查点继续运行。

为了实现针对区域故障的恢复能力,您的应用必须在应用级别的多个实例之间复制数据。例如,ElasticSearch 和 Cassandra 支持此类功能。您可以使用地区 MIG,通过将冗余副本部署到多个区域并依赖应用的数据复制功能,使此类应用对于区域性故障具有恢复能力。如果发生区域性故障,则将通过其余区域中的可用副本来提供数据。

查看限制以验证有状态 MIG 是否完全满足您的要求。

如何使 MIG 成为有状态组

当您创建有状态配置后,MIG 即被视为有状态组。

您可以在创建 MIG 时创建有状态配置,也可以通过添加有状态配置将组从无状态转换为有状态。

如需创建有状态配置,您可以设置一项非空的有状态政策和/或一项或多项非空的实例配置:

  • 有状态政策定义了您要为 MIG 中的所有实例保留的项。
  • 实例配置定义了要为特定虚拟机实例保留的项。

该配置在由您或 MIG 应用后生效:

  • MIG 会自动将您的有状态政策配置应用于新实例和现有实例。
  • 创建或更新实例配置时,您可以选择是手动应用新配置,还是自动应用新配置。

应用有状态配置(有状态政策和/或实例配置)后,您可以通过检查每个托管实例的保留状态来验证该配置。

对 MIG 的有状态配置或大小的后续更改(例如减小 MIG 的大小,或删除或放弃 MIG 中的实例)会影响实例的保留状态

有状态配置

有状态托管实例组 (MIG) 会根据您设置的实例模板有状态政策实例配置这三者的组合获取其实例配置。将实例模板、有状态政策和/或实例配置应用于您的组之后,MIG 会在创建、重新创建、自动修复或自动更新其虚拟机实例时使用该配置。

有状态政策

有状态政策为托管实例组中的所有实例定义了通用有状态项。您必须在 MIG 的实例模板中定义有状态政策所包含的各项。

您可以对有状态政策进行以下更改:

  • 将磁盘配置为有状态,方法是将磁盘添加到有状态政策。
  • 将磁盘配置为无状态,方法是从有状态政策中移除磁盘

实例配置

实例配置定义了特定托管实例独有的有状态项,例如实例专用的元数据键值对。这些项不需要在 MIG 的实例模板中定义。

您可以对 MIG 中特定实例的实例配置进行以下更改:

  • 配置在实例模板中定义的磁盘,使其成为实例的有状态磁盘(通过将这些磁盘添加到实例配置中)或成为无状态磁盘(通过将这些磁盘从实例配置中移除)。
  • 配置未在实例模板中定义的现有磁盘,使其挂接到实例上并成为有状态磁盘(通过将这些磁盘添加到实例配置中),或使其从实例中分离出来(通过将这些磁盘从实例配置中移除)。
  • 添加或移除特定于实例的有状态元数据键值对。

有状态配置示例

以下是有状态配置的示例:

实例模板 + 有状态政策 + 实例配置 = 托管实例配置。

在此图表中:

  • 实例模板为 MIG 中的所有虚拟机实例定义了一项通用配置
  • 有状态政策为设备名称为 data-disk 的磁盘定义了一项通用的有状态配置,这些磁盘由实例模板定义,并针对 MIG 中的每个虚拟机实例分别创建和挂接。
  • 实例配置为名为 node-1 的特定虚拟机实例定义了一项有状态配置。它指定将现有磁盘 my-legacy-1 挂接到 node-1 实例并将其视为有状态。它还指定了要为 node-1 实例单独保留的一个元数据键值对 node-id:xyz273

创建 node-1 虚拟机时,MIG 会执行以下操作:

  1. 根据实例模板使用 n2-standard-2 机器类型。
  2. 根据实例模板,使用 Debian GNU/Linux 映像创建并挂接具有自动生成的磁盘名称 boot-node-1 和设备名称 boot-disk 的启动磁盘。MIG 会将 boot-node-1 启动磁盘视为无状态磁盘,因为该磁盘未在有状态政策或实例配置中进行配置。
  3. 根据实例模板,使用自定义映像创建并挂接具有自动生成的磁盘名称 data-disk-1 和设备名称 data-disk 的附加磁盘。MIG 会将 data-disk-1 附加磁盘视为有状态磁盘,因为它的设备名称已在有状态政策中指定。
  4. 根据实例配置,挂接磁盘名称为 my-legacy-1 的现有磁盘并使用设备名称 legacy-disk。MIG 会将 my-legacy-1 附加磁盘视为有状态磁盘,因为其设备名称已在实例配置中指定。
  5. 设置三个元数据键值对:两个来自实例模板(app:example-stateful-appversion:1.0),一个来自实例配置 (node-id:xyz273)。MIG 将 node-id:xyz273 键值对视为有状态,因为它已在实例配置中指定。

重新创建 node-1 虚拟机时,如果相同配置仍然有效,则 MIG 将重新创建无状态项并保留有状态项:

  1. 通过原始映像重新创建启动磁盘:

    首先,它会删除 boot-node-1 启动磁盘,然后通过实例模板中指定的 Debian GNU/Linux 映像重新创建该启动磁盘。

  2. 保留其他磁盘 data-disk-1my-legacy-1

    在删除虚拟机之前分离其他磁盘,然后在重新创建虚拟机后将它们挂接到虚拟机。

  3. 保留各个元数据键值对 node-id:xyz273

    在重新创建虚拟机后设置元数据。同时还要设置实例模板中的通用键值对(app:example-stateful-appversion:1.0)。

后续步骤