5种常用的服务器部署策略
Hi,你好,我是猿java。
作为一名 Java程序员,部署生产环境的服务器是一项基本能力要求,那么,如何部署才能做到业务无感?选择什么样的部署策略,才能将生产事故降到最低?今天我们就来一起聊聊5种常用的部署策略。
Big Bang Deploy
定义
Big Bang Deployment,中文翻译为:大爆炸部署,也就是我们通常说的全量部署。它是指在一个较短的时间内将新系统或新版本全部部署并替换旧系统,使其立即对所有用户生效。
原理
Big Bang Deployment的原理很简单,如下图,只需要把服务器全量部署,部署前为服务V1.0,服务部署后就全量变成了V2.0。
优点
快速部署:
Big Bang Deployment可以在较短的时间内完成整个系统的部署,从而迅速推出新功能或更新。这种快速部署有助于满足紧迫的业务需求,让用户尽快获得新功能的好处。突破点:
将新系统一次性部署可以带来一个重大的突破点。一旦部署成功,所有用户都能立即使用新系统,从而为企业带来显著的商业价值和竞争优势。零停机时间:
由于所有用户都在同一时间切换到新系统,旧系统可以在部署后立即停用,从而减少了整个过程中的停机时间。简化维护:
在部署后,维护人员只需关注新系统的运行和维护,而无需再维护旧系统,这简化了维护流程和资源投入。
缺点
高风险:
Big Bang Deployment 由于一次性全量部署,风险相对较高。如果在部署过程中发生严重错误或问题,整个系统可能会出现故障甚至是瘫痪,影响所有用户。回滚复杂:
由于一次性部署,如果在新系统中出现严重问题,需要回滚到旧系统可能会非常复杂和耗时,尤其是如果数据已经在新系统中被修改,回滚可能会导致数据丢失或一致性问题。用户接受度:
用户可能对突然的系统变化感到困惑和不适应,尤其是如果新系统的用户界面和功能与旧系统有较大差异。这可能会导致用户体验下降,甚至流失用户。测试挑战:
在短时间内完成全面的测试和验证是一项挑战,可能导致某些问题未被发现,从而在部署后才被用户发现,增加修复的成本和复杂性。
适用场景
只有一台服务器:有些使用量比较小的业务,为了成本,只需要部署一台服务器,因此,当需要部署新功能时,就可以采用该策略。
复杂的数据库升级:如果数据库需要进行复杂的业务升级,已经到了不得不使用全量部署策略。
总体而言,Big Bang Deployment是一种迅速推出新系统的方法,适用于紧急的业务需求,但风险较高。在实施前需要充分的计划、测试和备份策略,以减轻潜在的风险。对于一些重要业务功能,采用渐进式的部署策略可能更为保守和安全。
Rolling Deploy
定义
Rolling Deployment,中文翻译为:滚动部署。与 Big Bang Deployment 相对,它指的是在部署新系统或新版本时,逐步将新版本部署到一部分用户或服务器上,然后再逐步扩大范围,直至所有用户或服务器都更新到新版本。
原理
准备新版本:在进行滚动部署之前,团队需要准备好新版本的应用程序代码、配置和资源。
划分批次:团队将服务器分成多个批次(通常是一组服务器),每个批次都将逐步进行更新。
停止旧版本:从第一个批次开始,停止旧版本的服务器,使其不再提供服务。
部署新版本:在停止的旧版本服务器上部署新版本的应用程序代码,并启动新版本。
验证新版本:确保新版本的服务器正常运行,并在没有问题的情况下继续进行下一批次的部署。
逐步推进:逐步重复步骤 3~5,依次更新下一个批次的服务器,直到所有服务器都部署了新版本。
完成部署:一旦所有服务器都成功部署了新版本,滚动部署就完成了。
如下图:在所有的服务器中,我们将 2台部署成新服务V2.0,当用户的请求到达新服务上得不到响应时,可以快速回滚到V1.0,这样就可以快速止损。当用户请求到达新服务V2.0能收到预期响应,可以继续下一批服务的发布。
优点
降低风险:滚动部署通过逐步部署新版本,降低了整个系统的风险。如果在部署过程中发现问题,可以及时停止部署,从而减少对整个系统的影响。
易于回滚:由于部署是逐步进行的,如果在新版本中发现问题,可以快速回滚到上一个稳定的版本。这减少了回滚所需的复杂性和风险。
逐步学习:滚动部署允许一部分用户或服务器先使用新版本,有助于逐步了解新功能和系统的表现,从而及时收集用户反馈和修复潜在问题。
资源控制:滚动部署允许在部署过程中逐步增加资源,例如服务器数量或网络带宽,以确保整个部署过程的稳定性和性能。
缺点
部署时间较长:相对于Big Bang Deployment,滚动部署需要更长的时间才能将新版本完全部署到所有用户或服务器上。这可能导致新功能的推出相对较慢,无法立即满足所有用户的需求。
复杂性:滚动部署需要更多的规划和管理,因为需要确保新版本与旧版本之间的兼容性,并在部署过程中及时检测和解决问题。
版本管理:在滚动部署中,可能需要同时维护多个版本的系统,这增加了版本管理和维护的复杂性。
用户分流:在部署过程中,用户可能会分流在不同版本的系统中,这可能导致数据和用户体验方面的一些问题,例如数据不一致或功能差异。
适用场景
Rolling deploy是一种较为稳健和逐步的部署策略,适用于对风险敏感且需要更好控制部署过程的情况。它可以减少系统故障的风险,但需要更多的时间和资源来确保顺利完成部署,并在整个过程中维持系统的稳定性和用户体验。
Blue-Green Deploy
定义
Blue-Green Deployment,中文翻译为:蓝绿部署,它允许在生产环境中同时维护两个相同的系统版本:一个为当前生产版本(蓝色),另一个为新版本(绿色)。
原理
初始状态:在初始状态下,蓝色环境是活动的,承载着当前的生产版本应用程序,而绿色环境是非活动的,不对用户提供服务。
部署新版本:在进行新版本的部署前,将新的应用程序部署到绿色环境中,但并不启动它。
测试和验证:在部署新版本之后,在绿色环境中进行全面测试和验证,以确保新版本的功能和性能正常。
切换流量:一旦新版本经过验证没有问题,可以将流量从蓝色环境逐渐切换到绿色环境。这样,一部分用户或请求将被导向绿色环境,而其他用户仍然继续使用蓝色环境。
监控和回滚:持续监控绿色环境的性能和稳定性。如果出现问题,可以迅速回滚到蓝色环境,保证服务连续性。
完成切换:一旦绿色环境被验证为正常运行,并且满足预期的要求,可以继续将所有流量切换到绿色环境,从而完成蓝绿部署。
如下图:Blue为老服务,提供正常服务;Green为新环境,部署新的服务,不对实际用户提供服务,因此,QA 团队可以在 Green环境中测试新版本,发现任何错误或问题都可以快速修复它们。
如果 Green环境验证OK,准备就绪,就可以把 Blue环境的流量慢慢切到 Green环境,假如 Green环境出现任何异常,又可以快速回滚到 Blue环境,如下图:
总的来说,Blue-Green Deployment 的原理是通过在两个相同的环境中进行部署,逐步切换流量,实现零宕机和无缝切换新版本应用程序的目标。这种部署策略通常用于大规模应用程序或关键系统,以确保在部署过程中用户不会受到影响,同时提供快速回滚机制以应对可能出现的问题。
优点
零宕机部署:蓝绿部署允许在切换到新版本时实现零宕机(Zero Downtime)部署。新版本可以在独立的环境中进行测试,确保其稳定性和功能正常后,再切换用户流量到新版本,而不会中断服务。
风险控制:由于蓝绿部署可以随时回滚到蓝色版本,即使新版本存在问题,也可以快速切换回旧版本,降低了部署风险。
灰度发布:蓝绿部署可以实现灰度发布,逐步将用户流量从蓝色版本转移到绿色版本,以便逐步测试新版本并收集用户反馈,确保稳定性。
迭代更新:蓝绿部署适合频繁发布和迭代更新,帮助团队快速交付新功能和修复问题。
缺点
环境资源需求:蓝绿部署需要同时维护两个环境(蓝色和绿色),这可能会增加资源成本和管理复杂性。
配置同步:在进行版本切换时,确保两个环境的配置和数据同步可能需要额外的努力和策略。
需要自动化:为了实现蓝绿部署的优势,需要有自动化的部署和回滚机制,否则可能增加人工错误的风险。
适用环境
Blue-Green 部署策略通常用于大规模应用程序或关键系统,以确保在部署过程中用户不会受到影响,同时提供快速回滚机制以应对可能出现的问题。
Canary Deploy
定义
Canary Deployment,中文翻译为:金丝雀部署,其实就是灰度发布。它允许在生产环境中逐步将新版本应用程序推送给一小部分用户或服务器,然后根据实时性能和用户反馈逐步增加新版本的比例,直到最终将所有用户或服务器都切换到新版本。这种部署方法得名于金丝雀鸟(Canary),它是用来检测气体中有毒物质的早期指示器。
原理
小规模发布:首先,只将新版本应用程序部署到生产环境中的一小部分服务器或一小部分用户。这些被选中的服务器或用户组成了“金丝雀群体”。
监控和比较:通过监控金丝雀群体的性能、稳定性和用户反馈,与之前的版本进行比较。如果新版本表现良好且没有问题,可以逐步增加新版本的部署比例。
逐步升级:根据监控数据,逐渐将新版本应用程序推送给更多的服务器或用户,直到最终完成全部升级。在这个过程中,可以根据需要灵活地调整部署比例。
回滚机制:如果在升级过程中出现问题,可以立即回滚到旧版本,保证用户和系统的稳定性。
如下图:首先会部署出一个新版本的小集群,然后将小部分真实用户切换到小集群上,如果在小集群上验证业务OK,则可以服务全部部署成V2.0,如果小集群上出现任何问题,只需要把用户切换到V1集群上,然后对小集群进行修复。
优点
风险控制:Canary Deployment 允许逐步发布新版本,即使在部署初期出现问题,也只会影响一小部分用户或服务器,降低了整体风险。
及时发现问题:通过监控金丝雀群体的性能和用户反馈,可以及时发现潜在的问题,避免大规模部署后才发现严重错误。
零宕机:在金丝雀部署的过程中,新版本和旧版本共存,因此可以实现零宕机部署,确保服务连续性。
灰度发布:Canary Deployment 可以实现灰度发布,逐步测试和推出新功能,从而提供更好的用户体验和逐步迭代更新。
缺点
部署复杂性:相比于传统的蓝绿部署,Canary Deployment 需要更复杂的监控和管理措施,以确保升级过程的稳定性。
需要实时监控:为了及时发现问题,需要实时监控金丝雀群体的性能和用户反馈,这可能需要额外的资源和工具支持。
不适用于所有场景:Canary Deployment 适用于大规模系统或复杂系统,但对于较小规模或简单的项目,可能过于繁琐。
适用环境
Canary Deployment 特别适用于大型和复杂的系统,它可以帮助团队在更新时最小化风险,并及时发现和解决潜在问题,提供更好的用户体验和服务质量。但它也需要较高的部署复杂性和实时监控要求。
在实际生产中,Canary Deployment 通常不是一个独立的策略,它通常与Rolling deploy相结合,以创建一种将两全其美的方法结合在一起的方法。
Feature Toggle
定义
Feature Toggle,中文翻译为:功能开关,它允许开发团队在运行时控制应用程序的功能可见性,即通过开关来启用或禁用特定功能。这种技术的核心原理是将特定功能的开启状态从代码中解耦出来,使得在不修改代码的情况下,可以在运行时灵活地切换功能的开启状态。
原理
利用条件判断:在代码中通过设置条件判断,以决定是否执行特定功能代码块。
外部配置:将功能的开启状态配置化,通常存储在外部配置文件或数据库中。
运行时开关:通过修改配置,可以在运行时控制特定功能的开启或禁用状态。
动态刷新:为了使更改立即生效,通常需要支持动态刷新配置,而不必重新启动应用程序。
如下图:在服务部署的代码中设置开关,控制真实的逻辑
优点
逐步发布:Feature Toggle 允许逐步发布新功能,即使功能已经合并到代码库中,也可以通过关闭功能开关来保持其不可见,直到准备好发布。
容错性:如果新功能导致问题或出现bug,可以立即关闭功能开关,回退到旧功能状态,从而快速修复问题。
并行开发:多个团队可以并行开发不同的功能,通过Feature Toggle 在运行时决定哪些功能被启用,而不会相互干扰。
A/B 测试:Feature Toggle 可用于A/B测试,通过在不同用户群体中启用或禁用特定功能,来评估功能的效果和用户反馈。
缺点
复杂性:Feature Toggle 引入了额外的代码逻辑和配置,可能会增加代码复杂性,特别是当有大量功能需要开关时。
维护难度:随着功能的增加和团队的变动,维护多个Feature Toggle 可能会变得复杂,需要良好的文档和规范来管理。
安全性:Feature Toggle 需要仔细考虑安全性,确保敏感功能在未授权的情况下不会被启用。
技术债务:如果Feature Toggle 没有及时清理,可能会导致代码中存在过多的未使用功能开关,增加技术债务。
适用环境
Feature Toggle 适用于代码存在多套逻辑的场景,可以帮助团队更灵活地开发和部署功能,减少部署风险,支持逐步发布和A/B测试。然而,使用Feature Toggle 需要慎重考虑,确保在长期维护过程中不会导致过多的技术债务和复杂性增加。
总结
本文分别讲解了 Bing Bang deploy,Rolling Deploy,Blue-Green Deploy,Canary Deploy,Feature Toggle 5种策略的原理和优缺点,学名看起来很高深,似乎都没有听过,但很多都在日常一直使用的。下面我通过一家电商公司的发展历程来描述这几种部署策略:
初创时期,没有真实用户,只需要部署一台服务器,每次新功能的迭代可以采取 Bing Bang deploy 这种全量部署策略 。
随着业务的发展,产品已经积累了少部分用户,需要部署两台服务器,每次新功能的迭代,我们可以采用 Rolling Deploy部署策略,先部署一台,验证OK了,再部署剩余的一台。
业务摸索中,发现网页需要整体改版,因此可以采用 Blue-Green Deploy策略,部署一套全新的UI 和后端环境,等验收 OK后,再把原服务(Blue环境)切换到新的服务(Green环境)。
再随着业务的发展,服务集群已经发展到 30台机器,用户群体也已经上千万,为了考虑更多的用户体验,我们就需要采用 Canary Deploy策略,每次新功能迭代都会先让小部分用户使用,如果出现问题可以及时回滚。
电商领域,搜索商品是高频操作,显然 MySQL不太适合,因此,需要引入Elastic Search 来做全文检索,这时可以采用 Feature Toggle策略,保留 Mysql 和 Es两套环境,通过开关来灵活切换流量走哪一种方式。
当然,实际生产中的部署可能会更复杂,但万变不离其宗,有这 5种策略的加持,可以帮助我们更好地适应更复杂的部署。
交流学习
最后,把猿哥的座右铭送给你:投资自己才是最大的财富。 如果你觉得文章有帮助,请帮忙转发给更多的好友,或关注公众号:猿java,持续输出硬核文章。