WEB 服务如何平滑的上下线
背景
我们用 nginx 做负载均衡, 业务访问某服务的时候, 统一走 nginx 代理集群, 然后代理集群根据制定的路由及轮询策略,将请求路由到后端服务集群上。
通过 nginx 健康检查和错误重试机制我们能保证动态服务在发布变更时的访问能够正常返回,但是为了提升服务可用性,不丢失任何一个请求,我们联合内部系统对 nginx 代理层及发布系统执行逻辑进行优化,保证服务变更做到更加平滑。
本文主要分享转转如何解决 WEB 服务如何平滑变更的问题。
Nginx 配置管理
转转 NGINX 代理层集群系统架构
Nginx 配置按照更新频率主要分为 4 个模块:
基本配置信息、event、http 属于更新频率最低的 main-conf
更新频率极低的证书
server、location 属于更新频率较低的 server-conf
更新频率超高的 upstream 配置
Nginx 配置修改发布的大致流程:
在管理平台修改 nginx 配置
启动 docker 拉取对应配置
测试配置是否符合预期
发布配置到线上集群
线上 nginx 集群使用 nginx reload 使配置生效
nginx 分 master 进程和 worker 进程,nginx 会在 reload 时把 worker 设置为 shutting down 状态,不接受新的请求,然后启动新的 worker 进程接收处理新的请求,shutting down 的 worker 直至处理完当前连接之后优雅退出。可以保证不会影响 reload 那一刻的业务。
对于前三种配置,都可以使用这个发布流程。
但是对于 upstream 配置,容器 IP 变更、服务升级、服务扩容如果都修改 nginx 配置然后 reload,这种频繁变动 Nginx 配置进行 reload,会造成 nginx 有很多 shutting down 的 worker,可能导致 nginx 集群负载突增,降低 nginx 集群服务能力,造成响应能力波动甚至导致集群雪崩。
基于 Nginx dyups 模块的动态上下线
鉴于以上这些情况,我们需要一个工具,这个工具首先解决服务上下线和动态扩容问题,也就是说在不需要 reload 或重启 nginx 集群、并且在保证不丢失任何请求的情况下来更新服务。
服务路由策略上线 &更新
在一个新服务上线或既有服务路由逻辑发生变更的时候,运维会在 nginx 上新增 server,并关联对应的 upstream。
服务部署好并启动,在启动完成后,发布系统会调用 nginx 的上线接口,将服务 IP 新增或者更新到 upstream 中,服务就可以提供访问。
服务更新
假如我们现在有一个服务需要更新,则执行以下步骤:
在发布系统,将一个服务设为下线,此时发布系统会调用 nginx 的下线接口,将指定服务器的 IP 设置为下线。
在 nginx 摘除指定节点后,回调发布系统,就可以开始更新服务站点。
更新完毕后,再设为上线,此时发布系统会调用 nginx 的上线接口,将指定服务器的 IP 设置为上线。
服务运行期间
在服务运行过程中,会有一个健康检测的服务对所有提供服务的站点进行健康检测,一旦检测到有问题,会将对应节点状态设置为 down。
遇到的问题
ngx_http_dyups_module 提供了对整个 upstream 进行新增,删除的方法。但是发布系统是基于指定节点上下线的,需要进行处理。
ngx_http_dyups_module 动态修改的配置存放在 Nginx 内存中的,如果重载 Nginx 配置,这些数据就会丢失。
server-conf 发布的时候,在 reload 前需要保证 Nginx 内存中 upstream 配置和文件中一致。
落地实践
通过队列将发布系统基于指定节点的上下线转换为全量 upstream。
通过锁和 flush 保证 nginx 内存中的 upstream 和文件一致,当 Nginx 重载配置时,它会从 upstream 文件加载最新的数据。
我们对 dyups 模块的接口进行了改造,支持 json 格式,且支持 Web 化管理 Upstream 节点的权重。对 nginx reload 进行了封装,保证 reload 前进行 upstream 内存和文件的同步。
总结
Nginx 是一个 web 服务器也可以用来做负载均衡及反向代理使用,目前使用最多的就是负载均衡,公司使用 Nginx 反向代理集群对基于 HTTP 协议的 WEB 服务及接口流量进行流量转发和调度,实现统一规范的流量分配调度管理、业务负载均衡、服务高可用等功能。
ngx_http_dyups_module 是 nginx 的一个优秀插件,让我们可以在不需要重启 nginx 的基础上,动态修改 nginx 的配置。
希望通过本文能给各位读者在做 http 上下线过程时提供参考。
有任何问题均在可在公众号对话框中回复进一步交流。
转转研发中心及业界小伙伴们的技术学习交流平台,定期分享一线的实战经验及业界前沿的技术话题。
关注公众号「转转技术」(综合性)、「大转转 FE」(专注于 FE)、「转转 QA」(专注于 QA),更多干货实践,欢迎交流分享~
评论