WEB服务如何平滑的上下线

1,465 阅读5分钟

背景

我们用nginx做负载均衡, 业务访问某服务的时候, 统一走nginx代理集群, 然后代理集群根据制定的路由及轮询策略,将请求路由到后端服务集群上。

通过nginx健康检查和错误重试机制我们能保证动态服务在发布变更时的访问能够正常返回,但是为了提升服务可用性,不丢失任何一个请求,我们联合内部系统对nginx代理层及发布系统执行逻辑进行优化,保证服务变更做到更加平滑。

本文主要分享转转如何解决WEB服务如何平滑变更的问题。

Nginx配置管理

转转NGINX代理层集群系统架构

nginx 管理

Nginx 配置按照更新频率主要分为4个模块:

  • 基本配置信息、event、http 属于更新频率最低的main-conf
  • 更新频率极低的证书
  • server、location 属于更新频率较低的server-conf
  • 更新频率超高的upstream配置

Nginx 配置修改发布的大致流程:

  1. 在管理平台修改nginx配置
  2. 启动docker 拉取对应配置
  3. 测试配置是否符合预期
  4. 发布配置到线上集群
  5. 线上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集群、并且在保证不丢失任何请求的情况下来更新服务。

服务路由策略上线&更新

  1. 在一个新服务上线或既有服务路由逻辑发生变更的时候,运维会在nginx上新增server,并关联对应的upstream。
  2. 服务部署好并启动,在启动完成后,发布系统会调用nginx的上线接口,将服务IP新增或者更新到upstream中,服务就可以提供访问。

nginx 上线

服务更新

假如我们现在有一个服务需要更新,则执行以下步骤:

  1. 在发布系统,将一个服务设为下线,此时发布系统会调用nginx的下线接口,将指定服务器的IP设置为下线。
  2. 在nginx摘除指定节点后,回调发布系统,就可以开始更新服务站点。
  3. 更新完毕后,再设为上线,此时发布系统会调用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),更多干货实践,欢迎交流分享~