有关不可变服务器的一些问题,例如:


如何在不丧失进行验尸的能力的情况下实现不可变服务器模式?
配置管理工具扮演什么角色在不可变的基础架构中发挥作用?

显然,这与服务器有关(这是我得到的)。而且,只要消化不可变的语法,我就会认为它与“不可能静音”有关。如果这个猜测接近了,我将不知道到底什么是不能静音的(我怀疑这与声卡或其他东西有关……)。

我的问题:


什么是真正的“不可变服务器”(在DevOps的上下文中)?
为什么使用它们?


评论

无法变异

@Evgeny:ggggggggggggrrrrrrrrrrrrrrrrrr,我很近,但是我的静音猜测完全错了(请别笑我...)。

相关问题

很抱歉,这么简单,但是是否可以通过简单的互联网搜索来定义繁琐的“不变”?我得到的问题远不止于此,但查找单词的含义而不是猜测可能为您提供了不错的起点。

@Adrian毫不客气地直言不讳(因为我遭受了ESL的困扰,所以我不得不在Google上搜索一下,以真正获得直截了当的含义)。但是我想知道您是否知道这个meta.SA问题?除此之外,我宁愿向DevOps专家学习,而不是像Wikipedia这样的替代方法。

#1 楼

不变性是计算机科学界经常使用的一个术语,通常可以归结为“创建后无法更改”。它通常用于表示并行性,并发性和线程安全性。

对该主题的讨论很有趣,但是通常可以在Stack Overflow的其他地方找到。我抵制在这里潜入其中的冲动。关键概念是“创建后无法更改”。

想象一下,如果在Amazon上通过将Web服务烘焙到机器映像中来部署Web服务(AMI-您可以重复使用的预建实例)重新配置)。它通过启动时退出注册表的凭据连接到后端数据库。它将日志转储到Splunk之类的日志记录工具中。对于正常的日常操作,您没有理由使用此框。如果需要扩展该服务,则只需创建该AMI的更多实例并调整负载均衡器即可。降低速度只是破坏实例和负载平衡器。

对于日常操作,此框没有理由更改。我们可以在AMI上启动更多功能。

当您需要提供OS级安全补丁时会发生什么?这是您决定执行以下操作的时间...是要在安装了补丁程序的情况下烘烤新的AMI并重新部署所有正在运行的实例,还是将ssh放入现有映像并更新补丁程序?有很多人会屈服。“不变建筑”的拥护者甚至向我吼叫,甚至暗示这种事情是可能的。新的ami。他们提倡消除所有理由将ssh放入计算机。他们主张通过将配置详细信息从存储库中拉出,任何特定的计算机配置都应在该计算机启动时进行。这是“牛而不是宠物”的最终表达。

不可变的体系结构专门涉及机器配置,这些机器配置在创建机器映像后无需更改。如果需要更改,请烘焙新的实例映像,关闭旧的实例映像,然后启动新的实例映像。

评论


“关闭旧的,振兴新的”。或者,如果您的体系结构允许,请启动新的,调整负载平衡器,关闭旧的。这样,即使在高峰时间,您也可以随时随地进行操作。 :)

–蒂姆·马隆(Tim Malone)
18-6月18日15:34



如果从函数式编程(1960年代)开始就实现了不变性,现在人们就意识到它不仅减少了错误(通常不关心的问题),而且还有助于并发。

–ctrl-alt-delor
19 Mar 19 '19在8:47

我对除此神奇的答案之外的任何其他内容都非常感兴趣,因为它可能会导致监视代理或其他可能难以融入原始软件的软件在这里发挥作用。例如,APM监视软件必须在创建和更改参数后检测其新机器环境。我正在探索SSM和自动化以将其部署到AWS中,但是在处理以后可能安装的其他代理时,很少讨论AMI /映像的不变性。

– SheldonH
19年3月21日在7:25

#2 楼

