使用CSE实现滚动升级零中断

举报
liubao68 发表于 2018/08/10 18:37:57 2018/08/10
【摘要】 本文描述了使用CSE开发应用系统如何实施升级零中断以及如何评估效果。

 

升级零中断存在的问题

要实现升级零中断,通常需要解决如下问题:

1.       停止服务的时候,可能引起业务中断。在停止服务的过程中,可能服务正在处理请求,新的请求可能持续的发送到该服务。

2.       在微服务架构下,一般都会通过注册中心进行服务发现,客户端会缓存实例地址。停止服务的时候,使用者可能无法及时感知实例下线,并继续使用错误的实例进行访问,导致失败。

3.       新服务启动起来后,会存在灰度状态,出现多个版本并存,如果新服务新增加了接口,新升级的服务需要正确的将流量发送到包含新接口的服务。

4.       成本:实现升级零中断,可以先准备大量的备份机器,将新服务启动起来。然后对用户的请求进行引流,待老服务没有流量后,停止老服务。这需要运维人员准备额外的集群资源并开发强大的运维监控系统来完成。

 

使用CSE框架,可以以极低的成本,不借助运维工具,就能够轻松的实现升级零中断。

 

使用CSE进行滚动升级的实践和评估

在讨论零中断的时候,需要先设计一个测试评估模型。为了简单,采用下面测试场景来进行评估。调用者通过网关来访问应用实例1和应用实例2,现在要对应用实例进行升级。升级的过程中,调用者会启动N个线程,以Mtps的流量来请求。我们可以以整个升级过程出现的失败次数来评估系统对于零中断升级的支持好坏。为了节省资源,我们采用先停止1.0版本的实例1,然后部署2.0版本的实例1;再停止1.0版本的实例2,最后部署2.0版本的实例2. 另外,我们还需要构造服务端处理时延T,模拟请求正在处理的情况。

image.png

 

在这个过程中,使用CSE测试的数据如下:

调用者线程数N

调用者流量M

处理时延T

失败次数

10

20tps

0

10

80tps

0

10

600tps

0

10

80tps

100ms

0

 

实现原理

实现零中断的核心机制包括如下几个:

1.       优雅停机。服务停止的时候,需要等待请求完成,并拒绝新请求;

2.       重试:客户端对于网络连接错误,以及拒绝请求错误,需要选择新服务器进行重试。

3.       隔离:对于失败超过一定次数的服务实例,进行隔离。

 

在上面的测试数据中,重试策略配置为:

servicecomb:
  loadbalance:
    retryEnabled: true
    retryOnNext: 1
    retryOnSame: 0



隔离策略配置为:

servicecomb:
  loadbalance:
    myservice:
      isolation:
        enabled: true
        enableRequestThreshold: 5
        singleTestTime: 10000
        continuousFailureThreshold: 2

测试过程中,在停止1.0版本实例2的时候,需要确保2.0版本实例1已经正确处理请求,否则可能出现无实例可用,出现升级中断。

 

商业工具

上面描述了仅仅借助SDK就实现升级零中断。通过配合CSE的灰度发布、部署工具等,可以实现更加可靠的升级零中断和更好的体验。

 


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。