什么是缓存雪崩?服务器雪崩的场景与解决方案

来源:Leah 时间:2022-07-31 09:47:43阅读:0

什么是应用服务雪崩?

雪崩问题

分布式系统存在这样的问题。由于网络的不稳定性,任何服务的可用性都不是100%。当网络不稳定时,作为服务提供商,可能会被拖死,导致服务调用器堵塞,最终导致雪崩连锁效应。

什么是缓存雪崩?服务器雪崩的场景与解决方案

缓存雪崩

当缓存服务器重启或大量缓存集中在一定时间段时,也会给后端系统(例如DB)数据库后端出现故障,导致应用服务器雪崩。

几种场景产生雪崩效应

  • 流量激增:如流量异常,用户重试导致系统负载升高;

  • 缓存刷新:假设A为client端,B为Server端,假设A所有系统请求都流向B系统,请求超过B会造成系统的承载能力B系统崩溃;

  • 程序有Bug:代码循环调用的逻辑问题、资源未释放引起的内存泄漏等;

  • 硬件故障:如停机、机房断电、光纤挖断等。

  • 数据库瓶颈严重,如长期事务sql超时等。

  • 线程同步等待:同步服务呼叫模式通常用于系统之间,核心服务和非核心服务共享一个线程池和消息队列。如果核心业务线程呼叫非核心线程,则非核心线程由第三方系统完成。当第三方系统本身出现问题时,核心线程被阻塞,并且一直在等待,过程之间的呼叫有加班限制,最终线程将被切断,也可能导致雪崩;

缓存雪崩解决方案

缓存失效的几种情况:

1、缓存服务器挂了

2.局部失效缓存在高峰期

3.热点缓存失效

解决方案:

1.避免不同的缓存集中故障key设置不同的超时时间

2.增加互斥锁,控制数据库请求,重建缓存。

3.增加缓存HA,如:redis集群。

雪崩的整体解决方案

一般来说,保护服务依赖主要有三种解决方案:

(1)熔断模式

该模式主要是指电路熔断器。如果线路电压过高,保险丝将熔断以防止火灾。在我们的系统中,如果目标服务呼叫缓慢或大量加班,此时,熔断服务呼叫,对于后续呼叫请求,不继续呼叫目标服务,直接返回,快速释放资源。如果目标服务有所改善,请恢复呼叫。

机器性能指标的重点监控

  • cpu(Load)cpu利用率/负载

  • memory内存

  • mysql监控长事务(这里和sql超时查询紧密结合,需要重点监控)

  • sql超时

  • 线程数等

总之,除了cpu、除了内存和线程数,重点监控数据库端的长期事务sql加班等,绝大多数应用服务器的雪崩场景来自数据库端的性能瓶颈,导致数据库端的大量瓶颈,最终拖累应用服务器,最后是大面积的雪崩。

(2)隔离模式

这种模式就像按类型将系统要求划分为小岛一样。当一个小岛被点燃时,它不会影响其他小岛。

例如,线程池可以用于隔离不同类型的要求,每种类型的要求不会相互影响。如果一种类型的要求线程资源耗尽,则直接返回后续类型的要求,不再呼叫后续资源。该模型有许多使用场景,如拆卸服务,使用单独的服务器部署重要服务,或公司最近推广的多中心。

(3)限流模式

上述熔断模式和隔离模式均属于错误后的容错处理机制,限流模式可称为预防模式。限流模式主要是对各类型的最高要求QPS阈值,如果高于设定的阈值,请求将直接返回,后续资源将不再被调用。这种模式不能解决服务依赖的问题,只能解决系统整体资源分配的问题,因为没有流量限制的请求仍然可能导致雪崩效应。

熔断设计

熔断设计主要参考hystrix做法。最重要的是三个模块:熔断要求判断算法、熔断恢复机制、熔断报警

(1)熔断要求判断机制算法:每个熔断器默认维护10个无锁循环队列计数bucket,每1秒一个bucket,每个blucket默认错误超过50%,10秒内中断拦截20个请求,记录请求的成功、失败、加班和拒绝。

(2)熔断恢复:每隔5次需要熔断s如果部分请求通过,如果请求是健康的(RT<250ms)要求健康恢复。<250ms)则对请求健康恢复。

(3)熔断报警:对于熔断请求,如果异常请求超过某些设置,则报警。

隔离设计

一般采用两种隔离方式

(1)线程池隔离模式:使用线程池存储当前请求,线程池处理请求,设置任务返回处理超时间,并将积累的请求积累到线程池队列中。这样,每个依赖的服务申请线程池都需要有一定的资源消耗。其优点是可以处理紧急流量(当流量峰值到来时,数据可以存储在线程池组中缓慢处理)

(2)信号量隔离模式:使用原子计数器(或信号量)记录当前有多少线程在运行。请先判断计数器的值。如果超过设定的最大线程数,则丢弃更改类型的新请求。如果不超过,则执行计数操作请求,以计数器 1和返回计数器-1。这种方法是严格控制线程,立即返回模式,无法应对突发流量(当流量峰值到来时,处理的线程超过数量,其他请求将直接返回,不继续要求依赖的服务)

超时机制设计

(1)超时有两种,一种是要求等待超时,另一种是要求操作超时。

(2)等待加班:在任务进入队列时设置任务进入队列时间,判断队长任务进入队列时间是否大于加班时间,超过任务时丢弃任务。

(3)运行超时:直接可使用线程池提供的get方法。

如何提前发现雪崩?

首先,让系统不要雪崩,然后通过监控发现要求接近或超过阀值,然后根据具体情况进行处理。接近或超过阀值的过程可称为提前发现雪崩。

以上是雪崩应用服务场景和技术方案总结。如有问题,请联系微云网络在线客服!

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:shawn.lee@vecloud.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

本站原创内容未经允许不得转载,或转载时需注明出处:https://news.kd010.com/fwqjs/12180.html

TAG标签:

相关推荐

返回顶部