美文网首页技术架构
互联网产品的3种发布策略

互联网产品的3种发布策略

作者: 燕京博士 | 来源:发表于2018-06-12 13:55 被阅读372次

    成熟的互联网产品用户数量庞大,如果采用全量发布的话不论对于开发运维团队有着未知的风险,而且产品以及运营团队也同样面临的用户体验的巨大挑战。目前常见的发布策略有蓝绿发布、金丝雀发布(灰度发布)、AB测试这几种,在国内的开发者中,对这几个概念有独立的理解。蓝绿发布通常被大家成为热部署;金丝雀发布在国内的名头完全被他的变种发布方式盖过了,主要是灰度发布与AB测试,下面来详细的为大家解释一下他们之间的异同。

    蓝绿发布

    在发布的过程中用户无感知服务的重启,通常情况下是通过新旧版本并存的方式实现,也就是说在发布的流程中,新的版本和旧的版本是相互热备的,通过切换路由权重的方式(非0即100)实现不同的应用的上线或者下线。

    产品灰度发布

    灰度发布工具

    金丝雀发布

    通过在线上运行的服务中,新加入少量的新版本的服务,然后从这少量的新版本中快速获得反馈,根据反馈决定最后的交付形态。

    app灰度发布

    灰度发布

    灰度发布是通过切换线上并存版本之间的路由权重,逐步从一个版本切换为另一个版本的过程。虽然有很多人包括专业大牛认为灰度发布与金丝雀发布是等同的,但是在具体的操作和目的上面个还是有些许差别的。金丝雀发布更倾向于获取快速的反馈,而灰度发布更倾向于从一个版本到另一个版本平稳的切换。

    AB测试

    AB测试和灰度发布非常像,但是从发布的目的上,可以简单的区分灰度发布与AB测试,AB测试侧重的是从A版本或者B版本之间的差异,并根据这个结果进行决策。最终选择一个版本进行部署。因此和灰度发布相比,AB测试更倾向于去决策,和金丝雀发布相比,AB测试在权重和流量的切换上更灵活。

    产品灰度发布技巧

    吆喝科技:国内唯一同时支持前端(Web/H5、iOS、Android)及后端(Node.js、PHP、Java 等) AB 测试服务的专业 SaaS 平台。支持线上灰度发布、多维度数据统计分析、科学的流量分配系统、一键发布新版本无需应用市场审核、定向测试。

    用数据帮助用户优化产品,提升转化、留存和你想要的一切。 AppAdhoc 用数据验证最佳方案,提高产品设计、研发、运营和营销效率,降低产品决策风险。

    在有关微服务、DevOps、Cloud-native、系统部署等的讨论中,蓝绿部署、A/B 测试、灰度发布、滚动发布、红黑部署等概念经常被提到,它们有什么区别呢?通过搜索相关资料,做一个简单的辨析,如下:
    一、蓝绿部署(Blue/Green Deployment)
    过去的 10 年里,很多公司都在使用蓝绿部署(发布)来实现热部署,这种部署方式具有安全、可靠的特点。蓝绿部署虽然算不上“ Sliver Bullet”,但确实很实用。
    蓝绿部署是最常见的一种0 downtime部署的方式,是一种以可预测的方式发布应用的技术,目的是减少发布过程中服务停止的时间。蓝绿部署原理上很简单,就是通过冗余来解决问题。通常生产环境需要两组配置(蓝绿配置),一组是active的生产环境的配置(绿配置),一组是inactive的配置(蓝绿配置)。用户访问的时候,只会让用户访问active的服务器集群。在绿色环境(active)运行当前生产环境中的应用,也就是旧版本应用version1。当你想要升级到version2 ,在蓝色环境(inactive)中进行操作,即部署新版本应用,并进行测试。如果测试没问题,就可以把负载均衡器/反向代理/路由指向蓝色环境了。随后需要监测新版本应用,也就是version2 是否有故障和异常。如果运行良好,就可以删除version1 使用的资源。如果运行出现了问题,可以通过负载均衡器指向快速回滚到绿色环境。
    蓝绿部署的优点:
    这种方式的好处在你可以始终很放心的去部署inactive环境,如果出错并不影响生产环境的服务,如果切换后出现问题,也可以在非常短的时间内把再做一次切换,就完成了回滚。而且同时在线的只有一个版本。蓝绿部署无需停机,并且风险较小。
    (1) 部署版本1的应用(一开始的状态),所有外部请求的流量都打到这个版本上。
    (2) 部署版本2的应用,版本2的代码与版本1不同(新功能、Bug修复等)。
    (3) 将流量从版本1切换到版本2。
    (4) 如版本2测试正常,就删除版本1正在使用的资源(例如实例),从此正式用版本2。
    从过程不难发现,在部署的过程中,应用始终在线。并且,新版本上线的过程中,并没有修改老版本的任何内容,在部署期间,老版本的状态不受影响。这样风险很小,并且,只要老版本的资源不被删除,理论上,可以在任何时间回滚到老版本。
    蓝绿部署的弱点:
    使用蓝绿部署需要注意的一些细节包括:
    1、当切换到蓝色环境时,需要妥当处理未完成的业务和新的业务。如果数据库后端无法处理,会是一个比较麻烦的问题。
    2、有可能会出现需要同时处理“微服务架构应用”和“传统架构应用”的情况,如果在蓝绿部署中协调不好这两者,还是有可能导致服务停止;
    3、需要提前考虑数据库与应用部署同步迁移/回滚的问题。
    4、蓝绿部署需要有基础设施支持。
    5、在非隔离基础架构( VM 、 Docker 等)上执行蓝绿部署,蓝色环境和绿色环境有被摧毁的风险。
    6、另外,这种方式不好的地方还在于冗余产生的额外维护、配置的成本,以及服务器本身运行的开销。
    蓝绿部署适用的场景:
    1、不停止老版本,额外搞一套新版本,等测试发现新版本OK后,删除老版本。
    2、蓝绿发布是一种用于升级与更新的发布策略,部署的最小维度是容器,而发布的最小维度是应用。
    3、蓝绿发布对于增量升级有比较好的支持,但是对于涉及数据表结构变更等等不可逆转的升级,并不完全合适用蓝绿发布来实现,需要结合一些业务的逻辑以及数据迁移与回滚的策略才可以完全满足需求。

    A/B 测试(A/B Testing)
    A/B 测试跟蓝绿部署完全是两码事。A/B 测试是用来测试应用功能表现的方法,例如可用性、受欢迎程度、可见性等等。 蓝绿部署的目的是安全稳定地发布新版本应用,并在必要时回滚。
    A/B 测试与蓝绿部署的区别在于, A/B 测试目的在于通过科学的实验设计、采样样本代表性、流量分割与小流量测试等方式来获得具有代表性的实验结论,并确信该结论在推广到全部流量可信。
    A/B 测试和蓝绿部署可以同时使用。

    灰度发布/金丝雀发布
    灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。灰度发布是增量发布的一种类型,灰度发布是在原有版本可用的情况下,同时部署一个新版本应用作为“金丝雀”(金丝雀对瓦斯极敏感,矿井工人携带金丝雀,以便及时发发现危险),测试新版本的性能和表现,以保障整体系统稳定的情况下,尽早发现、调整问题。
    灰度发布/金丝雀发布由以下几个步骤组成:
    1、准备好部署各个阶段的工件,包括:构建工件,测试脚本,配置文件和部署清单文件。
    2、从负载均衡列表中移除掉“金丝雀”服务器。
    3、升级“金丝雀”应用(排掉原有流量并进行部署)。
    4、对应用进行自动化测试。
    5、将“金丝雀”服务器重新添加到负载均衡列表中(连通性和健康检查)。
    6、如果“金丝雀”在线使用测试成功,升级剩余的其他服务器。(否则就回滚)
    灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
    灰度发布/金丝雀部署适用的场景:
    1、不停止老版本,额外搞一套新版本,不同版本应用共存。
    2、灰度发布中,常常按照用户设置路由权重,例如90%的用户维持使用老版本,10%的用户尝鲜新版本。
    3、经常与A/B测试一起使用,用于测试选择多种方案。AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。
    趣闻 :
    金丝雀部署(同理还有金丝雀测试),“金丝雀”的由来:17世纪,英国矿井工人发现,金丝雀对瓦斯这种气体十分敏感。空气中哪怕有极其微量的瓦斯,金丝雀也会停止歌唱;而当瓦斯含量超过一定限度时,虽然鲁钝的人类毫无察觉,金丝雀却早已毒发身亡。当时在采矿设备相对简陋的条件下,工人们每次下井都会带上一只金丝雀作为“瓦斯检测指标”,以便在危险状况下紧急撤离。

    滚动发布(rolling update)
    滚动发布,一般是取出一个或者多个服务器停止服务,执行更新,并重新将其投入使用。周而复始,直到集群中所有的实例都更新成新版本。这种部署方式相对于蓝绿部署,更加节约资源——它不需要运行两个集群、两倍的实例数。我们可以部分部署,例如每次只取出集群的20%进行升级。
    这种方式也有很多缺点,例如:
    (1) 没有一个确定OK的环境。使用蓝绿部署,我们能够清晰地知道老版本是OK的,而使用滚动发布,我们无法确定。
    (2) 修改了现有的环境。
    (3) 如果需要回滚,很困难。举个例子,在某一次发布中,我们需要更新100个实例,每次更新10个实例,每次部署需要5分钟。当滚动发布到第80个实例时,发现了问题,需要回滚。此时,脾气不好的程序猿很可能想掀桌子,因为回滚是一个痛苦,并且漫长的过程。
    (4) 有的时候,我们还可能对系统进行动态伸缩,如果部署期间,系统自动扩容/缩容了,我们还需判断到底哪个节点使用的是哪个代码。尽管有一些自动化的运维工具,但是依然令人心惊胆战。
    并不是说滚动发布不好,滚动发布也有它非常合适的场景。

    红黑部署(Red-Black Deployment)
    这是Netflix采用的部署手段,Netflix的主要基础设施是在AWS上,所以它利用AWS的特性,在部署新的版本时,通过AutoScaling Group用包含新版本应用的AMI的LaunchConfiguration创建新的服务器。测试不通过,找到问题原因后,直接干掉新生成的服务器以及Autoscaling Group就可以,测试通过,则将ELB指向新的服务器集群,然后销毁掉旧的服务器集群以及AutoScaling Group。
    红黑部署的好处是服务始终在线,同时采用不可变部署的方式,也不像蓝绿部署一样得保持冗余的服务始终在线。

    大家好,给大家介绍一下,这是帮助大家率先上手尝试Rancher 2.0的神器 @Rancher 2.0快速上手指南

    内容导读

    • 准备一台Linux主机
    • 启动Rancher服务器,进入Rancher UI
    • 如何在Rancher UI下添加一个主机
    • 如何导入现有的Kubernetes集群
    • 如何在Rancher UI下添加一个容器
    • 启动Calalog应用
    • 如何使用高级Kubernetes选项

    9月27日北京海航万豪酒店,在Rancher Labs举办的容器技术大会Rancher Container Day 2017上,Rancher Labs的CEO及联合创始人梁胜博士亲自发布了Rancher容器管理平台的重大版本——Rancher 2.0的Tech Preview。

    1

    在Rancher 2.0中,Cattle用户依然可以享受和以前一样的易于使用的用户体验,还可以额外地利用Kubernetes编排引擎的优势,包括其丰富的基础设施插件、增强的RBAC功能和原生生态系统服务。而Kubernetes用户能在同一平台上管理任何Kubernetes集群,轻松地充分利用Kubernetes的强大能力及其迅速壮大的生态系统。通过基于Kubernetes、简单直观的用户体验,Rancher 2.0将加快Kubernetes在企业中的普及。

    在本指南中,你将会了解如何快速上手Rancher v2.0。本文将涉及以下内容:

    • 准备一台Linux主机
    • 启动Rancher服务器,进入Rancher UI
    • 在Rancher UI下添加一个主机
    • 导入现有的Kubernetes集群
    • 在Rancher UI下添加一个容器

    另外我们还将包含一部分进阶内容,比如:

    • 启动Calalog应用
    • 使用高级Kubernetes选项

    准备一台Linux主机

    在开始之前,你需要为Linux主机安装Docker的兼容版本:

    • Docker v1.12.6
    • Docker v1.13.1
    • Docker v17.03-2-ce
    • Docker v17.06-ce

    对Linux主机的要求

    1. 准备一台64位主机,系统Ubuntu16.04,至少4GB的内存,内核版本3.10+;
    2. 在主机上安装兼容的Docker版本,关于如何在服务器上安装Docker,请参考此教程

    启动Rancher Server

    只需一条命令和几分钟时间,你就可以安装并启动Rancher Server。安装完成后,打开Web浏览器就能访问Rancher UI。

    如何启动Rancher Server

    第一步:
    在你的主机上执行如下的Docker命令

    <pre style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; word-break: break-all; word-wrap: break-word; color: rgb(51, 72, 81); background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 209, 211); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">$ sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/server:preview</pre>

    这一步骤需要花费几分钟来完成

    第二步:
    在浏览器中输入http://<SERVER_IP>:80就可以访问Rancher UI,这里的<SERVER_IP>里要填你主机的IP地址。Rancher可以自动部署和管理Kubernetes,UI界面会展示一个Welcome的页面,其中包含两项有关添加主机的选项。

    注意:最开始,Rancher会为你创建一个默认的集群和环境。Rancher能够将资源分组到多个集群和环境中。每个集群都是一组物理(或虚拟)的计算资源。每个环境绑定一个集群,并在集群的主机上运行其容器,而你可以将一个集群共享给多个环境。环境是用来定义应用程序、服务和容器的命名空间。环境中的容器可以通过共享的可管理网络相互通信,你可以通过向不同的用户/组分配访问权限来管理环境中的资源。

    第三步:
    选择添加主机的一个选项,然后进入到如下的相关部分:

    添加主机 – 如果你想要在Rancher中管理主机,请点击此选项。你可以添加一个已有的、安装好了Docker的主机,亦可以添加其他云服务商提供的新主机(后文会有详解)。
    使用现有的Kubernetes – 如果你希望集群提供者可以在Rancher外部管理主机,请点击此选项。你可以导入已有的Kubernetes(后文会有详解)。

    添加主机

    在这里你可以添加来自Rancher v2.0支持的云服务商的主机,也可以添加自定义主机。如果在UI界面没有看到你的云服务商,不要着急,只需选择自定义主机选项即可。

    如果你想添加自定义的主机,需要注意这些要求:

    • 通常,Rancher会自动检测IP地址来注册主机
      • 如果主机位于NAT后或是正在运行rancher/server容器的同一机器上,你可能需要指定它的IP地址。想要指定IP地址,请点击Show advanced选项,然后输入注册IP地址。
    • 主机代理会启动与服务器的连接,因此你需要确保防火墙或者安全组允许它通过命令能够到达URL。
    • 环境中的所有主机必须允许彼此间的流量能够进行跨主机联网。
      • IPSec:500/udp和4500/udp
      • VXLAN:4789/udp

    添加来自云服务商的主机

    第一步:
    在添加主机页面,选择你的云服务商:

    • Amazon EC2
    • Microsoft Azure
    • DigitalOcean
    • Packet

    第二步:
    按照Rancher UI界面的说明添加主机。这一过程可能需要几分钟。当主机添加成功,你就可以在Hosts页面看到它的状态

    添加一个自定义主机

    第一步:
    在添加主机页面,点击“自定义”,输入docker命令,比如:

    <pre style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; word-break: break-all; word-wrap: break-word; color: rgb(51, 72, 81); background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 209, 211); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">sudo docker run --rm --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:v2.0-alpha2
    http://<SERVER_IP>:80/v3/scripts/D5433C26EC51325F9D98:1483142400000:KvILQKwz1N2MpOkOiIvGYKKGdE</pre>

    注意:命令中的IP地址必须对应你的<SERVER_IP>而且必须能够从主机内部访问。

    第二步:
    在你的主机上复制、粘贴并运行该命令,就可以把你的主机注册到Rancher上。这一过程需要几分钟完成。

    第三步:
    点击“关闭”。在Hosts页面就可以看到主机的状态。

    导入Kubernetes集群

    在Rancher v2.0中,你可以导入已有的在外部安装的Kubernetes v1.7以上版本。这种情况下,集群提供商可以在Rancher之外管理你的主机。我们支持像Google Container Engine、Azure Container Service、IBM Bluemix这样的托管服务,你也可以导入你自己的Kubernetes集群。

    如何导入Kubernetes集群

    第一步:
    复制、粘贴UI界面的kubectl命令,在你的集群中执行它。

    第二步:
    点击“关闭”,在Hosts页面,你就可以看到Kubernetes节点的状态。

    添加容器

    在你向环境中添加了至少一个主机或集群后,可能会需要几分钟来启动所有的Rancher系统服务。想要验证自己的环境,那么在“默认”菜单中选择“系统”。如果服务正常,将会显示状态为绿色。

    当确认所有的系统服务均正常启动后,就可以创建你的第一个容器了。

    如何添加容器

    第一步:
    在Rancher UI菜单,点击“容器”

    第二步:
    点击“添加容器”,进入添加容器页面

    第三步:
    输入“名称”,比如“****first-container”

    第四步:
    输入一个Docker Hub上托管的Docker Image

    第五步:
    点击“启动”。该步骤需要几分钟来完成。当容器开始启动,就可以在“容器”页面看到它的状态

    到目前为止你已经添加了主机,并且启动了第一个容器,接下来将介绍Rancher v2.0的新特性。

    启动Catalog应用

    Rancher提供了一个catalog应用模板来部署复杂的应用。

    如何启动catalog应用

    第一步:
    在Rancher UI菜单,点击Apps,进入Application页面

    第二步:
    点击Launch from Catalog,显示可用的catalog应用模板

    第三步:
    找到你想要启动的模板,点击View Details

    第四步:
    完成必要的填写

    注意:docker-compose.yml和rancher-compose.yml文件与生成应用有关。在启动堆栈前点击Preview即可查看它们。

    第五步:
    点击Launch,在Application页面,你会看到Rancher正在为你的新应用创建堆栈。这一过程需要几分钟时间。

    如果服务正常启动,新堆栈的状态将显示为绿。

    使用高级Kubernetes选项

    在Rancher UI界面,你只需一键点击即可进入本地的Kubernetes dashboard。

    你也可以从web浏览器上执行kubectl。Kubernetes CLI或者kubectl都可以帮助你部署和管理Kubernetes应用。有关更多信息以及下载kubectl,请访问Kubernetes documentation

    另外,你可以创建一个Kubernetes配置文件,以便在桌面上使用kubectl。Kubernetes配置文件(即kubeconfig)允许你配置一个或多个集群的访问。

    如何使用高级kubernets选项

    第一步:
    在Rancher UI菜单,点击Containers

    第二步:
    选择Advanced标签,将出现下列高级选项:

    • Launch Dashboard – 在新浏览器窗口中访问本地Kubernetes dashboard
    • Launch kubectl – 使用shell从浏览器运行kubectl命令,单击Close返回到Rancher UI界面
    • Download kubeconfig – 生成一个kubeconfig文件以便在桌面使用kubectl。将~/.kube/config文件中的代码复制粘贴到新文件中,然后运行kubectl。点击Close返回到Rancher UI界面。

    相关文章

      网友评论

        本文标题:互联网产品的3种发布策略

        本文链接:https://www.haomeiwen.com/subject/cxwleftx.html