什么是不可变基础设施?

2025-06-08

什么是不可变基础设施?

作者:Hazel Virdó

介绍

在传统的可变服务器基础设施中,服务器会持续地进行更新和修改。使用这种基础设施的工程师和管理员可以通过 SSH 连接到他们的服务器,手动升级或降级软件包,逐个服务器地调整配置文件,并将新代码直接部署到现有服务器上。换句话说,这些服务器是可变的;它们可以在创建后进行更改。由可变服务器组成的基础设施本身可以被称为可变的、传统的,或者(略带贬义地)手工的。

不可变基础设施另一种基础设施范式,其中服务器在部署后永远不会被修改。如果需要以任何方式更新、修复或修改,系统会预配基于通用映像构建的新服务器,并进行相应的更改以替换旧服务器。新服务器经过验证后即可投入使用,旧服务器则会退役。

不可变基础设施的优势包括:更高的一致性和可靠性,以及更简单、更可预测的部署流程。它可以缓解甚至完全避免可变基础设施中常见的问题,例如配置漂移和雪花服务器。然而,高效地使用不可变基础设施通常需要全面的部署自动化、在云计算环境中快速配置服务器,以及用于处理日志等状态或短暂数据的解决方案。

本文的其余部分将:

  • 解释可变和不可变基础设施之间的概念和实际差异
  • 描述使用不可变基础设施的优势并阐述其复杂性
  • 概述不可变基础设施的实施细节和必要组件

可变和不可变基础设施之间的差异

可变基础设施和不可变基础设施之间最根本的区别在于它们的核心策略:前者的组件设计为部署后可更改;后者的组件设计为保持不变,最终会被替换。本教程重点介绍这些组件作为服务器,但还有其他方法可以实现不可变基础设施,例如使用容器,它们应用相同的高级概念。

更深入地说,基于服务器的可变和不可变基础设施之间存在实际和概念上的差异。

从概念上讲,这两种基础设施在处理服务器的方式上(例如创建、维护、更新、销毁)差异很大。这通常可以用“宠物与牛”的类比来说明。

实际上,可变基础设施是一种更为古老的基础设施范式,它早于虚拟化和云计算等核心技术的出现,而正是这些技术使得不可变基础设施成为可能并切实可行。了解这段历史有助于理解两者之间的概念差异,以及在现代基础设施中使用其中一种架构的含义。

接下来的两节将更详细地讨论这些差异。

实际差异:拥抱云

在虚拟化和云计算成为可能并广泛应用之前,服务器基础设施主要以物理服务器为中心。这些物理服务器的搭建成本高昂且耗时;由于订购新硬件、配置服务器,以及将其安装到托管服务器或类似位置,初始设置可能需要数天甚至数周的时间。

可变基础设施的起源就在于此。由于更换服务器的成本非常高昂,因此最实际的做法是尽可能长时间地使用现有服务器,并尽可能减少停机时间。这意味着需要进行大量的现场更改,包括定期部署和更新,以及在出现问题时进行临时修复、调整和补丁。频繁的手动更改会导致服务器难以复制,使每台服务器都成为整体基础设施中独特而脆弱的组件。

虚拟化和按需/云计算的出现代表了服务器架构的转折点。虚拟服务器的成本更低,即使规模扩大,而且可以在几分钟内创建和销毁,而无需几天或几周的时间。这使得新的部署工作流程和服务器管理技术首次成为可能,例如使用配置管理云 API以编程方式快速自动地配置新服务器。创建新虚拟服务器的速度和低成本使得不变性原则变得切实可行。

传统的可变基础设施最初是在物理服务器的使用决定了其管理可能性的情况下发展起来的,并随着技术的不断进步而不断发展。在现代基础设施中,部署后修改服务器的模式仍然很常见。相比之下,不可变基础设施从一开始就被设计为依赖基于虚拟化的技术来快速配置架构组件,例如云计算的虚拟服务器。

概念差异:宠物与牛,雪花与凤凰

云计算带来的根本性概念变革是,服务器可以被视为一次性用品。丢弃并更换物理服务器的想法极其不切实际,但有了虚拟服务器,这样做不仅可行,而且简单高效。

