微服务常用故障处理机制

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【2月更文挑战第11天】微服务系统可能出现故障的种类,主要有三种故障:集群故障、单 IDC 故障、单机故障。

微服务系统可能出现故障的种类,主要有三种故障。

  • 集群故障。微服务系统一般都是集群部署的,根据业务量大小而定,集群规模从几台到甚至上万台都有可能。一旦某些代码出现 bug,可能整个集群都会发生故障,不能提供对外提供服务。
  • 单 IDC 故障。现在大多数互联网公司为了保证业务的高可用性,往往业务部署在不止一个 IDC。然而现实中时常会发生某个 IDC 的光缆因为道路施工被挖断,导致整个 IDC 脱网。
  • 单机故障。顾名思义就是集群中的个别机器出现故障,这种情况往往对全局没有太大影响,但会导致调用到故障机器上的请求都失败,影响整个系统的成功率。


集群故障

一般而言,集群故障的产生原因不外乎有两种:一种是代码 bug 所导致,比如说某一段 Java 代码不断地分配大对象,但没有及时回收导致 JVM OOM 退出;另一种是突发的流量冲击,超出了系统的最大承载能力,比如“双 11”这种购物活动,电商系统会在零点一瞬间涌入大量流量,超出系统的最大承载能力,一下子就把整个系统给压垮了。


1)限流

限流就是限制流量,通常情况下,系统能够承载的流量根据集群规模的大小是固定的,可以称之为系统的最大容量。当真实流量超过了系统的最大容量后,就会导致系统响应变慢,服务调用出现大量超时,反映给用户的感觉就是卡顿、无响应。所以,应该根据系统的最大容量,给系统设置一个阈值,超过这个阈值的请求会被自动抛弃,这样的话可以最大限度地保证系统提供的服务正常。


除此之外,通常一个微服务系统会同时提供多个服务,每个服务在同一时刻的请求量也是不同的,很可能出现的一种情况就是,系统中某个服务的请求量突增,占用了系统中大部分资源,导致其他服务没有资源可用。因此,还要针对系统中每个服务的请求量也设置一个阈值,超过这个阈值的请求也要被自动抛弃,这样的话不至于因为一个服务影响了其他所有服务。


在实际项目中,可以用两个指标来衡量服务的请求量,一个是 QPS 即每秒请求量一个是工作线程数。不过 QPS 因为不同服务的响应快慢不同,所以系统能够承载的 QPS 相差很大,因此一般选择工作线程数来作为限流的指标,给系统设置一个总的最大工作线程数以及单个服务的最大工作线程数,这样的话无论是系统的总请求量过大导致整体工作线程数量达到最大工作线程数,还是某个服务的请求量超过单个服务的最大工作线程数,都会被限流,以起到保护整个系统的作用。


2)降级

降级就是通过停止系统中的某些功能,来保证系统整体的可用性。降级可以说是一种被动防御的措施。


具体来讲,就是在系统运行的内存中开辟一块区域,专门用于存储开关的状态,也就是开启还是关闭。并且需要监听某个端口,通过这个端口可以向系统下发命令,来改变内存中开关的状态。当开关开启时,业务的某一段逻辑就不再执行,而正常情况下,开关是关闭的状态。


开关一般用在两种地方,一种是新增的业务逻辑,因为新增的业务逻辑相对来说不成熟,往往具备一定的风险,所以需要加开关来控制新业务逻辑是否执行;另一种是依赖的服务或资源,因为依赖的服务或者资源不总是可靠的,所以最好是有开关能够控制是否对依赖服务或资源发起调用,来保证即使依赖出现问题,也能通过降级来避免影响。


在实际业务应用的时候,降级要按照对业务的影响程度进行分级,一般分为三级:一级降级是对业务影响最小的降级,在故障的情况下,首先执行一级降级,所以一级降级也可以设置成自动降级,不需要人为干预;二级降级是对业务有一定影响的降级,在故障的情况下,如果一级降级起不到多大作用的时候,可以人为采取措施,执行二级降级;三级降级是对业务有较大影响的降级,这种降级要么是对商业收入有重大影响,要么是对用户体验有重大影响,所以操作起来要非常谨慎,不在最后时刻一般不予采用。


