介绍
在传统的可变服务器基础设施中,服务器会不断更新和修改。使用这类基础设施的工程师和管理员可以SSH到他们的服务器,手动升级或降级软件包版本,逐个服务器调整配置文件,并直接将新代码部署到现有服务器上。换句话说,这些服务器是可变的;它们可以在创建后进行更改。由可变服务器组成的基础设施本身可以称为可变的、传统的或手工的。
不可变基础设施是另一种基础设施模式,其中服务器在部署后永远不会被修改。如果需要以任何方式更新、修复或修改某些内容,就先对公共镜像进行修改,然后用镜像构建新服务器来替换旧服务器。经过验证后,新服务器投入使用,旧的服务器就会下掉。
不可变基础设施的好处是在基础设施中有更多的一致性和可靠性,以及更简单、更可预测的部署过程。它可以缓解或完全防止可变基础设施中常见的问题,如配置漂移(configuration drift)和雪花服务器(snowflake servers)。然而,想要高效地使用不可变基础设施,通常需要包括全面的自动化部署、云计算环境中的快速服务器配置,以及处理有状态数据或临时数据(如日志)的解决方案。
本文的其余部分将:
解释可变基础设施和不可变基础设施在概念和实践上的区别
结合具体场景介绍使用不可变基础设施的优点
给出不可变基础设施的实现细节和必要组件的概述
可变和不可变基础设施的区别
可变基础设施和不可变基础设施之间最根本的区别在于它们的中心策略:前者的组件被设计为在部署后可以更改;后者的组成部分被设计成保持不变,并最终被替换。本文主要讨论作为服务器的那些组件,但是还有其他实现不可变基础设施的方法,比如使用容器,它们适用于相同的高层级概念。
更深入地讲,基于服务器的可变基础设施和不可变基础设施在实践上和概念上都存在差异。
从概念上讲,这两种基础设施在如何处理服务器(例如创建、维护、更新、销毁)方面差异很大。这通常可以用“宠物 vs 牛”的比喻来说明。
实际上,可变基础设施是一个较早出现的基础设施模式;而虚拟化和云计算等核心技术后来才出现,这些核心技术使不可变基础设施成为可能。了解这段历史有助于了解两者之间的概念差异。
接下来的两节将更详细地讨论这些差异。
实践上的差异:拥抱云技术
在虚拟化和云计算成为可能和广泛使用之前,服务器基础设施是以物理服务器为中心的。创建这些物理服务器既昂贵又耗时;初始化设置可能需要数天或数周的时间,因为订购新硬件、配置机器、然后将其安装到一个colo数据中心(译者注:详细解释可参见Wiki)或类似的位置需要很长时间。
可变基础设施起源于此。因为更换服务器的成本非常高,所以最实际的做法是尽可能长时间地使用运行的服务器,而停机时间越短越好。这意味着需要对常规部署和更新进行大量适当的更改,但也需要在出现问题时进行特别的修复、调整和打补丁。频繁手动更改会使服务器变得难以复制,每个服务器都成为整个基础设施中唯一且脆弱的组件。
虚拟化和按需计算/云计算的出现代表了服务器架构的一个转折点。虚拟服务器更便宜,即使是大规模的,它们可以在几分钟内创建和销毁,而不是几天或几周。这使得新的部署工作流和服务器管理技术第一次成为可能,比如使用配置管理或云API以快速、编程和自动的方式提供新服务器。正是因为可以快速且低成本地创建新虚拟服务器,不变性原则才能够真正落地实践。
传统的可变基础设施最初是在这样的背景下发展的:物理服务器的使用决定了服务器管理过程中能够做到哪些事情,并随着技术的日益发展而持续开发。在部署后修改服务器的模式在现代基础设施中仍然很常见。相比之下,不可变的基础设施从一开始就依赖于基于虚拟化的技术来快速提供架构组件,比如云计算的虚拟服务器。
概念上的差异:宠物 vs 牛,雪花 vs 凤凰
云计算所带来的基本概念的变化是:服务器可以被认为是一次性的。考虑放弃和替换物理服务器是不切实际的,但是使用虚拟服务器,不仅是可能的,而且是简单和高效的。
传统的可变基础设施中的服务器是不可替代的、必须始终保持运行的独特系统。在这方面,它们就像宠物一样:独一无二,不可复制,手动维护。失去一个可能是毁灭性的。另一方面,不可变基础设施中的服务器是一次性的,易于使用自动化工具复制或扩展。在这种情况下,他们就像牛群:一个群体中没有一个个体是独特的或不可缺少的。
Randy Bias是第一个用宠物与牛的比喻来形容云计算的:
在过去的操作方式中,我们把服务器当作宠物,例如邮件服务器Bob。如果Bob倒下了,所有人都无法工作了。CEO收不到电子邮件,这就是世界末日。在新方式中,服务器被编号,就像一群牛。例如,www001到www100。当一个服务器故障了,它就会被下掉,然后换一个新的到线上。
另一种形容服务器之间区别的类比是使用雪花服务器(snowflake servers)和凤凰服务器(phoenix servers)的概念。
雪花服务器类似于宠物。它们是手工管理的服务器,经常更新和调整,从而形成独特的环境。凤凰服务器类似于牛。这些服务器总是从零开始构建,并且很容易通过自动化过程重新创建(或“浴火重生”)。
不可变基础设施几乎完全由牛或凤凰服务器组成,而可变的基础结构允许一些(或许多)宠物或雪花服务器。下一节将讨论两者的含义。
不可变基础设施的优点
要理解不可变基础设施的优点,有必要先了解可变基础设施的缺点。
可变基础设施中的服务器可能会遭受配置漂移,即未经记录的临时更改会导致服务器的配置彼此之间以及与审查、批准和最初部署的配置之间的差异越来越大。这些越来越像雪花的服务器很难复制和替换,这使得扩展和从故障中恢复变得困难。因为很难创建一个和生产环境相同的临时环境,所以遇到问题时也很难调试。
在多次手动修改之后,会慢慢忘记为什么服务器要设置不同的配置,因此更新或更改任何配置都可能产生意想不到的副作用。即使在最好的情况下,对现有系统进行更改也不能保证有效,这意味着依赖于此操作的部署有失败或将服务器置于未知状态的风险。
基于这一点,使用不可变基础设施的主要好处是部署的简单性、可靠性和一致性,这些特性会减少或消除许多常见的痛点和故障点。
易知的服务器状态和更少的部署失败
不可变基础设施中的所有部署都是通过使用镜像构建新服务器来执行的,这些镜像经过验证并且有版本控制。因此,这些部署不依赖于服务器以前的状态,因此不会出现故障,也不会出现仅完成部分部署。
在提供新服务器时,可以在投入使用之前对它们进行测试,从而将实际部署过程减少为仅进行一次更新,就能使新服务器可用,就像更新负载均衡器一样。换句话说,部署具有原子性:要么成功完成,要么没有任何改变。
这使得部署更加可靠,并确保始终知道基础设施中每个服务器的状态。此外,蓝绿部署或滚动发布的实现变得容易,这意味着没有停机时间。
没有配置漂移或雪花服务器
不可变基础设施中的所有配置更改都是通过以下两步实现:一是将更新后的镜像签入带有文档的版本控制中,二是用一个自动化的统一部署流程来根据该映像部署替换服务器。Shell对服务器的访问有时是完全受限的。
通过消除雪花服务器和配置漂移的风险,可以防止复杂或难以重现的设置。这还可以防止有人修改自己并不了解的生产服务器,这种高风险操作可能导致停机或意外行为。
一致的预发布环境和简单的水平扩缩容
因为所有服务器都使用相同的创建过程,所以不存在部署的特异情况。通过简化复制生产环境的工作,可以防止出现混乱或不一致的预发布环境,还可以通过无缝地向基础设施添加更多相同的服务器来简化水平扩缩容。
简单的回滚和恢复处理
使用版本控制来保存历史镜像也有助于处理生产问题。用于部署新镜像的相同过程也可以用于回滚到旧版本,从而易于处理停机问题并缩短恢复时间。
不可变的基础设施实现细节
不可变基础设施在其实现细节上有一些要求和细微差别,特别是与传统的可变基础设施相比。
从技术上讲,只要简单地遵循不可变的关键原则,就可以实现独立于任何自动化、工具或软件设计原则的不可变基础设施。然而,为了在规模上切实可行,强烈建议使用以下组件(大致按优先顺序排列):
云计算环境的服务器,或其他虚拟化环境中的服务器(比如容器,尽管这改变了下面的一些其他要求)。这里的关键是拥有从自定义镜像快速创建的独立实例,以及通过API或类似工具对创建和销毁进行自动化管理。
完全自动化整个部署管道,理想情况下包括镜像创建后的验证过程。设置这种自动化会显著增加实现这种基础设施的前期成本,但这是一次性成本,可以很快摊销。
面向服务的体系结构,将您的基础设施分离为模块化的、逻辑上离散的单元,这些单元通过网络进行通信。这允许您充分利用云计算的产品,这些产品也是面向服务的(例如IaaS、PaaS)。
一个无状态、易变的应用层,它包括不可变的服务器。这里的任何东西都可以在任何时候(易变的)迅速被销毁和重建,而不会丢失任何数据(无状态的)。
一个持久化数据层,包括:
集中式日志记录,包含关于服务器部署的额外细节,比如通过版本或Git提交SHA的镜像ID。因为在这个基础设施中服务器是一次性的(并且经常被销毁),所以即使在shell访问受到限制或服务器被销毁后,从外部存储日志和打点记录(metrics)也可以进行调试。
用于数据库和任何其他有状态或临时数据的外部数据存储,如DBaaS/云数据库和对象或块存储(云提供或自管理)。当服务器不稳定时,不能依赖本地存储,因此需要将数据存储在其他地方。
工程和运营团队致力于协作并致力于该方法的奉献精神。尽管最终产品非常简单,但在一个不可变基础设施中有许多可移动的部分,没有一个人会知道所有这些部分。此外,在这个基础设施中工作的一些方面可能是新的或超出人们的适应范围,比如调试或在没有shell访问的情况下执行一次性任务。
有许多不同的方法可以实现每个组件。根据个人偏好和熟悉程度,以及你想建立自己的基础设施,还是依赖付费服务,来选择一个组件。
CI/CD工具是实现部署管道自动化的好起点;Compose是DBaaS解决方案的一个选项;rsyslog和ELK是集中日志记录的流行选择;Netflix的Chaos Monkey随机杀死你的生产环境中的服务器,是你最终设置的真正考验。
总结
本文介绍了什么是不可变基础设施,它与老式的可变基础设施在概念和实践上的区别,使用它的优点,以及其实现的详细信息。
知道是否或者何时应该考虑迁移到不可变基础设施可能很困难,而且没有明确定义的判断标准。一种开始的方法是实现本文推荐的一些设计实践,比如配置管理,即使您仍然在一个很大程度上可变的环境中工作。这将使将来更容易过渡到不变性。
如果您有一个包含上述大多数组件的基础设施,并且发现自己遇到了扩缩容的问题,或者对部署过程的笨拙感到沮丧,那么现在可以开始评估如何使用不可变性改进基础设施。
不可变基础设施是一种理念,具体落地的技术非常依赖容器或虚拟机,以及分布式存储等配套设施。我们没有必要把它作为一种技术标准去强制执行,而应该结合现状,选择性地朝着这个方向不断优化。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。