传统可变基础设施中的服务器是不可替代的独特系统,必须始终保持运行。因此,它们就像宠物一样:独一无二,无法模仿,需要人工照料。失去其中一台服务器可能会造成毁灭性的后果。而不可变基础设施中的服务器则是一次性的,易于复制或使用自动化工具进行扩展。因此,它们就像牛群中的众多牛群之一,牛群中没有哪一头是独一无二的或不可或缺的。

兰迪·拜亚斯 (Randy Bias)是第一个将宠物与牛的类比应用于云计算的人,他引用了这样一句话:

按照旧的方式,我们把服务器当成宠物一样对待,比如邮件服务器 Bob。如果 Bob 宕机了,所有人都会出动。CEO 收不到邮件,世界末日就来了。新的方式是,服务器按牛群编号,例如 www001 到 www100。当一台服务器宕机时,它会被撤回,处理掉,然后重新上线。

另一种类似的说明服务器处理方式差异含义的方法是使用雪花服务器和凤凰服务器的概念。

雪花服务器类似于宠物。它们是手动管理的服务器,经常进行更新和调整,从而形成一个独特的环境。凤凰服务器类似于牛。它们是始终从头构建的服务器,并且易于通过自动化程序重新创建(或“浴火重生”)。

不可变基础设施几乎完全由cattle或phoenix服务器构成,而可变基础设施则允许一些(或多个)pet或snowflake服务器。下一节将讨论两者的含义。

不可变基础设施的优势

要理解不可变基础设施的优势,就必须了解可变基础设施的劣势。

可变基础设施中的服务器可能会受到配置漂移的影响,即未经记录的即兴更改导致服务器配置彼此之间以及与已审核、批准和最初部署的配置之间的差异越来越大。这些日益“雪花化”的服务器难以复制和替换,使得扩展和问题恢复等操作变得异常困难。由于难以创建与生产环境匹配的预发布环境,即使复制问题进行调试也变得十分困难。

经过多次手动修改后,服务器不同配置的重要性或必要性会变得模糊不清,因此更新或更改任何配置都可能产生意想不到的副作用。即使在最佳情况下,对现有系统进行更改也不能保证一定有效,这意味着依赖于此的部署可能会失败或使服务器处于未知状态。

考虑到这一点,使用不可变基础设施的主要好处是部署简单、可靠和一致,所有这些最终可以最大限度地减少或消除许多常见的痛点和故障点。

已知良好的服务器状态和更少的部署失败

不可变基础架构中的所有部署都是通过基于经过验证和版本控制的镜像配置新服务器来执行的。因此,这些部署不依赖于服务器的先前状态,因此不会因此而失败(或仅部分完成)。

新服务器配置完成后,可以在投入使用前进行测试,从而将实际部署流程简化为一次更新即可使新服务器可用,就像更新负载均衡器一样。换句话说,部署变得原子化:要么成功完成,要么没有任何变化。

这使得部署更加可靠,并确保始终了解基础架构中每台服务器的状态。此外,此流程可以轻松实现蓝绿部署滚动发布,这意味着无需停机。

无配置漂移或雪花服务器

不可变基础架构中的所有配置更改均通过将更新后的镜像检入版本控制并附带文档来实现,然后使用自动化、统一的部署流程来部署使用该镜像的替换服务器。有时,对服务器的 Shell 访问会完全受到限制。

通过消除雪花服务器和配置漂移的风险,可以避免复杂或难以重现的设置。这还可以避免有人需要修改不太了解的生产服务器的情况,这种情况下很容易出错,并导致停机或意外行为。

一致的暂存环境和轻松的水平扩展

由于所有服务器都使用相同的创建流程,因此不存在部署边缘情况。这使得复制生产环境变得非常简单,从而避免了混乱或不一致的暂存环境,并且通过无缝地向基础架构添加更多相同的服务器,简化了水平扩展。

简单的回滚和恢复过程

