这篇文章介绍一下蓝绿部署以及使用nginx如何最简单地模拟一下蓝绿部署的方式

蓝绿部署

蓝绿部署的重点在于如下特点
1. 蓝色版本和绿色版本同时存在
2. 实际运行的环境为蓝或则绿,只能为其中之一,通过开关控制

优点和缺点分析:优点在于它的速度和回滚。而缺点也显而易见。可以快速回滚是因为有两套环境同时存在的缘故,所以复杂度和需要的资源会增多,因为其有两套环境。
另外虽然速度有所提高,但是在实现的过程中,开关的控制,无论多快的切换速度,如果不结合其他的技术,还是无法做到完全无缝切换。

模拟蓝绿部署

接下来我们使用nginx的upstream来简单模拟一下蓝绿部署的场景。具体场景如下, 当前活跃的是蓝色版本,通过调整nginx设定,将绿色版本设定为当前活跃版本。

版本 说明
router 用户通过http://localhost:8090来访此种部署下的微服务
蓝色版本 当前活跃的为蓝色版本,在7001端口提供服务,提示信息为“Hello blue/green service: v1 in 7001”
绿色版本 即将发布的绿色版本,在7002端口提供服务,提示信息为“Hello blue/green service: v2 in 7002”

事前准备

事前在7001/7002两个端口分别启动两个服务,用于显示不同信息,为了演示方便,使用tornado做了一个镜像,通过docker容器启动时传递的参数不同用于显示服务的不同。

docker run -d -p 7001:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello blue/green service: v1 in 7001"
docker run -d -p 7002:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello blue/green service: v2 in 7002"

执行日志

[root@kong ~]# docker run -d -p 7001:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello blue/green service: v1 in 7001"
70c74dc8e43d5635983f7240deb63a3fc0599d5474454c3bc5197aa5c0017348
[root@kong ~]# docker run -d -p 7002:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello blue/green service: v2 in 7002"
6c5c2ea322d4ac17b90feefb96e3194ec8adecedaa4c944419316a2e4bf07117
[root@kong ~]# curl http://192.168.163.117:7001
Hello, Service :Hello blue/green service: v1 in 7001
[root@kong ~]# curl http://192.168.163.117:7002
Hello, Service :Hello blue/green service: v2 in 7002
[root@kong ~]#

启动nginx

[root@kong ~]# docker run -p 9080:80 --name nginx-blue-green -d nginx
d3b7098c44890c15918dc47616b67e5e0eb0da7a443eac266dbf26d55049216a
[root@kong ~]# docker ps |grep nginx-blue-green
d3b7098c4489        nginx                      "nginx -g 'daemon ..."   10 seconds ago       Up 9 seconds        0.0.0.0:9080->80/tcp     nginx-blue-green
[root@kong ~]# 

nginx代码段

准备如下nginx代码段将其添加到nginx的/etc/nginx/conf.d/default.conf中, 模拟方式很简单,通过down来表示流量为零(nginx中无法将weight设置为零),开始的时候100%的流量都发到蓝色版本。