云技术改变了硬件和软件之间的边界,因此许多以前是硬件世界专有的技术操作也是软件领域的主题。共享计算环境可能与计算机本身一样古老1,但是云技术可以通过提供方便且熟悉的隐喻与之交互来普及它们:云用户保留实例,完整的计算机或模拟对象,而较旧的共享计算环境则具有所有可能的集合。繁琐的限制和“您的程序必须在该FTP服务器上上载,将在环境X中运行(通常与要使用的任何软件的10y旧版本一起使用,最多60分钟)”,这对于以前的用户或实际用户来说可能听起来很熟悉计算中心。

这种转变的实际结果是部署程序现在可以由软件人工制品来表示。 (部署过程是说明如何设置基础结构的说明,其中包括数据库,Web服务器或属于该基础结构的任何内容,以及它们运行所在的网络。)与这些新镜头一起,服务器的手动维护看起来像手动修补生产代码–仅在极少数情况下才是可取的。手动维护很容易在生产中实际运行的系统与描述这些系统的代码之间引入差异,这反过来又意味着行为不可重现,不可能进行错误分析,双重错误修复以及其他灾难。
服务器模式只是上述主张的云计算操作的换位,根据这种模式,我们应该避免手动维护正在运行的程序。建议不要使用手动配置服务器,而是使用不可变服务器模式来自动执行此配置。虽然不可变服务器模式的总体思路很明确,但是实现方面有很多细微差别。例如,一些方法建议根本不更新服务器,而改为系统地替换服务器。这是因为更新会产生这样的情况:部署由在几个不同的时间启动并且经历了几个不同的更新过程的服务器组成,这意味着一组不均匀的服务器,并且可能导致服务器处理其工作方式的细微差异。第二个流行的变化点是有关远程访问服务器的规则。有些人喜欢禁用对服务器的完全远程管理访问,以确保永远不会进行手动维护。

历史记录

据我所知,术语“不可变”服务器”已由基夫·莫里斯(Kief Morris)推广,但是这个想法本身已经存在很久了。在1999年,FreeBSD监狱已经普及了使一次性计算环境的配置完全自动化的想法,这就是我多年以前开始实现“不可变服务器”模式的方法,直到我听到这个名称来描述这种技术。

以CD-ROMS为基础的物理不变性,不变性也是制造可信计算系统的一种流行措施。这不能与不变的服务器模式相混淆。

评论


哇,还有一个有趣的解释,谢谢!现在,我真的很难决定将哪个答案标记为已接受(请耐心等待,请知道我最多只能标记1,尽管目前我还没有决定哪个标记.. )。

– Pierre.Vriens♦
17 Mar 7 '17 at 16:07

Avec plaisir! –我认为等待几天以接受答案是一个好主意,这增加了用户编写更多答案的机会。

–MichaëlLe Barbier
17年7月7日在18:39

#3 楼

不可变服务器是指不能进行任何更改的服务器(理想情况下是更新和安全补丁程序除外)。无需更改服务器上的软件,而是使用所需的软件使新服务器假脱机,然后终止较旧的服务器。

该概念有助于确保您的测试,开发和质量检查服务器都相同,这出于该问题范围之外的多种原因而非常重要。不可变服务器的另一个好处是能够将应用程序回滚到较旧的服务器上。例如,我需要在生产服务器1上更改K,所以我将服务器2后台处理并更改K。现在,在10分钟后,我注意到K破坏了我的应用程序,而不必立即进行修复,这可能需要几个小时并可能导致我的客户停机。我将流量重定向回服务器1,而我却发现2出了什么问题。

评论


嗯,很有意思。。。我还需要一些时间来进一步理解这一点。。。 ...

– Pierre.Vriens♦
17 Mar 7 '17 at 12:48

快速“回滚”的做法通常称为“蓝色/绿色部署”(也称为红色/黑色,取决于谁进行呼叫)。

– Evgeny Zislis
17年7月7日在12:54

@Evgeny和更糟糕的是,也可以称为A / B部署,这与A / B实验不符。 (甚至更糟的是,当这种类型的部署即同一应用的多个版本都可以进行A / B实验而不是功能标记时)

–滕西拜
17 Mar 7 '17 at 13:01

