Google Cloud Spot VM 最大的吸引力是计算成本较低,但它与普通稳定运行的虚拟机有一个根本区别:Google Cloud 可以在需要回收计算容量时终止Spot VM。因此,真正的问题并不是“Spot VM能不能用于生产”,而是业务能不能接受计算节点随时消失,并且在节点消失以后继续提供服务。
如果一个系统把用户请求、数据库状态、上传文件或者任务进度全部绑定在某一台虚拟机上,那么Spot VM确实不适合直接承担这样的角色。如果计算节点只是随时可以替换的执行单元,那么情况就完全不同。
首先需要解决的是无状态化。Web API、应用服务器、部分微服务通常比较容易做到这一点。用户会话、缓存、任务状态和文件不要依赖某一台Spot VM的本地磁盘,而应该放到适合持久化的外部系统中。这样一台实例被终止以后,新的实例启动并加入服务池,就可以继续处理请求。
这也是Spot VM进入生产环境最重要的架构前提之一:实例本身应该是“可以牺牲的”,业务数据不能是。
对于异步任务,情况更加适合使用Spot VM。例如图片处理、视频转码、机器学习训练、批量计算、日志处理以及部分数据分析任务,都可以把任务放入Cloud Pub/Sub等消息系统,由计算节点领取任务执行。实例突然消失以后,未完成的任务可以通过重试机制重新处理。
这里需要特别注意幂等性。如果一个任务已经执行了一部分,实例在中途被终止,系统必须能够判断任务是否已经完成,或者允许任务安全地重新执行。否则,Spot VM节省下来的计算成本,很可能最后变成重复扣款、重复写入或者数据错误。
在线业务则需要更严格的架构。不能因为使用Spot VM,就让负载均衡器后面只剩下一台Spot实例。比较常见的做法是使用Managed Instance Groups,让多个实例共同承担流量,并让负载均衡系统把请求发送到当前健康的实例。
对于要求更高可用性的服务,可以把实例分布到多个可用区甚至多个区域。Google Cloud的负载均衡体系可以承担流量入口,而实例组负责维护计算容量。这样即使部分Spot实例被回收,剩余实例仍然可以继续提供服务。
是否必须使用Active-Active,则取决于业务目标。一个内部管理系统可能只需要区域内多实例;面向全球用户的核心在线服务,才可能需要进一步考虑跨区域架构。架构应该从SLA倒推,而不是因为使用Spot VM就自动堆上所有高可用组件。
数据库则应该与Spot计算节点分离。Cloud SQL、Spanner或者其他持久化数据库可以承担核心数据存储,Cloud Storage适合文件和对象数据。计算节点被终止并不应该意味着数据库文件一起消失。
数据库高可用也不能简单写成“必须同步复制”。不同数据库产品的复制机制、跨区域能力、事务模型和故障切换方式并不相同。真正应该确定的是业务能够接受多少数据丢失,以及能够等待多长时间恢复。
这就是RPO和RTO的意义。RPO表示发生故障以后最多可以接受多长时间的数据损失,RTO表示业务最多允许中断多长时间。例如某个内部报表系统可能接受较长恢复时间,而支付、交易或者实时在线服务可能要求更严格的目标。RPO和RTO没有一个适用于所有生产系统的“标准5分钟”或者“标准30分钟”。
网络和安全同样需要独立设计。VPC可以提供网络隔离,防火墙规则控制允许的通信范围,Cloud Audit Logs记录管理和数据访问相关活动,Security Command Center可以用于安全态势和风险发现。
但不要把VPN当成所有内部通信的默认方案。VPN主要用于特定的网络互联场景,例如连接本地数据中心或者其他网络环境。云内服务之间应该根据实际架构选择VPC、Private Service Connect、负载均衡、身份认证和加密等机制。
成本管理方面,Spot VM的价值不仅仅是“价格便宜”。更重要的是把它放在能够动态增加和减少计算容量的架构中。Managed Instance Groups可以根据负载调整实例数量,而应用本身则应该能够承受部分实例无法获得容量或者被终止的情况。
Cloud Billing Budgets和告警可以帮助团队监控预算,Labels以及其他资源管理机制可以帮助进行成本归集。但需要注意,预算告警并不是硬性成本上限。真正的成本控制还需要结合资源生命周期、实例规模、自动扩缩容以及持续的账单分析。
监控方面,至少应该知道三个问题:现在有多少Spot实例、实例为什么减少、业务有没有受到影响。Cloud Monitoring可以监控CPU、网络、实例健康状态以及应用指标,Cloud Logging用于日志分析,分布式追踪可以帮助定位请求在多个服务之间的延迟和失败。
对于生产环境,还应该监控任务队列长度、请求延迟、错误率、实例启动时间以及容量不足等指标。仅仅观察CPU使用率,很容易出现“机器看起来很健康,用户却已经无法正常访问”的情况。
另外,Spot VM最大的风险之一并不是实例被终止,而是业务团队从来没有真正测试过实例被终止以后系统会发生什么。可以通过故障演练验证实例消失后,负载均衡是否能够继续工作,MIG是否能够补充容量,任务是否能够重新执行,数据库连接是否能够恢复,以及用户请求是否会出现大量错误。
对于一些生产系统,混合使用普通计算资源和Spot VM反而更加合理。核心容量可以运行在稳定的计算资源上,Spot VM承担弹性计算、批处理、峰值容量或者可以重试的任务。当Spot容量充足时,系统降低计算成本;当Spot容量减少时,核心服务仍然拥有基本运行能力。
例如一个在线AI服务,可以让稳定计算资源承担基础推理容量,而Spot VM承担可以延迟或者重试的批量推理任务。一个视频平台可以让普通实例承担API和用户请求,把视频转码等弹性任务交给Spot VM。数据分析、机器学习训练、批量ETL等工作同样适合这种模式。
因此,判断Spot VM能不能进入生产环境,真正需要检查的并不是“这是生产环境,所以不能用Spot”,而是几个更加实际的问题:实例消失以后业务是否还能继续,状态是否已经与计算节点分离,任务是否能够重试,数据库是否具有独立的持久化和恢复机制,负载是否可以自动转移,以及团队是否真正测试过故障场景。
如果这些条件都满足,Spot VM完全可以成为生产架构的一部分。它不是传统意义上的“廉价服务器”,而是一种要求应用具备弹性和故障容忍能力的计算资源。对于能够把计算节点视为可替换资源的系统,实例被回收并不一定是事故;真正的事故,是整个业务竟然把自己建立在某一台不会消失的机器上。
Google Cloud Spot VM 能否运行生产服务,业务架构应该满足哪些条件
图片说明:示意图 图片来源:Public Domain(公有领域)
喜欢这篇报道?
使用下面的功能,方便以后继续阅读和分享 MNewsTV
关于文章收藏
收藏不需要注册帐号,收藏信息仅保存在当前浏览器中。
删除收藏请进入「我的收藏」进行管理。
捐助(Paypal): https://www.paypal.me/observeccp 订阅中国观察电报 Telegram : https://t.me/s/ObserveCCP