其他
应用发布,简单来说就是将已开发完成的系统功能部署到生产环境,并可正常对用户提供服务。传统的应用发布步骤一般采用“三步曲”:第一步:停止应用第二步:更新应用第三步:启动应用那你肯定会问,从停止应用一直到启动应用期间,系统功能是不是无法正常使用?没错。在应用发布过程中,可能会出现页面白屏、访问超时等各种异常,而且一般会持续很久,所以发布时间基本上都集中在凌晨,讲究点的可能就配上一句友好提示“系统正在维护,请稍后访问!”。这种情况大部分都出现在传统行业,原因可能是觉得没有必要,因为:1.传统行业的业务一般都集中的日间,也就是说凌晨基本没有业务,或者非重要业务2.就算凌晨无法使用这些功能,觉得也没关系,第二天再来就是了,客户又不会跑了但真的是这样吗?如今越来越多的传统行业,都在向互联网服务模式转型,其服务主要特点:“全天”不间断为客户提供“优质”的“线上”服务,拆分一下关键词1.“全天”代表着任何时间2.“优质”代表着客户体验3.“线上”代表着线上自助所以说,一个优质的客户服务势必会对服务可用性提出更高的要求,而传统的停机发布不但会对客户造成使用影响,还会变向对企业造成非直接经济损失。例如:客户体验下降导致的客户流失仅此而已?非也!作为曾经也同样是一名运维工程师的我来说,凌晨发布家常便饭,还时不时来一次长达8小时的“长途之旅”,身体就直接被掏空,加上第二天还在“补血”中,还会被各种骚扰电话轰炸,这简直就是一场噩梦。由此可见,应用不停机发布的重要性,通过它可以帮助我们:一是在应用发布过程中线上服务持续可用,提升服务可用性,二是可在白天或是任何时间发布,提升运维人员的机动性。那么我们需要怎么做,才能实现应用不停机发布呢,那接下来就让我们进入正题。01应用不停机发布,从字面上很好理解,就是应用发布过程中服务不中断。但仔细回想一下,原先应用发布过程中,反正服务会中断,那就在应用发布完成后,通过网络屏蔽外部流量的方式,先进行核心或常用功能的内部验证,在确保没有问题后,再解除网络屏蔽,并对外提供服务。那现在呢?应用发布后直接对外?不需要进行内部或小流量验证?想必每个人的答案都有所不同。对此,可以对应用不停机发布能力,简单定义三个成熟度。成熟度成熟度能力成熟度一级应用发布过程服务不中断成熟度二级应用发布过程服务不中断,单应用功能可先进行内部/小流量验证成熟度三级应用发布过程服务不中断,多应用(联动)功能可先进行内部/小流量验证注:不同的成熟度对技术能力的要求会有所不同,建议通过逐步演进的方式来提升成熟度,并在演进过程中对不同的技术能力进行验证,从而不断完善。有人会说蓝绿发布,或有人会说滚动发布,灰度发布就可以实现以上能力。但其实,这些答案并不准确,或者说并不全面,它们虽有交集,但无法涵盖。既然提到发布模式,那我们先来简单比较一下几种发布模式的优缺点。蓝绿发布滚动发布灰度发布资源成本生产等比例资源投入,成本较高基本无需额外资源投入,成本较低基本无需额外资源投入,成本较低回滚时长两套环境直接切换,时长较短根据滚动速率决定,时长较长灰度部分实例回滚,时长适中技术难点资源完全隔离,技术难点较低需制定滚动策略,技术难点适中引入流量路由能力,技术难点较高影响范围影响所有用户,影响面较大影响所有用户,影响面较大影响少量用户,影响面较小注:大部分的技术文章里都会提到,可通过以上任何一种发布模式,做到用户无感知的应用发布,但在实际情况下,并不完全足够,还需要通过一些辅助手段组合在一起才能实现。结合以上发布模式的优缺点,如果你的组织在基础架构技术能力上已经非常成熟,那么灰度发布一定是最佳之选,但如果还处于初级阶段,那可能并不是,而蓝绿发布的资源投入较高,也不是一种非常好的选择。剩下的只有滚动发布,但滚动发布的发布策略会比较复杂,特别在容器环境下,同一应用多个服务实例的滚动策略还需要单独来实现。所以,前期可以选择一种折中的方式,即:单独搭建一套预发验证环境,应用架构需对齐生产环境,但容量方面可以最小化,一般一个应用至少2个服务实例。这样,我们就可以在对生产环境做应用发布前,事先对生产预验证环境进行应用发布,发布后仅对内部用户可见,验证通过后,再对生产环境采用全量应用发布。02应用不停机发布是一项综合性能力,当明确好一种发布模式后,就需要逐步识别会涉及到哪些技术组件,以及明确技术组件在整个解决方案中所担任的职责边界,从而使它们能够相互协同工作。如下列举了一些主要的技术组件:技术组件职责边界应用管理平台主要负责控制整个应用发布流程,以及集成并调度不同的技术组件,协同完成应用不停机发布负载均衡(4层)主要负责服务请求的流量接入,可根据所识别的流量特征,负载分发到不同的负载均衡(7层)负载均衡(7层)主要负责服务请求的流量路由,可根据所识别的流量特征,路由分发到同一应用的不同实例容器/虚拟机平台主要负责容器/虚拟机资源管理,包括容器/虚拟机的创建、更新、销毁等域名解析系统主要负责域名地址管理,包括域名的注册、更新、解析等,以及提供用户访问应用或应用间访问等寻址能力注册中心主要负责服务资源管理,包括服务的注册、更新、注销等,以及提供服务请求方发现服务提供方的能力在明确技术组件后,还需要对技术组件进行合理的架构规划,以适配不同的网络架构要求。本次主要将对负载均衡进行特别说明,一方面它是负责处理流量的核心技术组件,另一方面网络架构的不同,对它的部署架构影响可能也是最大的。在传统的网络架构环境中,出于对网络安全或其他考虑因素,通常会划分出多个不同的网络区域,网络区域间的访问需要通过开设防火墙访问策略才可以进行互通。但这种方式必然会对应用服务间直接进行点对点访问的方式造成影响,主要原因是虚拟机或容器环境中,应用的IP地址可能会发生变化,导致无法提前明确防火墙访问策略。所以,一般都会考虑使用负载均衡(代理模式)来解决这个问题。建议前期优先选择方案三,虽然链路较长会小幅影响性能,但此部署方案相对较为成熟,一方面可以避免流量负载不均的问题,另一方面对于应用的改造成本也会相对较低。注:除网络区域隔离会遇到这种情况外,在某些网络架构中,不同的容器集群间也同样无法访问,所以也同样适用。另外,除必要情况下,也应尽量减少跨网络区域或跨容器集群间的访问,例如:优先容器集群内路由访问,跨网络区域频繁交互的应用服务建议迁移至同一网络区域等。负载均衡通常可以分为4层模式和7层模式,其中4层更关注流量负载,而7层更关注流量路由。一般建议将负载均衡(4层)和负载均衡(7层)进行分层部署,以充分发挥它们的强项。建议前期优先选择方案二,虽然无法实现多容器集群间的全局流量调度,但对于当前可观测性和排障能力还不够健全的组织,通过物理隔离降低运维难度也是一种不错的选择。综上架构决策,最终的全局流量链路大致如下,默认情况下,数据中心间流量隔离,即:单数据中心流量收敛,但可根据实际情况进行选择性放行。03应用不停机发布的基础是服务路由,在这里,我们可以把应用服务分为两种角色,服务请求方或服务提供方,而服务请求方通过不同的寻址方式,最终访问到服务提供方的形式,可以称之为服务路由。服务路由可以分为南北向和东西向。南北向:服务请求方—>负载均衡(4层)—>负载均衡(7层)—>服务提供方东西向:服务请求方—>服务提供方不难发现,其主要区别就是,南北向服务请求方需借助负载均衡(代理模式)访问服务提供方,而东西向服务请求方直接访问服务提供方。注:域名解析结果会缓存在本地,可缓解域名解析服务压力,但缓存时间应根据不同的服务水平进行评估,否则将会延长解析地址切换及故障转移时长。有条件的话建议采用httpdns来解决本地缓存问题。但不管是南北向还是东西向,服务提供方在被访问前,得让服务请求方感知或可见,常见的方式主要有两种,一种是不依赖注册中心的,而另一种则是依赖注册中心的。如果当前应用架构上暂未使用微服务框架,即:不依赖注册中心,服务提供方可以手动或自动将服务在负载均衡上进行服务注册,服务请求方直接调用负载均衡。如果当前应用架构上已经使用微服务框架,即:依赖注册中心,服务提供方可以在注册中心上进行服务注册,服务请求方在注册中心进行服务发现,或者由负载均衡在注册中心进行服务发现,服务请求方直接调用负载均衡。注:在多注册中心的场景下,可通过统一注册中心完成异构注册中心的服务发现另外,我们还会对同一应用的不同服务实例进行分组,分组策略可根据不同的条件来决定,例如:不同环境、不同版本等。假设根据不同环境(预生产环境和生产环境)这个条件,可以把部署在预发验证环境的应用服务分为预发组,把部署在生产环境的应用服务分为线上组。然后通过配置路由策略,下发到负载均衡或应用服务,就可以实现简单的服务路由了。例如:不同分组间默认情况下不允许服务路由,但特殊场景下允许预发组服务路由至线上组。注:若服务请求方是前端页面或客户端,也可以对前端流量也进行分组,例如:根据网络环境,将接入公司WI-FI网络环境的流量识别成预发组04应用不停机发布的核心是应用如何优雅停止,光有服务路由可能还不够,它虽然已经解决了大部分问题,但离成功还差最后一步。前面我们提到过应用发布要做到用户无感知,那如果应用发布过程中出现瞬断或短时间中断,而用户又正好在使用,那算不算用户就感知到了呢?不过,如果你觉得线上服务中断5分钟也可以忍受,那我只能呵呵了。但我相信大部分具备互联网服务模式的头部公司,别说发布一次服务停止5分钟,可能就连5秒钟也无法忍受。那我们先来分析一下为什么会出现瞬断或短时间中断:1.服务请求处理还没完成,应用就被强行停止(例如:运维必备大招之kill