Nginx灰度升级实现说明

脱发程序员 2020-10-23 23:13:51 ⋅ 944 阅读

基础介绍

下文分别从名词解释、灰度升级的作用、灰度升级方案3个方面展开介绍:

1.名词解释

灰度升级:灰度升级是一种升级时候的平滑切换,当有些服务器的客户端要进行升级,可以只对其中一个客户端升级并测试,确保程序无误后再全局升级。也就是说所有服务器可以不同步更新升级,首次只是对一个地区的服务器进行更新升级,待升级完成确保无误后,再对其他地区的服务器进行统一的更新升级。

灰度期:灰度发布从开始到结束的这一段时间,被称为灰度期。

Nginx:Nginx不仅是一个十分轻量级的HTTP服务器,也是一个高性能的HTTP和反向代理服务器,同时还是一个IMAP/POP3/SMTP代理服务器。目前很多国内网站采用Nginx作为Web服务器,如国内知名的新浪、163、腾讯、Discuz、豆瓣等。本次灰度升级就是通过调整Nginx配置文件的方式实现。

2.灰度作用

1.及早获得用户的意见反馈,完善产品功能,提升产品质量;

2.让用户参与产品测试,加强与用户的互动;

3.降低产品升级所影响的用户范围,降低升级风险,避免升级事故。

3.升级方案

实现思路方向可分为两种,一种是在代码中实现,一种是在接入层中实现。灵活的灰度方案一般需要在接入层实现,也就是自定义负载均衡策略实现。本篇文档介绍的就是这种在接入层实现,使用Nginx实现负载均衡的策略。

> > > >实现思路

  • 在代码中

一套线上环境,在代码中做开关,对于不同的用户走不同的逻辑

优点:灵活,粒度细;一套代码(环境)运维成本低;

缺点:灰度逻辑侵入代码。

  • 在接入层

多套(隔离的)线上环境,接入层针对不同用户转发到不同的环境中

优点:无需或少量侵入代码,风险小;

缺点:多套线上环境,运维成本高。

  • 接入模式

1.在nginx层实现,例如通过IP地址判断,部分IP段(如办公环境的IP地址段)的请求会引入到灰度环境;

2.在网关层实现(spring-cloud-zuul);

3.dubbo的灰度,项目中如果使用dubbo,有可能会需要dubbo服务的灰度实现。

2灰度框架

下面介绍灰度升级的整体架构流程,方便大家快速理解。

1.整体框架

灰度发布只升级部分服务,即让一部分用户继续用老版本(下图绿框部分),一部分用户开始用新版本(下图蓝框部分),如果事业用新版本的用户没有意见反馈,接下来就会逐步扩大使用范围,直到将所有用户都迁移到新版本。

Nginx灰度升级实现说明

 

2.项目架构

在本次项目中,灰度升级包含两个部分,一个是现有环境至云平台正式环境的灰度升级,另一个是云平台发布环境至云平台正式环境的灰度升级,两种情况下升级的主要配置及原理如下:

> > > >现有与云平台正式

Nginx灰度升级实现说明

 

说明:

1.用户A登录服务,根据ip网段分配到现有环境;

2.用户B登录服务,根据ip网段分配到云平台正式环境。

> > > >云平台发布与正式

Nginx灰度升级实现说明

 

说明:

1.用户A登录服务,根据ip网段分配到云平台发布环境;

2.用户B登录服务,根据ip网段分配到云平台正式环境。

配置说明

1.现有与云平台正式

现有环境和云平台环境灰度升级实际为调整Nginx配置添加两个upsteamcluster,一套配置为原有CentOS部署的运行环境,另一套配置为云平台部署的运行环境,在Server监听的过程中按照IP段进行配置判断,划分IP区间,实现定义分割IP区间。根据IP区间实现某一段IP访问的为原有CentOS环境,另一端访问的IP区间则为云平台部署环境,运行一段时间后调整为整体IP区间全部访问云平台的模式。

关键配置如下:

定义两个upsteamcluster,一套配置为原有CentOS部署的运行环境,另一套配置为云平台部署的运行环境

Nginx灰度升级实现说明

 

在Server监听的过程中按照IP段进行配置判断,划分IP区间,根据IP区间实现某一段IP访问的为原有CentOS环境,另一端访问的IP区间则为云平台部署环境。

Nginx灰度升级实现说明

 

说明:

1)set $group cluster_classic:设置proxy_pass默认值为“cluster_classic”,现有环境;

2)set $environmentType "classic:设置环境类型默认值为"classic",现有环境;

3)set $ingressPath "/":设置proxy_cookie_path路径默认值为“/”,cookie地址保持不变;

4)if ($remote_addr ~ "18.0.9.*"):根据ip是否在这个网段,如果在就走云平台正式环境;

5)set $group cluster_cloud:proxy_pass重新赋值为“cluster_cloud”,云平台正式环境;

6)set $environmentType "cloud_product":将环境类型重新设置为"cloud_product",云平台正式环境;

7)if ($environmentType = "cloud_product"):判断是否是云平台正式环境;

8)set $ingressPath "/S01/Product/ESB/":设置proxy_cookie_path路径;

9)rewrite (/|$)(.*) $ingressPath$2 break:设置重定向路径;

10)proxy_pass http://$group:proxy_pass引用$group;

11)proxy_cookie_path $ingressPath /:proxy_cookie_path引用$ingressPath。

2.云平台发布与正式

云平台内部发布与生产的回复升级,原理与CentOS升级至云平台模式相同,不同的是云平台内部灰度升级是依据访问路径进行区分,核心配置如下:

Nginx灰度升级实现说明

 

说明:

1)set $ingressPath "/S01/Release/ESB/":设置proxy_cookie_path路径默认值发布路径;