经常有人告诉我,“蓝色/绿色部署”用于将更新部署到现有应用程序,而不是服务器本身。 @Evgeny

–龟
17 Mar 7 '17 at 13:28



是。您可以交换服务器,容器,应用程序等等,但仍将其称为蓝色/绿色。我认为这值得在这里进行问答。只是想指出,您在答案中解释回滚的方式通常称为B / G。

– Evgeny Zislis
17年7月7日在13:30

#4 楼

最好的解释可以(一如既往)在Martin Fowler的不可变服务器文章中找到。

通常,应用程序和操作系统组件需要配置并需要进行更改。例如安全补丁,应用程序新版本的部署和配置更改。

当您认为任何更改都是服务器状态的突变时,术语immutable开始变得更有意义。这意味着在这样的服务器上不允许进行任何更改。

通常情况下,当人们参与更改服务器状态时-无论是版本部署还是配置更改,或安全路径。结果是服务器不再按预期工作。例如,由于配置错误等原因,该应用程序可能现在无法运行。

这就是为什么建立了创建不可变服务器的实践的原因。对于不可变服务器,将创建捆绑了所有配置,补丁,应用程序版本的服务器映像。然后,该服务器映像可用于在各种环境中创建服务器。

第一个环境使用图像,将是可以测试图像正常工作的环境。检测到任何异常,然后才可以将此类映像提升到生产环境,以使用新版本替换服务器(众所周知,该版本运行良好)。

映像和映像的推广是自动化的,您将获得非常可靠的防故障过程,该过程几乎不需要人工,并且很少有机会将故障引入服务。

通常,不可变服务器甚至不包含任何“输入”它们的方法,例如缺少ssh服务器。在这种情况下,通常还会将服务器的所有度量标准(度量标准,日志)都运送到度量标准数据库或日志聚合服务之类的外部系统。 ),还有一个过程来创建图像,然后将它们生成到正在运行的容器中。这些通常会被基于更新图像的新容器替换,并且永不突变。意味着没有人会通过引入更改来进入容器来“修复某些东西”。

评论


有趣的解释,也许您想对它进行一点点改动,如果可以的话,并且在有意义的情况下,详细阐述一些我认为与之相关的东西,即“刷新”系统。我认为您可以(或多或少)让任何人“玩”某事,并提前警告他们,例如,每晚都有某种重置为某种初始状态的信息。听起来这样复位的输入是……呃……我要说的是……对:这样一个不变的东西可以用于它。

– Pierre.Vriens♦
17年7月7日在14:14

运行将服务器返回到已知状态的服务(例如Chef / Puppet / Ansible / etc ...),仅表示您未使用不可变服务器。 en.wikipedia.org/wiki/Promise_theory很棒,但是martinfowler.com/bliki/ImmutableServer.html更好。

– Evgeny Zislis
17年7月7日在14:16

我相信您是在取笑我,还是在“挑战我”(试图发现每日问题的数量)。 SE规则中是否还没有写着“您只能在30天内问50个问题”的SE规则?

– Pierre.Vriens♦
17年7月7日在14:21

#5 楼

让我们从相反的角度开始,什么是可变服务器?

传统上,可变服务器基础结构是不断修改和更新的基础结构。您可以将外壳固定到其中,升级软件包,对其进行配置,安装服务并向其中部署新代码。这就是可变性的原因,您可以对其进行突变或修改。

不变的基础结构是另一种基础结构范例,其中服务器在部署后就永远不会被修改。如果需要以某种方式更新,修复或修改某些内容,则可以使用具有适当更改的通用映像构建新服务器,以替换旧服务器。经过验证后,它们便可以使用,而旧的则要退役。

为什么要使用它们?以及更简单,更可预测的部署过程,它减轻了可变基础架构中的常见服务器问题,例如服务器崩溃或其他任何原因造成的停机。和快速的服务器配置。

假设您正在开采比特币,如果服务器崩溃,您将不希望出现任何停机,那么您将需要尽快对其进行备份,因此,不变的基础设施应该是解决方案。