无缝切换在线升级的终极探索

简介: 在系统的高可靠性里有个衡量其可靠性的标准——X个9,这个X是代表数字3~5。X个9表示在系统1年时间的使用过程中,系统可以正常使用时间与总时间(1年)之比

d795e959e99ede59174ecb6f4204311.png

本文将介绍全年4个9(99.99%)的系统可用性方案

在系统的高可靠性里有个衡量其可靠性的标准——X个9,这个X是代表数字3~5。X个9表示在系统1年时间的使用过程中,系统可以正常使用时间与总时间(1年)之比

系统可用性的计算公式:A=MTBF/(MTBF+MTTR)

拿365天(1年)做计算吧,看看几个9要停机多久时间做能才能达到!

1年 = 365天 = 8760小时

99.9 = 8760 * 0.1% = 8760 * 0.001 = 8.76小时

99.99 = 8760 * 0.0001 = 0.876小时 = 0.876 * 60 = 52.6分钟

99.999 = 8760 * 0.00001 = 0.0876小时 = 0.0876 * 60 = 5.26分钟

本文设计技术点:

  • LVS
  • keepalived
  • nginx
  • 集群高可用
  • spring cloud Nacos(其他服务注册中心同理)
  • spring cloud Gateway(其他Api网关同理)
  • spring boot(非Java应用同理)

LVS && Keepalived(了解)

LVS 是什么?

LVS 是 Linux Virtual Server(Linux 虚拟服务器) 的简称,目前 LVS 已经是 Linux 内核标准的一部分,LVS 工作在网络 4 层之上仅作分发之用,所以抗负载能力比较强。LVS 有完整的双机热备方案,几乎支持对所有应用做负载均衡。LVS 在互联网应用中的位置是在 Nginx 之上

LVS 该如何应用?

LVS 本身只是一个叫 IP_VS 的内核模块,这个模块可以做负载均衡,但是只用这个模块来做应用负载是远远不够的,比如 LVS 本身宕机后如何处理?实际生产环境中,一般配合 Keepalived 来使用 LVS,keepalived 支持 VRRP 心跳协议,可以实现 LVS 主备冗余,以解决 LVS 本身单点故障。另外,Keepalived 支持健康检测,网络 4 层和 7 层健康检测,防止服务器宕机。

1005282095e17f1320e335a5d60b096.png

Keepalived工作原理

Keepalived作为一个高性能集群软件,它还能实现对集群中服务器运行状态的监控以及故障隔离,下面我们介绍一下Keepalived对服务器运行状态和故障隔离的工作原理。

Keepalived工作在TCP/IP 模型的 三层(网络层)、四层(传输层)、七层(应用层),根据TCP、IP 模型各层所能实现的功能,Keepalived运行机制如下:

  • 在网络层(3):我们知道运行中有4个重要的协议。互联网络IP协议、互联网络可控制报文协议ICMP、地址转换协议ARP、反向地址转换协议RARP,Keepalived在网络层采用最常见的工作方式是通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。
  • 在传输层(4):提供了两个主要的协议:传输控制协议TCP和用户数据协议UDP,传输控制协议TCP可以提供可靠的数据输出服务、IP地址和端口,代表TCP的一个连接端,要获得TCP服务,需要在发送机的一个端口和接收机的一个端口上建立连接,而Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。
  • 在应用层(7):可以运行FTP,TELNET,SMTP,DNS等各种不同类型的高层协议,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除

什么是VRRP?

VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由,这个虚拟路由器通过虚拟IP(一个或者多个)对外提供服务,而在虚拟路由器内部十多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由设备被成为:主路由器(Master角色),一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP请求,ICMP 数据转发等,而且其它的物理路由器不拥有对外的虚拟IP,也不提供对外网络功能,仅仅接收MASTER的VRRP状态心跳信息,这些路由器被统称为BACKUP的角色”,当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务,整个切换对用户来说是完全透明的。

Lvs+Keepalived+nginx 接入层高可用(重点)

流量接入层技术演进架构历史概览

单机架构

d8a41288910bae2066fff0699e49266.png

  • 浏览器通过DNS-server,域名解析到ip
  • 浏览器通过ip访问web-server

缺点:

  1. 非高可用,web-server挂了整个系统就挂了
  2. 扩展性差,当吞吐量达到web-server上限时,无法扩容
    注:单机不涉及负载均衡的问题

简易扩容方案&DNS轮询