2)if ($remote_addr ~ "18.0.8.*"):根据ip是否在这个网段选择访问环境,如果在就走云平台正式环境;

3)set $ingressPath "/S01/Product/ESB/":proxy_cookie_path路径重新赋值为正式路径;

4)rewrite (/|$)(.*) $ingressPath$2 break:设置重定向路径;

5)proxy_cookie_path $ingressPath /:proxy_cookie_path引用$ingressPath。

3.传统与云区别说明

现有环境和云平台正式环境与云平台正式环境和发布环境灰度升级配置的主要区别如下:

1)定义upstream的访问地址不同,一个是云平台部署地址,云平台地址为动态替换proxy_pass;另一个是现有CentOS部署环境地址,现有部署无需动态替换proxy_pass;

2)云平台与现有部署环境中的proxy_pass引用upstream不同proxy_cookie_path设置的地址不同,现有部署为“/”,不转换cookie路径,云平台需要转换为内部Ingress路径。

心得总结

灰度升级可以比较有效地解决服务升级对用户的影响,之前一直使用调整nginx配置进行全量更新升级,灰度升级方式并没有被使用,通过本次在项目中使用灰度升级方式学习到了许多新的知识。

1.能力欠缺

在开始配置nginx时,想要使其支持根据IP进行分流,需要设置变量的方式,而其中有一处配置问题一直没有攻克,尝试多种方式依旧没有解决。在尝试过程中感受到了自己在网络层面、代理方面能力的不足,真是有些力不从心,最后还是在公司领导的帮助下解决的,后续不仅要对底层代码加深研究,也要对上层逻辑深入了解。

2.知识收获

在这次使用Nginx实现灰度升级过程中,学习到了许多新的知识,同时也巩固了已经积累的知识。对Nginx中的变量更加熟知,掌握了在Nginx里script的常规用法、变量的使用范围和配置重定向路径的方法。

3.个人总结

升级策略不仅仅只有灰度发布一种,还有滚动发布和蓝绿部署。本次我们选择灰度升级的原因是这种方式的影响用户少、配置简单。后续会继续了解滚动发布和蓝绿部署的优缺点及配置方法,融入到产品项目体系中。

团队作战不仅需要相互协作,自己也要多尝试多思考,不要灰心不要轻言放弃,领导的指点为我提供了解决思路,这些经历也让我不断成熟,在以后处理各种问题时会考虑得更加全面。基于K8S云平台来构建集成开发解决方案、开发集成方案未来是数通畅联的主打方式,K8S云平台管理中心UMC是公司SOA应用集成、数据治理分析套件的管理底座,融入了大量平台产品与集成项目结合的最佳实践和管理思想,也是构建集成中台、数据中台、应用中台的利器,未来考虑陆续输出云平台相关文档。

 


全部评论: 0

    我有话说:

    Nginx服务器高性能优化--轻松实现10万并发访问量

    作者:章为忠学架构https://www.toutiao.com/i6804346550882402828 前面讲了如何配置Nginx虚拟主机,如何配置服务日志等很多基础的内容,大家可以去这里看看

    精品推荐:nginx常用配置总结(实战版)

    Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。

    官网升级通知

    为了让您更好的使用平台,我们将在明天对平台进行升级,敬请谅解。

    Nginx架构详解(二):nginx反向代理配置

    上次文章中我们已经安装了Nginx,这次就写一下如何配置反向代理。

    Nginx架构详解:nginx 的安装和配置

    Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。

    采集Nginx日志的几种方式

    来源 | https://dwz.cn/ofiCxRK0 由于nginx功能强大,性能突出,越来越多的web应用采用nginx作为http和反向代理的web服务器。而nginx的访问日志不管是做

    nginx 1.19.7 主线版发布

    nginx 1.19.7 主线版已发布,此版本带来了部分变更和新特性,以及 bugfix,具体如下: 变更:HTTP/2 中对连接的处理经过修改可更好地匹配 HTTP/1.x;"http2

    NGINX Unit 1.22 发布,动态 Web 应用服务器

    NGINX Unit 是一个多语言应用服务器、反向代理和静态文件服务器,可用于类 Unix 系统。它是由 nginx 团队成员从头开始构建的,并且在运行时具有很高的效率且可全方位配置。 Unit

    Nginx Unit 1.21.0 发布,动态 Web 应用服务器

    Nginx Unit 1.21.0 已发布,更新内容除了常规的 bugfix 外,还增加了部分新特性,例如支持条件匹配的 PCRE 和多线程请求处理等。 因此,开发者现在可以调整每个应用程序进程中

    单点登录原理与简单实现

    产生关联,这个过程用下图说明,三次请求/响应对之...

    Springboot项目redisTemplate实现轻量级消息队列

    redisTemplate实现轻量级消息队列,代码奉上

    架构实战篇(十七):Spring Boot Assembly 整合 thymeleaf

    如何让服务器上的 sprig boot 项目升级变的方便快捷

    SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证

    一.说明 SpringSecurity是一个用于Java 企业级应用程序的安全框架,主要包含用户认证和用户授权两个方面.相比较Shiro而言,Security功能更加的强大,它可以很容易地扩展以满足

    SpringBoot+zk+dubbo架构实践(一):本地部署zookeeper

    SpringBoot+zk+dubbo架构实践系列实现目标:自己动手搭建微服务架构

    微信小程序-template使用:实现购物车商品数量加减功能

    上一篇我们实现了购物车功能,里面有用到template模板功能来实现购物车商品数量加减和价格计算功能......

    微信小程序实现商品数量加减

    这是一个用微信小程序原生代码实现的数量加减demo,主要是用于商品购物车或者商品详情修改数量使用