单 IDC 故障

在现实情况下,整个 IDC 脱网的事情时有发生,多半是因为不可抗力比如机房着火、光缆被挖断等,如果业务全部部署在这个 IDC,那就完全不可访问了,所以国内大部分的互联网业务多采用多 IDC 部署。具体来说,有的采用同城双活,也就是在一个城市的两个 IDC 内部署;有的采用异地多活,一般是在两个城市的两个 IDC 内部署;当然也有支付宝这种金融级别的应用采用了“三地五中心”部署,这种部署成本显然高比两个 IDC 要高得多,但可用性的保障要更高。


采用多 IDC 部署的最大好处就是当有一个 IDC 发生故障时,可以把原来访问故障 IDC 的流量切换到正常的 IDC,来保证业务的正常访问。

流量切换的方式一般有两种,一种是基于 DNS 解析的流量切换,一种是基于 RPC 分组的流量切换。


1)基于 DNS 解析的流量切换

基于 DNS 解析流量的切换,一般是通过把请求访问域名解析的 VIP 从一个 IDC 切换到另外一个 IDC。比如访问“www.abc.com”,正常情况下北方用户会解析到联通机房的 VIP,南方用户会解析到电信机房的 VIP,如果联通机房发生故障的话,会把北方用户访问也解析到电信机房的 VIP,只不过此时网络延迟可能会变长。


2) 基于 RPC 分组的流量切换

对于一个服务来说,如果是部署在多个 IDC 的话,一般每个 IDC 就是一个分组。假如一个 IDC 出现故障,那么原先路由到这个分组的流量,就可以通过向配置中心下发命令,把原先路由到这个分组的流量全部切换到别的分组,这样的话就可以切换故障 IDC 的流量了。


单机故障

单机故障是发生概率最高的一种故障了,尤其对于业务量大的互联网应用来说,上万台机器的规模也是很常见的。这种情况下,发生单机故障的概率就很高了,这个时候只靠运维人肉处理显然不可行,所以就要求有某种手段来自动处理单机故障。


处理单机故障一个有效的办法就是自动重启。具体来讲,你可以设置一个阈值,比如以某个接口的平均耗时为准,当监控单机上某个接口的平均耗时超过一定阈值时,就认为这台机器有问题,这个时候就需要把有问题的机器从线上集群中摘除掉,然后在重启服务后,重新加入到集群中。


不过这里要注意的是,需要防止网络抖动造成的接口超时从而触发自动重启。一种方法是在收集单机接口耗时数据时,多采集几个点,比如每 10s 采集一个点,采集 5 个点,当 5 个点中有超过 3 个点的数据都超过设定的阈值范围,才认为是真正的单机问题,这时会触发自动重启策略。


除此之外,为了防止某些特殊情况下,短时间内被重启的单机过多,造成整个服务池可用节点数太少,最好是设置一个可重启的单机数量占整个集群的最大比例,一般这个比例不要超过 10%,因为正常情况下,不大可能有超过 10% 的单机都出现故障。


在遇到实际的故障时,往往多个手段是并用的,比如在出现单 IDC 故障,首先要快速切换流量到正常的 IDC,但此时可能正常 IDC 并不足以支撑两个 IDC 的流量,所以这个时候首先要降级部分功能,保证正常的 IDC 顺利支撑切换过来的流量。


而且要尽量让故障处理自动化,这样可以大大减少故障影响的时间。因为一旦需要引入人为干预,往往故障处理的时间都得是 10 分钟以上,这对大部分用户敏感型业务的影响是巨大的,如果能做到自动化故障处理的话,可以将故障处理的时间降低到 1 分钟以内甚至秒级别,这样的话对于用户的影响最小。