假设tomcat的吞吐量是1w次每秒,当系统总吞吐量达到3w时,如何扩容是首先要解决的问题,DNS轮询是一个很容易想到的方案:

666a42046700e8a7940513d28cd81ed.png

  • 多部署几份web-server,1个tomcat抗1000,部署3个tomcat就能抗3000
  • 在DNS-server层面,域名每次解析到不同的ip

优点:

  1. 零成本:在DNS-server上多配几个ip即可,功能也不收费
  2. 部署简单:多部署几个web-server即可,原系统架构不需要做任何改造
  3. 负载均衡:变成了多机,但负载基本是均衡的

缺点:

  1. 非高可用:DNS-server只负责域名解析ip,这个ip对应的服务是否可用,DNS-server是不保证的,假设有一个web-server挂了,部分服务会受到影响
  2. 扩容非实时:DNS解析有一个生效周期
  3. 暴露了太多的外网ip

简易扩容方案&nginx

tomcat的性能较差,但nginx作为反向代理的性能就强多了,假设线上跑到1w,就比tomcat高了10倍,可以利用这个特性来做扩容:

5f07462e8128e611ab54fcfaa7016ee.png

  • 站点层与浏览器层之间加入了一个反向代理层,利用高性能的nginx来做反向代理
  • nginx将http请求分发给后端多个web-server

优点:

  1. DNS-server不需要动
  2. 负载均衡:通过nginx来保证
  3. 只暴露一个外网ip,nginx->tomcat之间使用内网访问
  4. 扩容实时:nginx内部可控,随时增加web-server随时实时扩容
  5. 能够保证站点层的可用性:任何一台tomcat挂了,nginx可以将流量迁移到其他tomcat

缺点:

  1. 时延增加+架构更复杂了:中间多加了一个反向代理层
  2. 反向代理层成了单点,非高可用:tomcat挂了不影响服务,nginx挂了怎么办?

高可用方案&keepalived

为了解决高可用的问题,keepalived出场了

be66662b51d2bd04e806672a452403a.png

  • 做两台nginx组成一个集群,分别部署上keepalived,设置成相同的虚IP,保证nginx的高可用
  • 当一台nginx挂了,keepalived能够探测到,并将流量自动迁移到另一台nginx上,整个过程对调用方透明
  • 41b722143b3afac8d13edfeb6854c65.png

优点:

  1. 解决了高可用的问题

缺点:

  1. 资源利用率只有50%
  2. nginx仍然是接入单点,如果接入吞吐量超过的nginx的性能上限怎么办,例如qps达到了50000咧?

纵向(scale up)扩容方案&lvs

nginx毕竟是软件,性能比tomcat好,但总有个上限,超出了上限,还是扛不住。lvs就不一样了,它实施在操作系统层面, 性能比nginx好很多,例如每秒可以抗10w,这样可以利用他们来扩容,常见的架构图如下:

082da214d850ce94bd5e71318dab806.png

  • 如果通过nginx可以扩展多个tomcat一样,可以通过lvs来扩展多个nginx
  • 通过keepalived+VIP的方案可以保证可用性
  • 99.9999%的公司到这一步基本就能解决接入层高可用、扩展性、负载均衡的问题。

缺点 不管是使用lvs还是f5,这些都是scale up的方案,根本上,lvs/f5还是会有性能上限,假设每秒能处理10w的请求,一天也只能处理80亿的请求(10w秒吞吐量*8w秒),那万一系统的日PV超过80亿怎么办呢?(好吧,没几个公司要考虑这个问题)

横向(scale out)扩容方案&DNS轮询

水平扩展,是解决性能问题的根本方案,通过加机器扩充性能的方案才具备最好的扩展性。 facebook,google,baidu的PV是不是超过80亿呢,它们的域名只对应一个ip么,终点又是起点,还是得通过DNS轮询来进行扩容:

24b270643bf89ab94dda022715b4a69.png

此时:

  • 通过DNS轮询来线性扩展入口lvs层的性能
  • 通过keepalived来保证高可用
  • 通过lvs来扩展多个nginx
  • 通过nginx来做负载均衡,业务七层路由

总结

  • 接入层架构要考虑的问题域为:高可用、扩展性、反向代理+扩展均衡
  • nginx、keepalived、lvs、f5可以很好的解决高可用、扩展性、反向代理+扩展均衡的问题
  • 水平扩展scale out是解决扩展性问题的根本方案,DNS轮询是不能完全被nginx/lvs/f5所替代的
  • 企业可用购买云平台的服务实现类似功能,节省人力时间成本
  • 非云上企业也可以自行部署,上述所介绍的内容算是运维工程师的必备技能,并不会特别麻烦。

