这篇文章用于介绍Docker化应用在测试环境部署时使用发布加速策略后的优势以及对发布加速原理的剖析。
背景
一般应用至少会有两个环境:测试环境和生产环境,每次代码变更都会在测试环境多次充分验证后发布到生产环境,所以对研发而言,测试环境的发布会很频繁,线上发布会很谨慎。测试环境由于机器性能不如线上,但因为部署频繁,所以发布时间的长短直接影响到研发效率。随着应用Docker化,应用的依赖信息统一固定在镜像里,大大简化了运维操作,也为部署方式的改变创造了更多优化的空间。
测试环境每个应用一般会有1-2台机器,每次代码提交后触发测试环境构建镜像到部署服务启动一般需要几分钟到十多分钟不等。这意味着有可能改一行代码,多则要等十多分钟才可以在测试环境进行验证,严重影响开发效率!
概述
应用Docker化后,应用的部署实际上是进行镜像替换,而镜像替换实际上就是销毁掉老版本镜像的容器,再用新的镜像创建一台容器的过程,整个过程串行执行。
我们在对Docker化应用的发布逻辑进行优化后,采用多版本部署和预部署的策略,将部署时间缩短一倍以上,极端时间在几十秒,提速20倍以上!
使用发布加速逻辑后的部署与传统部署的区别
传统的Docker应用的部署过程是:
1、销毁旧版本容器
2、再在同一台物理机上使用新版本镜像创建新容器(dockerfile里定义volume[数据卷]的数据可以公用,数据不丢失)
3、启动应用
4、检查应用是否启动成功
5、上线流量,也就是服务对外可访问,一般会有http流量和中间件流量。
整个过程串行执行,VM是虚拟机,而Docker是容器,创建销毁动作对容器而言类似进程操作,所以几个步骤中最耗时的是应用启动
使用发布加速策略后,部署系统后台将会分两部分(部署和切流)来完成:
部署
1、在同一台物理机上使用新版本镜像创建容器
2、进行环境初始化等运维相关操作
3、启动应用
4、检查应用是否启动成功,成功后进入切流步骤
切流
将流量从旧版本镜像的容器切换到新版本镜像容器上,对应操作为修改域名的指向从旧版本镜像容器IP变为新版本镜像的容器IP,将新版本镜像容器的IP加入环境隔离,将旧版本镜像容器的IP移出环境隔离,完成流量从旧的服务指向新的服务。
成功后结束发布,后台异步将旧版本镜像容器销毁掉。(环境隔离主要是针对一些中间件,比如消息,加入隔离环境的机器可以接收和发送消息,而移出隔离环境则无法接收和发送消息)
由于后台机器的流量切换是两台机器分批执行,所以即使是流量切换的几十秒,服务也不会中断。
发布加速策略的详细介绍
1、多版本部署
多版本部署是在部署过程中会有两个版本提供服务即以前在跑的服务和本次需要发布代码的服务,但是对外提供服务是可控的,通过并行启动新版本服务,快速进行流量切换的部署策略。
1)2台机器的应用
有的应用即使是测试环境也要求服务不能中断,所以2台机器分2批串行发布,传统发布方式里第一台执行下线服务、销毁容器、创建容器、应用启动、健康检查、上线服务,成功后第二台执行完全相同的逻辑。开启加速模式后,在部署阶段并行创建两个容器,并行启动应用,健康检查,成功后进入到切流阶段,进行流量切换,而流量切换可以在秒级完成。
整个发布过程中健康检查占总时间60%以上,所以传统的部署方式里两台串行的启动和检查在开启发布加速后变为并行,整体发布时间上提升速度一倍多!且部署过程中服务都不会中断,效果等同传统发布模式。
传统和加速模式发布过程中应用的状态和流量对比(v1代表旧版本提供服务,v2代表新版本提供服务):
上表可以看出使用开启加速模式后,发布速度变快了,但是服务模式和以前是相同的,并且服务永远不会中断,除非旧服务本身不可用了。
2)只有1台机器的应用
有的应用在测试环境只有1台机器。传统部署的逻辑是下线服务、销毁容器、创建容器、应用启动、健康检查、上线服务。整个部署过程中服务都是不可用的。开启加速后,部署顺序调整为创建容器、应用启动、健康检查、流量切换、部署成功后后台异步销毁旧容器。相比传统发布方式,加速模式节省了后台异步销毁旧版本镜像的容器的时间,单机部署时间缩短,且整个发布过程中服务不中断。
传统和加速模式发布过程中应用状态和流量对比(v1代表旧版本提供服务,v2代表新版本提供服务):
对比可以发现使用加速模式后,省去了容器销毁和下线的时间。同时发布过程中服务也不会中断,即使由于代码改动导致新版本无法启动发布失败等场景服务也不会中止。
2、预部署
传统的研发部署流程是:1、代码提交;2、打包构建镜像;3、部署,但是有时可能提交了代码不一定会在工具上点击部署,真正的部署是研发同学在工具上提交了部署按钮后。而加速模式的部署类似于持续集成的思想,在代码提交后工具服务端会自动触发打包构建镜像,使用构建的最新镜像创建容器,启动服务,完成部署步骤,但是不会执行切流步骤,所以这时不会将流量导入,类似于进入一种应用启动了但是没有对外服务的状态。在研发同学触发部署时,会将提交需要部署的镜像与最近一次后台自动触发部署的镜像进行对比,如果一样则挂接成功,直接返回后台自动触发部署的流程,如果在研发提交部署请求时后台自动触发的部署步骤已经完成,那么这时的部署相当于只需要执行切流步骤,而切流步骤耗时只有几十秒,对研发的体验就是之前需要十多分钟的部署几十秒就完成了!
部署系统会对发布过程中容器的生命周期以及应用的状态进行管理,部署失败的容器会保留,置为一种预销毁的状态,但不会销毁留给开发登录排查,进行代码修改修复后再次提交部署请求时会做check,对无用的容器进行销毁。如果研发同学多次提交代码,后台多次触发自动化部署,则会保留最新一次的部署容器,历史的流程自动结束。
结语
测试环境这种由于应用间依赖、一个应用部署导致另一个应用功能不能正常验证、代码或配置问题长时间定位不到导致服务不可用等多种场景影响开发效率,使用部署加速后,发布系统将帮助构建一个快速、稳定的测试环境,提高研发效率,提升开发幸福感。