您可以使用有状态托管实例组(有状态 MIG)在虚拟机实例上构建可用性高的有状态工作负载部署。有状态工作负载包括采用有状态数据或配置的应用,例如数据库、旧版单体式应用以及设有检查点且长时间运行的批量计算。
借助有状态 MIG,您可以通过自动修复(自动恢复失败的工作负载)、多可用区部署和自动滚动更新来改善此类有状态应用的正常运行时间和弹性。
有状态代管式实例组会在虚拟机重启、重新创建、自动修复或更新后保留每个实例的独有状态(包括实例名称、挂接的永久性磁盘、IP 地址和元数据)。
本页面介绍何时使用有状态 MIG,并简要介绍其工作原理。如需了解详情,请参阅有状态 MIG 的工作原理。
如需了解如何设置有状态 MIG,请参阅配置有状态 MIG。
有状态工作负载与无状态工作负载之间的区别
您可以使用托管实例组来同时支持有状态工作负载和无状态工作负载。有状态工作负载与无状态工作负载之间的主要区别在于,有状态工作负载会将各虚拟机的状态(例如数据库分片或应用配置)保留在虚拟机的磁盘上,而无状态工作负载(如 Web 前端)则不会保留各虚拟机的任何状态。
另一方面,您需要像对待定制机械那样对待运行有状态工作负载的虚拟机,您需要关注虚拟机的身份(名称)、IP 地址、元数据以及每台机器上的数据。您无法轻松地横向扩缩有状态工作负载,因为扩缩可能需要复制数据、创建或删除数据分片,或者更改整体应用配置。重新创建或更新运行有状态工作负载的机器时,您必须保留该虚拟机的独有状态。有状态应用的示例包括 Cassandra、ElasticSearch、mongoDB、MySQL、PostgreSQL 和 Kafka。
您可以将运行无状态工作负载的虚拟机视为可互换,只需要关注当前有效虚拟机的数量。所有虚拟机均按相同方式处理。您可以通过添加或移除虚拟机,轻松地横向扩缩无状态工作负载。更新应用时,您可以删除机器,并将其替换为具有不同名称、IP 地址、元数据和磁盘的新机器。删除或重新创建无状态虚拟机时,机器上的所有数据都将丢失,也就是说,磁盘会被删除或从头开始重新创建。Web 前端就是无状态应用的一个示例。
有状态 MIG | 无状态 MIG | |
---|---|---|
工作负载 | 有状态工作负载。在此类工作负载中,磁盘、IP 地址和/或元数据会在虚拟机重新创建操作时得到保留。 | 可用性高且可扩缩的无状态工作负载。在此类工作负载中,横向扩缩、自动修复、自动更新和重新创建虚拟机时,磁盘和 IP 地址会从头开始重新创建。 |
MIG 特性 |
|
|
保留的数据项 |
|
实例名称 |
所有 MIG 都支持自定义和可预留的实例名称。
何时使用有状态 MIG
在将有状态应用或集群部署到 Compute Engine 并希望通过自动修复和多可用区部署来提高可用性时,或者,在想要通过编码更新发布以及控制允许的实例中断级别来简化有状态实例的更新时,请考虑使用有状态托管实例组(有状态 MIG)。
有状态 MIG 适用于采用有状态数据或配置的应用,例如:
- 数据库。例如:Cassandra、ElasticSearch、mongoDB 和 ZooKeeper。在确定有状态 MIG 之前,请考虑使用全代管式服务(例如 Cloud SQL 中提供了 MySQL 和 PostgreSQL)专注于您的应用,而无需处理虚拟机。
- 数据处理应用。例如:Kafka 和 Flink。在确定有状态 MIG 之前,可以考虑使用 Dataflow 或 Dataproc 等全代管式服务,这样您就能够专注于数据处理任务,而不必费心处理虚拟机。
- 其他有状态应用。例如:TeamCity、Jenkins、Bamboo、具有有状态 IP 地址的 DNS 服务器以及自定义有状态工作负载。
- 旧版单体式应用。这些应用会将应用状态存储在启动磁盘或其他永久性磁盘上,或者依赖于有状态配置,例如特定虚拟机实例名称、IP 地址或元数据键值对。
- 设有检查点的批量工作负载。使用此配置时,您可以在发生工作负载或虚拟机故障或实例抢占之前提前保留长时间运行的计算作业的检查点结果。有状态 MIG 可以重新创建发生故障的机器,同时保留其数据磁盘,这样您的计算作业就可以从最后一个检查点继续运行。
为了实现针对可用区故障的恢复能力,您的应用必须在应用级别的多个实例之间复制数据。例如,ElasticSearch 和 Cassandra 支持此类功能。您可以使用区域 MIG,通过将冗余副本部署到多个可用区并依赖应用的数据复制功能,使此类应用对于可用区故障具有恢复能力。如果发生可用区故障,则将通过其余可用区中的可用副本来提供数据。
查看限制以验证有状态 MIG 是否完全满足您的要求。
如何使 MIG 成为有状态组
当您创建有状态配置后,MIG 即被视为有状态组。
您可以在创建 MIG 时创建有状态配置,也可以在创建 MIG 后通过添加配置将组从无状态转换为有状态。
如需创建有状态配置,您可以设置一个非空的有状态政策和/或一个或多个非空的实例配置:
- 有状态政策定义了您要为 MIG 中的所有实例保留的项。
- 实例配置定义了要为特定虚拟机实例保留的项。
该配置在由您或 MIG 应用后生效:
- MIG 会自动将您的有状态政策配置应用于新实例和现有实例。
- 创建或更新实例配置时,您可以选择是手动应用新配置,还是自动应用新配置。
应用有状态配置(有状态政策和/或实例配置)后,您可以通过检查每个托管实例的保留状态来验证该配置。
对 MIG 的有状态配置或大小的后续更改(例如减小 MIG 的大小,或删除或放弃 MIG 中的实例)会影响实例的保留状态。
有状态配置
有状态代管式实例组 (MIG) 根据您设置的实例模板、可选的所有实例配置、可选的有状态政策,以及可选的每个实例配置这四者的组合获取其实例配置。为您的组设置配置后,MIG 会在创建虚拟机时使用该配置。如需将更新后的配置应用于现有虚拟机,请参阅在 MIG 中应用新的虚拟机配置。
有状态政策
有状态政策为托管实例组中的所有实例定义了通用有状态项。您必须在 MIG 的实例模板中定义有状态政策所包含的各项。
您可以对有状态政策进行以下更改:
- 将磁盘配置为有状态,方法是将磁盘添加到有状态政策。
- 将磁盘配置为无状态,方法是从有状态政策中移除磁盘。
- 通过将网络接口配置添加到有状态政策,指定 IP 地址必须为有状态。
- 通过从有状态政策移除配置,指定 IP 地址必须被视为无状态。
每个实例配置
实例配置定义了特定代管式实例独有的有状态项,例如实例特定的磁盘、元数据键值对和 IP 地址。无需在 MIG 的实例模板中定义实例特定的元数据和磁盘;但是,必须在 MIG 的实例模板中定义有状态 IP 的网络接口。
您可以对 MIG 中特定实例的实例配置进行以下更改:
- 配置在实例模板中定义的磁盘,使其成为实例的有状态磁盘(通过将这些磁盘添加到实例配置中)或成为无状态磁盘(通过将这些磁盘从实例配置中移除)。
- 配置未在实例模板中定义的现有磁盘,使其挂接到实例上并成为有状态磁盘(通过将这些磁盘添加到实例配置中),或使其从实例中分离出来(通过将这些磁盘从实例配置中移除)。
- 添加或移除特定于实例的有状态元数据键值对。
- 将 MIG 中的实例的 IP 地址单独配置为有状态或无状态。
有状态配置示例
以下是有状态配置的示例:
在此图表中:
- 实例模板为 MIG 中的所有虚拟机实例定义了一项通用配置
- 有状态政策为设备名称为
data-disk
的磁盘定义了一项通用的有状态配置,这些磁盘由实例模板定义,并针对 MIG 中的每个虚拟机实例分别创建和挂接。 - 实例配置为名为
node-1
的特定虚拟机实例定义了一项有状态配置。它指定将现有磁盘my-legacy-1
挂接到node-1
实例并将其视为有状态。它还指定了要为node-1
实例单独保留的一个元数据键值对node-id:xyz273
。
创建 node-1
虚拟机时,MIG 会执行以下操作:
- 根据实例模板使用
n2-standard-2
机器类型。 - 根据实例模板,使用 Debian GNU/Linux 映像创建并挂接具有自动生成的磁盘名称
boot-node-1
和设备名称boot-disk
的启动磁盘。MIG 会将boot-node-1
启动磁盘视为无状态磁盘,因为该磁盘未在有状态政策或实例配置中进行配置。 - 根据实例模板,使用自定义映像创建并挂接具有自动生成的磁盘名称
data-disk-1
和设备名称data-disk
的附加磁盘。MIG 会将data-disk-1
附加磁盘视为有状态磁盘,因为它的设备名称已在有状态政策中指定。 - 根据实例配置,挂接磁盘名称为
my-legacy-1
的现有磁盘并使用设备名称legacy-disk
。MIG 会将my-legacy-1
附加磁盘视为有状态磁盘,因为其设备名称已在实例配置中指定。 - 设置三个元数据键值对:两个来自实例模板(
app:example-stateful-app
、version:1.0
),一个来自实例配置 (node-id:xyz273
)。MIG 将node-id:xyz273
键值对视为有状态,因为它已在实例配置中指定。
重新创建 node-1
虚拟机时,如果相同配置仍然有效,则 MIG 将重新创建无状态项并保留有状态项:
通过原始映像重新创建启动磁盘:
首先,它会删除
boot-node-1
启动磁盘,然后通过实例模板中指定的 Debian GNU/Linux 映像重新创建该启动磁盘。保留其他磁盘
data-disk-1
和my-legacy-1
:在删除虚拟机之前分离其他磁盘,然后在重新创建虚拟机后将它们挂接到虚拟机。
保留各个元数据键值对
node-id:xyz273
:在重新创建虚拟机后设置元数据。同时还要设置实例模板中的通用键值对(
app:example-stateful-app
和version:1.0
)。
反馈
我们希望了解有关有状态 MIG 的用例、挑战和反馈。请发送至 mig-discuss@google.com,与我们的团队分享您的反馈。
后续步骤
- 阅读配置有状态 MIG,了解如何通过在托管实例中保留实例名称、永久性磁盘和元数据来支持有状态工作负载。
- 了解如何将现有工作负载迁移到有状态 MIG。
- 详细了解有状态 MIG 的工作原理。
- 详细了解托管实例组。
- 了解如何使用托管实例。