哨兵sentinel

Posted 大前端工程师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哨兵sentinel相关的知识,希望对你有一定的参考价值。

与Hystrix功能对比

 

Sentinel

Hystrix

隔离策略 信号量隔离(并发线程数限流) 线程池隔离/信号量隔离
熔断降级策略 基于响应时间、异常比率、异常数 基于异常比率
实时统计实现 滑动窗口(LeapArray) 滑动窗口(基于 RxJava)
动态规则配置 支持多种数据源 支持多种数据源
扩展性 多个扩展点 插件的形式
基于注解的支持 支持 支持
限流 基于 QPS,支持基于调用关系的限流 有限的支持
流量整形 支持预热模式、匀速器模式、预热排队模式 不支持
系统自适应保护 支持 不支持
控制台 提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等 简单的监控查看

Hystrix关注点:以 隔离、限流、熔断 为主的容错机制,被限流和被熔断的调用将会快速返回,触发fallback机制。

Sentinel关注点:多样化的流量控制;熔断降级;系统负载保护;实时监控和控制台(开源基于内存,需要持久化开发)。

隔离设计对比

Hystrix 支持线程池隔离 和 信号量隔离 两种隔离策略。线程池隔离针对不同的group创建不同的线程池,隔离性比较好,但达到最大线程数并队列排满后触发限流,但缺点就是线程上下文切换代价较大。信号量隔离是在某commandKey资源调用的并发数,当达到最大并发数触发限流,但没有线程池的timeout策略。原来我们web服务使用线程池隔离,单台服务器启动线程600+,后参考网关配置,修改为信号量隔离。

Sentinel 通过并发线程池模式的流量控制来提供信号量隔离的功能,并结合基于响应时间的熔断降级策略,当资源的响应时间较高时触发降级。

 

Sentinel特性


 

流量控制

关注运行指标:QPS、并发数、系统负载等。

直接拒绝模式

超出的请求直接拒绝。

热点参数限流模式

能够实时统计热点参数,并针对热点参数的资源调用进行流量控制。比如机扫接口可以控制某用户访问QPS。

慢启动预热模式

当流量激增时,控制流量通过的速率,并缓慢增加,给系统预热时间。比如网贷列表会查询用户群组,第一次访问不会命中Redis缓存,导致大量请求从数据库查询数据。

哨兵sentinel

匀速器模式

严格控制了请求通过的时间间隔,同时堆积的请求将会排队,超时的请求直接被拒绝。

基于调用关系的限流模式

包括基于调用方限流、基于调用链入口限流、关联流量限流等。

系统自适应限流模式

从整体维度控制对应用入口流量进行控制,结合系统load、平均响应时间、入口QPS、线程数等几个维度指标监控,让系统的入口流量和系统的负载达到一个平衡。

限流方式

限流分为单机和分布式,单机限流是指当前进程中资源的QPS、并发线程数或者整个机器的负载,一旦超过规则配置就会触发限流。分布式限流需要启动集中管理的ticket服务器,该服务器针对制定的资源每秒只会生成一定量的ticket,在执行Resource代码之前需要获取ticket,所以分布式限流代价比单机高。

规则配置

在实际开发中,流控规则需要支持在控制台动态配置。Sentinel支持多种规则数据源配置,比如Redis,Zookeeper,mysql(不支持事件通知,定时轮询)等。

哨兵sentinel

实时监控和dashboard

哨兵sentinel

改造点:目前开源dashboard是基于内存的,需要改造。

 

概念

资源。Resource。实现类StringResourceWrapper、MethodResourceWrapper。

哨兵sentinel

卡槽。Slot。

哨兵sentinel

NodeSelectorSlot:主要负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级。

ClusterBuilderSlot:用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据。

LogSlot:记录Block 日志。

StatisticSlot:记录、统计不同纬度的 runtime 指标监控信息。是其他Slot限流、熔断规则的基础。

SystemSlot:系统保护,通过系统的状态,例如 load1 等,来控制总的入口流量。

AuthoritySlot:根据配置的黑白名单和调用来源信息,来做黑白名单控制。

FlowSlot:用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制。

DegradeSlot:熔断降级,通过统计信息以及预设的规则,来做熔断降级。

卡槽链。SlotChain。SlotChainBuilder(SPI接口),默认DefaultSlotChainBuilder,see Ctsp.lookProcessChain()

Context:维护着当前调用的元数据。每次调用 SphU.entry() 或 SphO.entry() 都需要在一个 context 中执行,如果没有当前执行时还没有 context,那么框架会使用默认的 context,默认的 context 是通过 MyContextUtil.myEnter() 创建的。我们可以通过调用 ContextUtil.enter() 方法来创建一个Context。

Entry:表示是否限流的一个凭证,像token。

Node:保存每个节点保存资源的实时统计信息,如passQps、blockedQps等。有了这些统计数据后,sentinel才能进行限流、降级等一系列的操作。StatisticNode通过持有Metric进行统计。

Metric:实时统计的度量接口。Node就是通过Metric进行数据统计的。Metric底层是通过滑动窗口来实现。

源码解析

哨兵sentinel


哨兵sentinel


滑动窗⼝ LeapArray

哨兵sentinel

 


另外大前端工程师推荐一门课程:


以上是关于哨兵sentinel的主要内容,如果未能解决你的问题,请参考以下文章

[redis 源码走读] sentinel 哨兵 - 节点发现流程

❤️假如面试官让你聊聊Sentinel(哨兵),看完这篇文章足矣!❤️

Redis集群-哨兵模式原理(Sentinel)

Redis集群-哨兵模式原理(Sentinel)

Redis集群-哨兵模式原理(Sentinel)

搞懂Redis (八) - 哨兵机制