写点什么

架构师训练营第一期 - 第十一周课后作业

发布于: 2020 年 12 月 09 日

导致系统不可用的原因有哪些?保障系统稳定高可

用的方案有哪些?请分别列举并简述。



导致系统不可用的原因主要有:硬件故障、软件bug、架构不合理、设计有问题、系统发布、并发压力、网络攻击、外部灾害等。在进行架构设计、代码设计的过程中需要秉持“故障一定会发生”的理念,在设计时针对故障进行相关设计来提升系统的可用性,保障系统的稳定高可用。

保障系统稳定高可用的方案主要有:

解耦:系统的耦合度越高系统内部的关系越复杂,任何一个功能/模块的问题都可能影响其它模块,最后产生级联反应导致整个系统不可用。在架构设计上要采用解耦的原则和方法:高内聚、低耦合的组件设计原则、面向对象基本设计原则、面向对象设计模式、领域驱动设计建模,帮助降低模块代码的耦合度,代码的低耦合有利于提高系统的可用性。

隔离:通过将解耦以后的业务模块、子系统在物理上进一步进行隔离,即使是某个系统内部出现问题,这个问题在物理上也不会扩散到其它的子系统里从而提高了系统可用性。先通过在系统架构上的隔离设计,采用业务子系统隔离、微服务与中台架构、生产者消费者隔离等等这些架构进行逻辑上的隔离,再将架构设计上隔离出来的子系统或服务部署到不同的虚拟机、容器中进行物理上的隔离,从而来提升系统的可用性。

异步:可以采用多线程编程、反应式编程、异步通信网络编程进行代码解耦,一个线程的问题不会影响到其它线程的同时不会因为网络阻塞引起线程阻塞导致资源耗尽;还可以采用事件驱动异步架构在架构上解耦,这本质上还是利用消息队列来实现消费者生产者的隔离。

备份和失效转移:采用集群设计将应用服务进行多份部署,部署到多台服务器上,通过负载均衡服务器将请求分发到各服务器,当监控有服务器宕机时,由负载均衡服务器进行失效转移将对该服务器的请求转发到其它好的服务器上;将数据库做主从复制进行读写分离,一台服务器故障另一台还能提供读或写的服务;将数据库做主主复制,当提供服务的主服务器故障时,通过zookeeper选主进行失效转移,由另一台服务器提供服务,应用程序通过zookeeper访问主服务器。这种分布式的处理不仅提高了系统的性能同时也提高了系统的可用性。

幂等:应用调用服务失败后,会将调用请求重新发送到其他服务器,但是这个失败可能是虚假的失败。比如服务已经处理成功,但是因为网络故障应用没有收到响应,这时应用重新提交请求就导致服务重复调用,如果这个服务是一个转账操作,就会产生严重后果。服务重复调用有时候是无法避免的,必须保证服务重复调用和调用一次产生的结果相同,即服务具有幂等性。

事务补偿:通过执行业务逻辑逆操作,使事务回滚到事务前状态。在分布式系统中通常使用事务补偿的机制实现事务的一致性,如果某个事务执行到某一步失败,则将这个事务这一步之前所做的操作使用日志记录进行逆操作回滚掉。

重试:远程服务可能会由于线程阻塞、垃圾回收或者网络抖动,而无法及时返还响应,调用者可以通过重试的方式修复单次调用的故障。重试需要特别关注的一点:上游调用者超时时间要大于下游调用者超时时间之和。

熔断:当某个服务出现故障,响应延迟或者失败率增加,继续调用这个服务会导致调用者请求阻塞,资源消耗增加,进而出现服务级联失效,这种情况下使用断路器阻断对故障服务的调用。断路器三种状态:关闭,打开,半开。

限流:在高并发场景下,如果系统的访问量超过了系统的承受能力,可以通过限流对系统进行保护。限流是指对进入系统的用户请求进行流量限制,如果访问量超过了系统的最大处理能力,就会丢弃一部分的用户请求,保证整个系统可用,保证大部分用户是可以访问系统的。这样虽然有一部分用户的请求被丢弃,产生了部分不可用,但还是比整个系统崩溃所有的用户都不可用要好。限流的几种算法:计数器算法(固定窗口,滑动窗口)、令牌桶算法、漏桶算法。

降级:有一些系统功能是非核心的,但是它也给系统产生了非常大的压力,在系统高并发的时候关闭这些非核心功能。比如说像淘宝双11 的时候,当天可能整天系统都处于一种极限的高并发访问压力之下,这时候就可以将确认收货、评价、历史订单查询这些非核心的功能关闭,将宝贵的系统资源留下来,给正在购物的人,让他们去完成交易。

异地多活:如果数据中心所在城市遭遇了地震,机房遭遇了火灾或者停电时,不管我们的设计和系统多么的高可用,系统依然是不可用的。为了解决这个问题,同时也为了提高系统的处理能力和改善用户体验,很多大型互联网应用都采用了异地多活的多机房架构策略,将数据中心分布在多个不同地点的机房里,这些机房都可以对外提供完整服务,用户可以连接任何一个机房进行访问,即使某一个机房不可使用,系统也还可以在另外的机房为用户提供服务,依然保持可用。异地多活的难点是数据一致。



系统的高可用并不是使用某一种方案就能一蹴而就的,不同的场景需要不同的方案,很多的时候需要同时使用几种方案。在进行系统高可用的设计实现时,应该根据系统发展阶段、业务特点及业务量进行分析评估,选择多种方案组合形成满足自己业务需求的高可用方案。



用户头像

还未添加个人签名 2019.01.15 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第一期 - 第十一周课后作业