使用版本控制来保存镜像历史记录也有助于处理生产环境中的问题。部署新镜像的流程也可用于回滚到旧版本,从而增强弹性,并缩短停机时的恢复时间。

不可变基础设施实施细节

不可变基础设施在实施细节上有一些要求和细微差别,尤其是与传统的可变基础设施相比。

从技术上讲,只需遵循不变性这一关键原则,就可以实现独立于任何自动化、工具或软件设计原则的不可变基础设施。然而,为了实现大规模实用性,强烈建议使用以下组件(大致按优先级排序):

  • 云计算环境或其他虚拟化环境中的服务器(例如容器,但这会改变下文的一些其他要求)。关键在于拥有独立的实例,可以通过自定义镜像快速配置,并通过 API 或类似方式自动管理实例的创建和销毁。

  • 整个部署流程完全自动化,理想情况下包括创建后的镜像验证。设置此自动化功能会显著增加实施此基础架构的前期成本,但这只是一次性成本,很快就会摊销。

  • 面向服务的架构将您的基础设施划分为模块化、逻辑上离散的单元,并通过网络进行通信。这使您可以充分利用同样面向服务的云计算产品(例如 IaaS、PaaS)。

  • 一个无状态、易变的应用层,包含不可变的服务器。这里的所有数据都可以随时被快速销毁和重建(易变性),且不会丢失任何数据(无状态)。

  • 持久数据层包括

    • 集中式日志记录,包含有关服务器部署的更多详细信息,例如通过版本或 Git 提交 SHA 进行镜像识别。由于服务器在此基础架构中是一次性的(并且经常被丢弃),因此即使在 Shell 访问受限或服务器被销毁后,将日志和指标存储在外部也能进行调试。
    • 外部数据存储,用于存储数据库以及其他任何有状态或短暂的数据,例如DBaaS/云数据库以及对象存储或块存储(无论是云提供的还是自行管理的)。当服务器不稳定时,您不能依赖本地存储,因此需要将数据存储在其他地方。
  • 工程和运营团队的奉献精神,共同协作,并致力于实现这一目标。尽管最终产品非常简单,但在不可变的基础架构中却包含许多可变组件,没有人能够完全了解它们。此外,在这种基础架构中工作的某些方面可能很新颖,或者超出了人们的舒适区,例如调试或在没有shell访问权限的情况下执行一次性任务。

实现这些组件的方法有很多种。选择哪种方法很大程度上取决于个人偏好和熟悉程度,以及您希望自行构建多少基础设施,而不是依赖付费服务。

CI/CD 工具是部署管道自动化的良好起点;Compose是 DBaaS 解决方案的一个选项;rsyslogELK是集中式日志记录的流行选择;Netflix 的 Chaos Monkey会随机杀死生产环境中的服务器,是最终设置的一次真正的考验。

结论

本文介绍了什么是不可变基础设施、它与旧式可变基础设施之间的概念和实际差异、使用它的优势以及其实现的细节。

确定是否以及何时应该考虑迁移到不可变基础设施可能很困难,而且没有一个明确的分界点或拐点。即使您仍在一个高度可变的环境中工作,也可以开始实施本文推荐的一些设计实践,例如配置管理。这将使未来向不可变性的过渡更加轻松。

如果您拥有包含上述大多数组件的基础架构,并且发现自己遇到了扩展问题或对部署过程的笨重感到沮丧,那么这可能是开始评估不变性如何改善基础架构的好时机。

您可以从多家公司(包括CodeshipChefKoddiFugue)了解更多信息,这些公司都撰写了有关不可变基础设施实现的文章。

在 DigitalOcean 上构建、测试和部署新应用——开发者及其团队钟爱的一体化云平台。新用户即可免费获得 100 美元账户信用额度:do.co/devto

知识共享许可
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行授权

鏂囩珷鏉ユ簮锛�https://dev.to/digitalocean/what-is-immutable-infrastruct-2h1o
PREV
我如何在 6 个月后获得 40 多岁的第一份初级开发人员工作?
NEXT
如何在 DigitalOcean Kubernetes 上设置 Prometheus、Grafana 和 Alertmanager 监控堆栈