服务注册中心实时刷新与高可用

服务集群化

这一部分跳过了,微服务集群化部署的相关的文章很多,本文篇幅有限,想了解的朋友请自行查找阅读。

优雅停机

微服务架构中的应用优雅停机主要是指应用实例有计划而平滑(即不产生需要处理的事故)的退出。应用服务器的停机主要分为两类:主动停机和被动停机,而其中主动停机和大部分的被动停机都是可以实现优雅停机。如果应用不做优雅停机,则会带来以下情况:

  • 数据丢失:内存的中数据尚未持久化至磁盘
  • 文件损坏:正在操作写的文件因没有更新完成,导致文件损坏
  • 请求丢失:排队中等待处理的请求丢失
  • 响应丢失:成功的交易还没来得及做出响应
  • 交易中断:正在处理至中间状态的交易被强制中断
  • 服务未下线:上游服务依然还会继续往下游服务发送消费请求

微服务的优雅升级的目标就是避免以上几种情况,从而避免人工干预的工作量和提升微服务架构的服务高可靠。

使用场景

优雅停机可以解决以下场景:

  • KILL PID
  • 应用意外自动退出(System.exit(n))
  • 使用脚本命令的方式停止应用

优雅停机解决不了以下场景:

  • 突然断电
  • 机器物理破坏
  • ILL-9 PID 或 taskkill /f /pid

Java的优雅停机 ShutdownHook

Java的优雅停机通常通过注册JDK的ShutdownHook(钩子)来实现,当系统接收到退出指令后,首先标记系统处于退出状态,不再接收新的消息,然后将积压的消息处理完,最后调用资源回收接口将资源销毁,最后各线程退出执行。简单的使用demo案例如下(简单版):

/**
 * 优雅停机处理方式
 * 
 * @author lry
 **/
public class Main{
    /**
     * 启动应用
     **/
    public void start(){
        // 第一步:启动应用服务……
        // 第二步:注册JDK钩子
        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("The hook running...");
                //第三步:调用停机处理
                stop();
            }
        }));
    }
    /**
     * 停止应用
     **/
    public void stop(){
        // 停止应用前停机处理(如:注销服务、标记不接受请求等)
    }
}
复制代码

注:通常优雅退出需要有超时控制机制,如果到达超时时间仍然没有完成退出前的资源回收等操作,则由停机脚本直接调用KILL -9 PID的方式进行强制退出,不然可能会等待很长时间。

微服务优雅停机

可以遵守以下建议规则来设计微服务的优雅停机机制

  1. 所有微服务应用都应该支持优雅停机
  2. 优先注销注册中心注册的服务实例
  3. 待停机的服务应用的接入点标记拒绝服务(ShutdownHook)
  4. 上游服务支持故障转移因优雅停机而拒绝的服务
  5. 根据具体业务也提供适当的停机接口

微服务应用的优雅停机根据其使用者角色的不同,而主要分为两种类型

  • 业务应用优雅停机
  • 网关应用优雅停机

业务应用优雅停机设计

e0a869f79b7470e5dedcdf2c8d3b11c.png

上图1-6步操作在大多数微服务框架中都已经集成了,无需开发人员自主开发,如果某些采用自研微服务框架的公司没有这方面功能,开发人员可以先行在自己负责的业务系统中编写ShutdownHook来完成相同操作。

网关应用优雅停机设计

c1c33234bd7d81c5e12b341923f8c8e.png

如果不支持Nginx动态发现网关,则停机升级切换的过程需要人工接入,稍微费力点,但同样对用用户来说是无法感知到的。

总结

结合接入层的负载均衡高可用与微服务架构的高可用涉及,可以做到任意时间升级而不影响用户体验,不造成生产事故。但还是没实现全自动的流程,因为Nginx不支持动态发现网关并修改配置生效。

Nginx动态上下线站点

社区常用的 upstream 动态更新方案有 4 个4

63313fb012a63dbe4e8ac4a2018950f.png

  • ngx_http_dyups_module提供了粗粒度的upstream管理方法,可以对整个upstream进行新增,删除。
  • lua-upstream-nginx-module ,则提供了细粒度的管理方式,可以对某一个服务IP进行管理,其中提供的set_peer_down方法,可以对upstream中的某个ip进行上下线。
  • ngx_dynamic_upstream这些插件有一个共同点,那就是在不需要重启nginx的基础上, 动态修改nginx的配置。

