其他分享
首页 > 其他分享> > sentinel 简介

sentinel 简介

作者:互联网

sentinel以流量为切入点,从流量控制,熔断降级,系统自适应保护,黑白名单控制,热点参数限流,集群限流,网关限流多个维度来保障服务的稳定性.sentinel主要具有以下功能

 

1.流量控制

1.1 配置介绍

sentinel通过用户配置的FlowRule进行流量控制,每个资源都可以配置一个或者多个FlowRule,如果配置了多个FlowRule则sentinel会依次遍历所有的FlowRule直到有FlowRule触发限流或者遍历完所有的规则使请求通过.

每一个FlowRule都有一下参数组成,用户可以组合这些元素来达到自己想要的限流效果

1.2 基于qps/线程数的流量控制

1.2.1 基于qps的流量控制

当QPS超过用户在FlowRule中设置的阈值的时候,sentinel就会根据用户在FlowRule中的配置采取流控措施,包括直接拒绝,warn up,匀速排队.

直接拒绝

这个是sentinel基于QPS的默认的流控措施,如果当前QPS超过了阈值,则对新到来的请求直接拒绝.

warn up:

即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。当预热完成之后就进行匀速排队的流控措施.

匀速排队:

匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。并且sentinel的匀速排队不支持QPS超过1000的场景.

  1.2.2 基于线程数的流量控制

线程数控制用于保护业务的线程池不会应为慢调用而耗尽.为了避免这种情况发生我们通常使用不同的线程池隔离不同的业务,这种方案虽然隔离性比较好,但是会创建很多线程,线程切换的开销比较大,对于低延迟的调用有较大影响.sentinel的线程数量的控制不负责创建和维护线程池,而是简单的统计当前请求上下文的线程数量,如果超过了阈值就会自动拒绝新到来的请求.

1.3 基于调用关系的流量控制

  1.3.1 调用方限流

ContextUtil.enter(resourceName, origin) 方法中的 origin 参数标明了调用方名称。这些信息会在 ClusterBuilderSlot 中被统计.

中的 limitApp 字段用于根据调用方进行流量控制。该字段的值有以下三种选项,分别对应不同的场景:

同一个资源名可以配置多条规则,规则的生效顺序为:{some_origin_name} > other > default

注意:调用来源的数目不要太多(一般不要超过几百个),否则内存占用会非常多(调用来源的统计节点最大数目=资源数目*来源数目)。

 

1.3.2 调用链路入口限流

NodeSelectorSlot 中记录了资源之间的调用链路,这些资源通过调用关系,相互之间构成一棵调用树。这棵树的根节点是一个名字为 machine-root 的虚拟节点,调用链的入口都是这个虚节点的子节点。

一棵典型的调用树如下图所示:

     	          machine-root
                    /       \
                   /         \
             Entrance1     Entrance2
                /             \
               /               \
      DefaultNode(nodeA)   DefaultNode(nodeA)

上图中来自入口 Entrance1 和 Entrance2 的请求都调用到了资源 NodeA,Sentinel 允许只根据某个入口的统计信息对资源限流。比如我们可以设置 strategy 为 RuleConstant.STRATEGY_CHAIN,同时设置 refResource 为 Entrance1 来表示只有从入口 Entrance1 的调用才会记录到 NodeA 的限流统计当中,而不关心经 Entrance2 到来的调用。

1.3.3 关联限流

当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写得速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。可使用关联限流来避免具有关联关系的资源之间过度的争抢,举例来说,read_db 和 write_db 这两个资源分别代表数据库读写,我们可以给 read_db 设置限流规则来达到写优先的目的:设置 strategy 为 RuleConstant.STRATEGY_RELATE 同时设置 refResource 为 write_db。这样当写库操作过于频繁时,读数据的请求会被限流。

 

2.熔断降级

  2.1 参数配置

    熔断降级的配置规则在DegradeRule中配置,可以配置一下参数

  2.2  熔断策略

 

3.系统自适应保护

Sentinel 系统自适应保护从整体维度对应用入口流量进行控制,结合应用的 Load、总体平均 RT、入口 QPS 和线程数等几个维度的监控指标,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

Sentinel 在系统自适应保护的做法是,用 load1 作为启动控制流量的值,而允许通过的流量由处理请求的能力,即请求的响应时间以及当前系统正在处理的请求速率来决定。

3.1 配置介绍

系统自适应保护的规则在SystemRule中配置,可以配置一下参数

 

 

 

4.来源访问控制

有时候我们需要根据调用方来限制资源是否通过,这时候可以使用 Sentinel 的黑白名单控制的功能。黑白名单根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。调用方信息通过 ContextUtil.enter(resourceName, origin) 方法中的 origin 参数传入。

4.1 参数配置

黑白名单规则(AuthorityRule)非常简单,主要有以下配置项

 

5.热点参数限流

 

很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:

 

 

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。要使用热点参数限流功能,需要引入sentinel-parameter-flow-control依赖.

5.1.参数配置

热点参数规则在ParamFlowRule中配置,类似于FlowRule

 

 

 

6.集群限流

集群流控还可以解决流量不均匀导致总体限流效果不佳的问题。假设集群中有 10 台机器,我们给每台机器设置单机限流阈值为 10 QPS,理想情况下整个集群的限流阈值就为 100 QPS。不过实际情况下流量到每台机器可能会不均匀,会导致总量没有到的情况下某些机器就开始限流。因此仅靠单机维度去限制的话会无法精确地限制总体流量。而集群流控可以精确地控制整个集群的调用总量,结合单机限流兜底,可以更好地发挥流量控制的效果

 

集群流控中共有两种身份:

 

 

  

Sentinel 引入了集群流控模块,主要包含以下几部分:

 

 

  6.1 规则配置

FlowRule 添加了两个字段用于集群限流相关配置:

 

 

  6.2 客户端配置

在clusterClientConfig中配置

  6.3  服务端配置

在ClusterServerConfig中配置

  6.4 启动方式

 

    Sentinel 集群限流服务端有两种启动方式:

 

 

image

 

 

image

 

sentinel提供了 API 用于在 embedded 模式下转换集群流控身份:http://<ip>:<port>/setClusterMode?mode=<xxx>

 

其中 mode 为 0 代表 client,1 代表 server,-1 代表关闭。注意应用端需要引入集群限流客户端或服务端的相应依赖。

 

在独立模式下,我们可以直接创建对应的 ClusterTokenServer 实例并在 main 函数中通过 start 方法启动 Token Server。

 

7.网关限流

 

Sentinel 1.6.0 引入了 Sentinel API Gateway Adapter Common 模块,此模块中包含网关限流的规则和自定义 API 的实体和管理逻辑:

 

 

7.1 参数配置

网关限流规则配置在网关限流规则 GatewayFlowRule中.

用户可以通过 GatewayRuleManager.loadRules(rules) 手动加载网关规则,或通过 GatewayRuleManager.register2Property(property) 注册动态规则源动态推送(推荐方式)。

标签:调用,请求,阈值,简介,熔断,限流,集群,sentinel
来源: https://www.cnblogs.com/monkeydai/p/16372964.html