相关文章
|
4月前
|
存储 搜索推荐 数据库
MarkLogic在微服务架构中的应用:提供服务间通信和数据共享的机制
随着微服务架构的发展,服务间通信和数据共享成为关键挑战。本文介绍MarkLogic数据库在微服务架构中的应用,阐述其多模型支持、索引搜索、事务处理及高可用性等优势,以及如何利用MarkLogic实现数据共享、服务间通信、事件驱动架构和数据分析,提升系统的可伸缩性和可靠性。
58 5
|
6月前
|
存储 负载均衡 数据库
探索微服务架构中的服务发现机制
【7月更文挑战第24天】在微服务架构的复杂网络中,服务发现是确保通信流畅与系统弹性的关键组件。本文将深入探讨服务发现的工作原理、面临的挑战以及解决方案,同时比较不同服务发现工具的性能特点,旨在为开发者提供实现高效服务发现的实战指南。
|
6月前
|
敏捷开发 设计模式 负载均衡
深入理解微服务架构中的服务发现与注册机制
【7月更文挑战第24天】在微服务架构的海洋中,服务发现与注册机制如同灯塔指引着航行的船只。本文将探索这一机制的重要性、实现原理以及面临的挑战,带领读者领略微服务架构中的关键导航系统。
|
6月前
|
存储 负载均衡 开发者
深入理解微服务架构中的服务发现机制
【7月更文挑战第19天】在微服务架构的海洋中,服务发现是一艘至关重要的航船,它指引着各个微服务之间的通信与协作。本文将揭开服务发现的神秘面纱,探索其工作原理、实现方式及面临的挑战,为开发者提供清晰的导航,确保服务间的顺畅航行。
|
6月前
|
敏捷开发 设计模式 监控
探索微服务架构中的服务发现机制
【7月更文挑战第20天】在微服务架构的海洋中,服务发现是一艘必不可少的航船,它指引着各个服务如何相互寻觅和沟通。本文将深入探讨服务发现的核心原理、主流解决方案以及在实际应用中的考量因素,为构建高效、稳定的微服务系统提供导航。
49 2
|
6月前
|
消息中间件 API 数据库
在微服务架构中,每个服务通常都是一个独立运行、独立部署、独立扩展的组件,它们之间通过轻量级的通信机制(如HTTP/RESTful API、gRPC等)进行通信。
在微服务架构中,每个服务通常都是一个独立运行、独立部署、独立扩展的组件,它们之间通过轻量级的通信机制(如HTTP/RESTful API、gRPC等)进行通信。
|
6月前
|
存储 负载均衡 网络协议
微服务之服务发现机制
微服务的服务发现机制是一种在微服务架构中动态定位服务实例以进行通信的方法。
50 2
|
6月前
|
负载均衡 微服务
探索微服务架构中的服务发现机制
【7月更文挑战第7天】在微服务架构的海洋中,服务发现是指引方向的灯塔。本文将深入探讨服务发现的基本原理、关键组件和实现策略,以及它如何影响微服务间的通信效率和系统的整体稳定性。我们将从理论到实践,逐步揭示服务发现机制如何在现代后端系统中扮演至关重要的角色,确保服务的高可用性和灵活扩展。
|
6月前
|
存储 负载均衡 监控
探索微服务架构中的服务发现与注册机制
【7月更文挑战第2天】在微服务架构的海洋中,服务发现与注册机制扮演着灯塔的角色,确保服务间的通信不因波涛汹涌而迷失方向。本文将深入探讨这一机制如何为微服务之间的交互提供动态、高效的路径,以及它对于整个系统稳定性和扩展性的重要性。我们将从基本原理出发,逐步剖析服务发现的实现方式,并讨论在设计服务注册中心时需要考虑的关键因素。
|
6月前
|
负载均衡 Apache 开发者
微服务架构中的服务发现与注册机制
【7月更文挑战第4天】在微服务架构的复杂网络中,服务发现与注册是确保各独立服务高效、可靠通信的关键。本文将探讨服务发现与注册的重要性、实现方式及其在现代分布式系统中的应用实践,旨在为后端开发者提供深入理解和实践指南。

热门文章

最新文章