基于以上插件呢,可以略做修改,使其支持nacos/zookeeper/consol/erueka等注册中心的服务发现,定制需要的nginx reload upstream 动态更新模块即可。

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
3月前
|
IDE 小程序 JavaScript
6月开发者日回顾|IDE多功能更新,质量洞察、全息检测工具全新升级
6月开发者日回顾|IDE多功能更新,质量洞察、全息检测工具全新升级
24 0
|
8月前
|
Web App开发 前端开发 JavaScript
跨浏览器兼容性:确保您的网站在各个平台上无缝运行
在当今多样化的网络浏览器市场中,确保您的网站能够在不同浏览器上正常运行变得至关重要。跨浏览器兼容性是一项关键任务,涉及到确保您的网站在不同浏览器和设备上都提供一致的用户体验。本博客将深入探讨跨浏览器兼容性的重要性、挑战以及如何实施有效的兼容性策略。
66 0
|
2月前
|
并行计算 Linux 异构计算
分享一款刚开源上线3天的音乐人声分离工具!无需联网!页面化操作!
分享一款刚开源上线3天的音乐人声分离工具!无需联网!页面化操作!
|
9月前
|
安全 数据安全/隐私保护 Android开发
三款远程控制软件对比,5大挑选指标:安全、稳定、易用、兼容、功能
众所周知,随着科技的发展和时代的进步,远程控制软件在日常工作中的运用所处可见,社会对远程控制软件的需求也在日益增长,为用户提供了便捷的远程访问和控制计算机的能力,使其在现代化社会中扮演着重要的角色。因此,市面上也出现了很多相似功能的产品,但是他们各有不同的特点和功能。本文主要介绍的是ToDesk、向日葵、TeamViewer三款远程控制软件间的不同之处,我将从安全、稳定、易用、兼容、功能几个方面来进行对比,帮助大家选择适合自己需求的远程办公软件。
188 1
三款远程控制软件对比,5大挑选指标:安全、稳定、易用、兼容、功能
|
缓存 运维 Kubernetes
CNStack 网络插件:hybridnet 的设计与实现
CNStack 网络插件:hybridnet 的设计与实现
CNStack 网络插件:hybridnet 的设计与实现
ICBU手机自动化集群硬件部署方案
背景加入ICBU已经有一年多的时间了,我这个期间负责了ICBU移动端的新机房建设。新的机房选址选在了一个小的储藏室,空间不是很大,所以为了最大化的利用空间,手机的摆放耗了不少精力和时间,也实验了很多的方案,并通过不断地实践,总结出来了一点心得和经验,在这里记录一下,跟大家互相讨论交流。搭建用于自动控制的手机集群,通常需要 PC主机、USBHUB、N条数据线、手机、手机机架。 而如果没有经过专业的设
ICBU手机自动化集群硬件部署方案
|
存储 搜索推荐 iOS开发
终极文档编辑及文件同步解决方案
终极文档编辑及文件同步解决方案
154 0
|
NoSQL Java 测试技术
分布式工具的一次小升级
之前在做 秒杀架构实践 时有提到对 distributed-redis-tool 的一次小升级,但是没有细说。 其实主要原因是: 秒杀时我做压测:由于集成了这个限流组件,并发又比较大,所以导致连接、断开 Redis 非常频繁。 最终导致获取不了 Redis connection 的异常。
|
运维 Java Devops
如何帮助业务丝滑配置?阿里巴巴用了 11 年的“功能开关” 是什么?
AHAS 功能开关是一个轻量级的动态配置框架,通过功能开关可以动态管理代码中的配置项,根据需求为某个应用开启或关闭部分功能,或设置某个性能指标的阈值。功能开关通常用于设置黑白名单、运行时动态调整日志级别、降级业务功能等场景。
如何帮助业务丝滑配置?阿里巴巴用了 11 年的“功能开关” 是什么?
|
缓存 Serverless 对象存储
iOS系统开发提升体验优化方案
随着Flutter等跨端框架的出现,业务开发同学经常需要在Android/IOS上跨端进行业务开发,问题定位等。新的不熟悉的环境的搭建总会遇到各种各样的问题,导致搭建失败,特别是IOS开发环境,是最复杂的,不仅环境搭建繁琐,而且切分支后的打包速度很慢,所以我们设计实现了两个工具,用于优化闲鱼IOS开发体验。

热门文章

最新文章