http {
upstream nginx_blug_green {server 192.168.163.117:7001 weight=100;server 192.168.163.117:7002 down;
}
server {listen       80;server_name  www.liumiao.cn 192.168.163.117;location / {proxy_pass http://nginx_blug_green;}}

修改default.conf的方法

可以通过在容器中安装vim达到效果,也可以在本地修改然后通过docker cp传入,或者直接sed修改都可。如果在容器中安装vim,使用如下方式即可

[root@kong ~]# docker exec -it nginx-lb sh
# apt-get update
...省略
# apt-get install vim
...省略

修改前

# cat default.conf
server {listen       80;server_name  localhost;#charset koi8-r;#access_log  /var/log/nginx/host.access.log  main;location / {root   /usr/share/nginx/html;index  index.html index.htm;}#error_page  404              /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    fastcgi_index  index.php;#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;#    include        fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {#    deny  all;#}
}#

修改后

# cat default.conf
upstream nginx_blug_green {server 192.168.163.117:7001 weight=100;server 192.168.163.117:7002 down;
}server {listen       80;server_name  www.liumiao.cn 192.168.163.117;#charset koi8-r;#access_log  /var/log/nginx/host.access.log  main;location / {#root   /usr/share/nginx/html;#index  index.html index.htm;proxy_pass http://nginx_blug_green;}#error_page  404              /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    fastcgi_index  index.php;#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;#    include        fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {#    deny  all;#}
}#

重新加载nginx设定

# nginx -s reload
2018/05/28 04:39:47 [notice] 321#321: signal process started
# 

确认结果

10次调用全部输出的都是v1 in 7001

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]
> do
> curl http://localhost:9080
> let cnt++
> done
Hello, Service :Hello blue/green service: v1 in 7001
Hello, Service :Hello blue/green service: v1 in 7001
Hello, Service :Hello blue/green service: v1 in 7001
Hello, Service :Hello blue/green service: v1 in 7001
Hello, Service :Hello blue/green service: v1 in 7001
Hello, Service :Hello blue/green service: v1 in 7001
Hello, Service :Hello blue/green service: v1 in 7001
Hello, Service :Hello blue/green service: v1 in 7001
Hello, Service :Hello blue/green service: v1 in 7001
Hello, Service :Hello blue/green service: v1 in 7001
[root@kong ~]#

蓝绿部署:切换到绿色版本

通过调整default.conf的weight,然后执行nginx -s reload的方式,在不停止nginx服务的方式下可动态的切换到绿色版本,目标将会将全部的流量都输出v2 in 7002

修改default.conf的方法

只需要将upstream中的server的权重做如下调整:

upstream nginx_blug_green {server 192.168.163.117:7001 down;server 192.168.163.117:7002 weight=100;
}

重新加载nginx设定

# nginx -s reload
2018/05/28 05:01:28 [notice] 330#330: signal process started
# 

确认结果

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl http://localhost:9080; let cnt++; done
Hello, Service :Hello blue/green service: v2 in 7002
Hello, Service :Hello blue/green service: v2 in 7002
Hello, Service :Hello blue/green service: v2 in 7002
Hello, Service :Hello blue/green service: v2 in 7002
Hello, Service :Hello blue/green service: v2 in 7002
Hello, Service :Hello blue/green service: v2 in 7002
Hello, Service :Hello blue/green service: v2 in 7002
Hello, Service :Hello blue/green service: v2 in 7002
Hello, Service :Hello blue/green service: v2 in 7002
Hello, Service :Hello blue/green service: v2 in 7002
[root@kong ~]#

nginx应用:使用nginx进行蓝绿部署相关推荐

  1. 使用级联功能实现蓝绿部署和金丝雀发布

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者:米开朗基杨 来源:公众号「云原生实验室」 上篇文章介绍了 Contour 分布式架构的 ...

  2. 首富带你畅谈:蓝绿部署、滚动发布、灰度发布/金丝雀发布

    首富带你畅谈:蓝绿部署.滚动发布.灰度发布/金丝雀发布 笔者: 张首富 时间: 2019-01-24晚 QQ群: 895291458 博客地址: www.zhangshoufu.com 根据2018年 ...

  3. 蓝/绿部署 VS 金丝雀部署

    在云端或数据中心部署新版本的最佳方式 在生产环境中更新和配置应用程序通常是件令人望而生畏的事.面对如此多的可用选项,应如何选择最适合你的用例的部署策略? 部署策略用于升级或配置正在运行的应用程序.在下 ...

  4. 灰度发布、蓝绿部署、金丝雀都是啥?

    目录 滚动部署 蓝绿发布 为什么还需要蓝绿 金丝雀发布(canary) 金丝雀和蓝绿的对比 灰度发布 A/B Test 实现 kubernetes istio spring cloud 网关 参考 滚 ...

  5. Kubernetes部署策略:重建、滚动更新、蓝绿部署、金丝雀部署

    Kubernetes原生支持重建.滚动更新两种部署策略.通过修改Service的label,切换流量转发可以实现蓝绿部署.金丝雀部署. 部署前的准备 1.需要有一个k8s集群.没有可查看此博客 htt ...

  6. Contour 学习笔记(二):使用级联功能实现蓝绿部署和金丝雀发布

    上篇文章介绍了 Contour 分布式架构的工作原理,顺便简单介绍了下 IngressRoute 的使用方式.本文将探讨 IngressRoute 更高级的用法,其中级联功能是重点. 1. Ingre ...

  7. 灰度(金丝雀)发布、蓝绿部署、滚动发布

    概念 一.灰度(金丝雀)发布 定义 灰度发布又叫金丝雀发布,只升级部分服务,即让一部分用户继续用老版本,一部分用户开始用新版本,如果用户对新版本没什么意见,那么逐步扩大范围,把所有用户都迁移到新版本上 ...

  8. 微服务部署:蓝绿部署、滚动部署、灰度部署(金丝雀部署)、功能开关发布

    简介 产品或项目不可能一步到位,一次性推向用户,故而有版本的存在.在app版本更新或者项目迭代的过程中,不可避免需要发布.发布就是部署:部署就是修改:修改则意味着风险. 目前有很多用于部署的技术,本文 ...

  9. 微服务部署:蓝绿部署、滚动部署、灰度部署(金丝雀部署)

    简介 产品或者项目不可能一步到位,一次性推向用户,故而有版本的存在.在app版本更新或者项目迭代的过程中,不可避免需要发布.发布就是部署/重新部署:部署就是修改:修改则意味着风险. 目前有很多用于部署 ...

最新文章

  1. Hadoop集群搭建(一:集群安装及网络环境配置)
  2. [分享]2007年创业给我们的提示
  3. Leetcode 264. 丑数 II 解题思路及C++实现
  4. javaandroid知识点汇总整理(不定期更新)
  5. 科学家利用计算机模型,科学家尝试利用计算机模拟整个宇宙的演化
  6. 进程间的通信之1-----管道
  7. Linux系统如何连接和上传文件到服务器上
  8. java 读取文件 二进制_JAVA中读取文件(二进制,字符)内容的几种方法总结
  9. 处理机调度的概念,层次
  10. OPNET网络仿真分析-1.6、OPNET软件使用
  11. 解决:android源码同步repo sync 时出现的fatal:duplicate path错误
  12. 项目做PC端页面采用rem适配的使用步骤
  13. js return加分号_JavaScript 语句后应该加分号么?
  14. C++默认参数(缺省参数)应该写在哪里,声明还是定义里
  15. 详解:淘宝大秒杀系统是如何设计的?
  16. 【分享贴】PCB设计思路
  17. 同样是VPS,为什么RAKsmart更受欢迎
  18. python定量城市研究_Python定量城市研究实战
  19. Grafana 汉化
  20. 手机app 与pc 软件测试区别,1,web测试,Android测试,Ios测试的共同点与

热门文章

  1. ajax封装及其数据加密
  2. CentOS最小化安装后IP的配置(图形手动及DHCP获取IP地址)
  3. 2018.9.16考试总结
  4. python-简易反恐精英
  5. 唯品会接口获取商品详情数据
  6. iphone 恢复出厂设置方法
  7. 腾讯智影+IDM进行数字人制作(无限使用)
  8. oracle 新增列到指定位置,oracle添加列到指定位置
  9. AtomicInteger如何保证线程安全?
  10. 服务器需要支持5g,5G时代需要什么样的服务器和数据中心?| MWC 2019