Sentinel相关问题记录

Sentinel FAQ整理

Sentinel 承接阿里巴巴近10年双十一大促流量的核心场景,以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。其提供丰富的应用场景支持、完备的监控能力、易用的拓展点。

Note: 中文文档请见此处前端

热点问题

一、Q:dashboard不展现监控问题如何排查?

dashboard是一个单独启动的控制台,引入sentinel的应用是一个客户端。它们各自有本身的通讯端口,dashboard的端口可经过启动参数-Dserver.port=xxxx进行配置,引入Sentinel的应用默认端口是8719。二者都启动以后,Sentinel客户端在首次进入资源时会初始化并给dashboard发送心跳,以后dashboard控制台会经过客户端提供的端口对Sentinel客户端进行访问。基于此,如下事情是须要作的:git

一、客户端应该引入二者进行通讯的基础jar包

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>x.y.z</version>
</dependency>

二、客户端启动时加入JVM参数:

应用名称:github

-Dproject.name=xxxx

客户端访问dashboard的参数:web

-Dcsp.sentinel.dashboard.server=dashboard的IP:dashboard的启动端口

客户端提供给dashboard访问或者查看sentinel的运行访问的参数:算法

-Dcsp.sentinel.api.port=xxxx (默认是 8719)

注意:Sentinel会在客户端首次调用时候进行初始化,开始向控制台发送心跳包。确保客户端有访问量,才能在dashboard上看到监控数据。另外,仍是期待你们养成看日志的好习惯,详见日志json

  • 控制台推送规则的日志在 :${user.home}/logs/csp/sentinel-dashboard.log 中,
  • 客户端接收规则日志在 ${user.home}/logs/csp/record.log 中

3.经常使用排查问题列表:

  • 1.确认dashboard和客户端均正常工做
  • 2.客户端发送心跳包是否正常
  • 3.客户端是否正常上报给dashboard信息
  • 4.客户端的启动参数配置是否正确
  • 5.fastjson和sentinel保持一致目前为1.2.49
  • 6.curl IP:port/getRules?type=flow 等命令查看结果
  • 7.发传送到客户端的规则格式是否正确,例如确认一降低级规则的表单是否填写完整
  • 8.某些不能访问互联网的坏境好比堡垒机可能致使前端文件没法下载也可能致使图出不来,能够浏览器调试查看到

2.关于规则存储与datasource的问题?

1.Sentinel目前的规则是存在客户端应用内存中的,重启以后设置的规则消失

2.规则能够从dashboard侧调用客户端暴露的控制接口,也能够从不一样的扩展数据源读取

3.关于推送规则的数据流转:在控制台配置完以后 数据推送到客户机,更新到客户机内存

4.关于DataSource的持久化定制:

DataSource的持久化定制能够参考动态扩展文档api

5.关于持久化的一些建议,整体来讲就是Datasource用来接受规则,若是用来改变规则,则仅对本机生效。

  • 1.不建议客户端去修改zk,由于若干个客户端先后修改同一个zk的值,这样复杂度很高。若是客户端要改变规则,则仅对本机生效,好比例如fileDatasource
  • 2.zk能够用来获取推送过来的规则,即接受规则。
  • 3.对于有配置中心的集群来讲,就是配置中心->zk->Sentinel的DataSource,客户端监听到rule更新之后更新策略
  • 4.无配置中心的状况下,能够 dashboard->zk->Sentinel的DataSource,即将zk等配置中心的UI集成到dashboard中
  • 5.若是须要每台机器本身保存规则:应该是dashboard->Sentinel的DataSource->应用内内存->本机存储
  • 6.咱们鼓励你们根据本身的需求去自定义Dashboard
  • 7.后面咱们会把datasource分红readabledatasource和writabledatasourve: Readable datasource,通常是指zk,apollo,nacos这种,规则的推送次序应该是 zk管理/dashbaord -〉zk ->sentinel datasource ->sentinel,而不是从Sentinel datsource ->zk; 另一种是Writable datasource适合单机这种

一、Q:关于配置参数的指定问题?

A:有几种方式:浏览器

  • 可经过 JVM -D 参数指定。除project.name 以外,其他参数还可经过properties文件指定,路径为 ${home}/logs/csp/${project.name}.properties 详见启动项配置
  • 也能够放在加载比较早的静态代码块中,从配置文件中读取,这里包括project.name

二、Q:关于Sentinel的性能?

A:根剧咱们之前作过测试,单机25w qps如下基本没啥影响 超过了这个值会有一个比较明显的5%-10%d的降低服务器

三、Q:dashboard重启一下应用而后就不出监控了?

A:客户机10秒心跳,另外服务器端只保留1000605这么长时间。若是客户机有请求,稍等一会刷新一下,界面应该会出来app

四、Q:Sentinel监控数据能保留多久?

A:Sentinel对监控数据的作法是定时落盘在客户端,而后Sentinel提供接口去查询日志文件。因此Sentinel在监控数据上理论上是最少存储1天以上的数据;然而做为dashboard展现,聚合数据的,则只展现聚合几分钟之内的统计数据。 咱们鼓励你们改写dashboard来存储拉取的监控信息,包括实时的和历史的,若是你要长期保存数据,能够借鉴dashboard的拉取聚合方式落库。

五、Q:Sentinel的集群限流功能?

A:会在咱们的RodeMap里面,详见这里RodeMap

六、Q:Sentinel关于集群熔断?

A:通常用并行的线程数来杜绝这种状况,保证本身不被下游拖死

七、Q:0.1.0版本客户端获取更新规则的server端口设置是否是有点问题?不显示设置都是8719

A:0.1.0 版本多个客户端的话须要显式设置端口,不然上报会有问题。0.1.1版本修复了这个问题

八、Q:降级规则,除开自动返回还能够配置其余的规则么

A:须要本身catch block exception而后自定义降级以后的处理逻辑

九、Q:资源名能够是整个包吗?由于不少服务,规则配置和流量监控的区别是什么 ?

A:整个包不行,建议规则不须要一开始就定的,只要确认你埋好点就行,若是真的要整个包都埋点能够写个经过包名的拦截器规则

  • dubbo等是默认埋点的,能够任什么时候候须要的时候再制定规则
  • 咱们的建议是:不须要预先把全部的方法都配置好规则,一些重要的方法再配置规则,一个包里全部的方法都配上限流规则,这听起来不大"负责任"
  • 流量监控和规则不要紧,配不配规则监控上都看获得

十、Q:服务端的默认api 8719端口能够修改么?

A:能够经过csp.sentinel.api.port配置项进行指定

十一、Q:能够对url参数限流吗? 能够对ip作限流吗?

A:url参数限流在下个版本中会有,时间点能够看看roadmap。若是你的参数很少能够用自定义方法

十二、Q:集群机器数的限制?500个是?怎么横向扩容?

A:由于dashboard是一个示范做用,它的聚合监控的能力很是有限,因此咱们说只支持500台机器如下的应用。可是客户端是没有这个限制的 若是想用监控 还有规则推送,有两个建议:

1.规则推送上:用一个靠谱的推送机制 例如zk apollo nacos 这个的适配 咱们已经提供

2.监控上:彻底能够用多台机器来拉取数据,这个横向扩展不成问题,而后考虑下监控数据落盘

具体能够看动态规则扩展

1三、Q:同一台机器起相同的端口不报错?

A:默认8719被占用之后会自动选择下一个端口,直到有端口为止,选择端口时间会比较长,本地若是起多个应用建议本身设端口

1四、Q:Sentinel控制台有登陆功能或者说权限控制吗?不然生产机岂不是任意人都能修改规则了?

A:没有,dashboard不提供登录的工具,这种须要本身定制

1五、Q:请问dubbo适配以后,dashboard簇点链路的资源名如何自定义?

A:能够自定义埋点就好了,参考wiki: 不管是自动适配仍是手动埋点,控制台都能看到对应的资源名

1六、Q:使用Sentinel作全局流控、接口流控、接口+角色流控、接口+用户ID流控分别该如何实现?

接口+角色流控实例:VIP客户一分钟调用600次,一天调用10w次;普通客户60/1w次 A:1. 全局流控,其实能够在系统保护里面,经过配置总体入口qps,来达到这个目的 2. 接口流控,至关于定义一个资源,目前框架支持 3,4 实际上分两种:

  • 若是你的角色很少,10种一下,那么能够经过规则里面的调用源来实现
  • 若是角色/id不少,而且粒度很是细,能够把用户id做为参数,用这种维度来限流

1七、Q:1.为何使用了netty本身作了一些解析http请求的代码,使用目前开源的框架接收不行吗,这样设计的初衷是什么?

A:1.netty-transport和simple-transport这jar包,这两个包的功能目前是同样的,即目前simple-transport基本上能够实现开放的功能了。咱们还引入netty-transport这个包是为了往后的扩展。若是没有这个须要,引入simple-transport就能够了

1八、Q:监控页面的族点链路的核心是流控和降级,请问跟踪链路问题发现及跟踪,这块将来有考虑吗?

A: Sentinel主要用于:熔断降级,流量控制,不是很适合分布式的跟踪,即跨机器的跟踪,也不是sentinel的重点。咱们不会作这件事情。若是须要,能够参考引入dapper,pinpoint,dapper,maple 不少这样的理论。

1九、Q:怎么对特定调用端限流?

A:流控应用若是使用了Sentinel Dubbo Adapter,同时Dubbo的消费者也引入了Sentinel Dubbo Adapter(消费侧用于透传dubboApplication这个参数)则填调用者的appName就好,消费端引入adapter就会自动透传,不然须要本身传 appName

20、Q:dashboard中资源名称为何会有重复的?

A:最顶层的是Context名,用于区分不一样调用链路

2一、Q:关于maven仓库、依赖包没法下载的问题?

A:请检查maven的setting.xml配置,默认的、阿里云的库均可如下的下来,有些是公司的库,公司的库不必定有这些jar包

2二、Q:全部资源默认错误率达到多少自动降级,有特殊需求的资源另外设置,一个个设置管理成本较高

A: 通常来说,对于不一样资源,限流/降级的策略、阈值都是不一样的,对于这种全局的,咱们能够评估,目前还不支持

2三、Q:web端的资源目前都是根据uri限流,有没有根据前缀匹配限流?

A:详见:

  • 能够本身实现一个UrlCleaner,处理对应的URI(提取前缀之类的操做)。
  • 使用UrlCleaner 的话,对应的资源名都会归到clean后的资源
  • Sentinel不区分拦截点和展现点,只有资源的概念。
  • UrlCleaner 实现URL前缀匹配只是个trick,它会把对应的资源也给归一掉。直接在资源名粒度上实现模式匹配仍是有不少顾虑的问题的

2四、Q:目前信息抓取和uri指的是? 各个requestcommandhandle是能够扩展的,监控的web这边的信息抓取和uri目前不支持动态扩展?

A:这些目前都是绑定的API,后续能够考虑支持扩展

2五、Q:sentinel的core和阿里内部用的代码是什么关系?

A:sentinel的core和阿里内部用的是同一套,只有功能的摘取

2六、Q:心跳包是拦截到第一次调用才开始发送的? 初始化大概多长时间?

A:心跳包是启动客户端后就会发送的,不过初始化会须要必定的时间,不会很长时间的,若是一直没发心跳,record.log 里有相关日志,看看有什么异常。目前初始化逻辑其实就是起客户端的Server而后初始化任务发心跳,没初始化完成是否是不能发送心跳包,Spring 应用能够在bean里面init

2七、Q:csp.sentinel.flow.cold.factor这个参数是什么意思?

A:warmup的参数,warmup有阈值和时长,还有一个就是这个参数,一共3个参数,这个表明qps的令牌桶中令牌产生的速度,具体看一下WarmUpController这个类

2八、Q:规则里面limitApp(流控应用)做用是什么?

A:limitapp主要是针对调用方的流量控制,好比你提供了一个服务,分别会被A,B,C 几种不一样的服务调用。你想分别对A,B,C来作限流,便可

2九、Q:实时运行数据如何查看?

A:实时运行数据 能够经过查看里面提到的方法来实时查看

30、Q:请问limitApp的埋点状况?

A:以下:

  • 若是消费方引用了dubbo-adapter,这个其实对dubbo是自动有效的
  • 若是是http那么须要从request头里面拿到
  • 对于其它的框架 须要本身去埋点,主要是在ContextUtil.enter(),这里把调用者拿到,contextUtil.enter(resourceName, origin)这里的origin就是调用者
  • limitApp这个属性除了系统保护其它的均可以用

3一、Q:refreshfile每隔三秒扫描加载有点耗资源在加载前判断下文件是否修改比较合适?

A:能够!最好这个能够作成配置项,例如咱们常说的启动参数,能够放到properties里面

3二、Q:关于LeapArray中的sampleCount?

A:以下:

  • 咱们初始化用了两个格子,
  • 格子越多越平滑,可是损害越多;格子越少,其实不平滑可是精确。不一样场景用不一样的大小,例如秒杀这种,格子越少越好;可是若是是长期高流量,格子10比较好
  • 在datasource的扩展属性中能够动态调节

3三、Q:不少开发经过错误码来处理流程,而非经过异常,这种状况特别多见于历史遗留系统。这种写法,致使哨兵不容易拦截到错误,没法触发降级。对于这种状况,有没有什么好的处置方法呀?

A:实际上Sentinel是经过 Trace.trace(e)来统计异常的,能够这样实现:

  • 你在接入的时候只要收到错误码就调用这个函数来统计异常,那么error code就同样可以做为异常被统计到。熔断降级也生效了
  • 自定一个Default 的fallback handler来统一处理

3四、Q:限流的冷启动模式中计算 Token 的时候有一个coolDownTokens() 函数,能解释一下吗?

A:这个是冷启动的时候最低的速率比

3五、Q:请教一下,限流冷启动模式 WarmUpController 中的canPass()函数里有计算 previousQps,这个previousQps 是表示什么意思呢?

A:实际上是一个启动过程 每一秒容许经过的qps和上一秒经过的wps算出来的,其实这个算法脱胎guava但又和guava不同,可是思路是相似的

3六、Q:测试发现,同一个线程的flow rule有效,异步调用的跨线程控制无效,应该怎么操做呢?

A:目前咱们不支持异步,异步要下个版本

3七、Q:好比说,冷启动这个限流场景,超过的流量就被拒掉了(抛异常),consumer侧触发重试,根据rr策略,流量调度到另外一个机器,是这样的吗?

A:调度这个高级功能尚未,如今只能拒绝或者排队

3八、Q:不一样的slot执行的前后顺序是固定的吗?

A:详见:com.alibaba.csp.sentinel.slots.DefaultSlotsChainBuilder这个类

3九、Q:Sentinel跟hystrix相比优点是啥?二者都提供了流控降级以及dashboard

A:Sentinel 与 Hystrix 的对比

40、Q:InitExecutor.doInit();是否须要在初始化时手工调用

A:不须要,sentinel-core包的Env类经过static块调用了; demo工程中的InitExecutor.doInit();是为了避免让进程退出。

4一、Q:InitExecutor.doInit();已调用,但经过http访问规则失败

A:检查是否缺乏sentinel-transport-simple-http依赖,InitExecutor.doInit()中的ServiceLoader.load(InitFunc.class)加载须要。

相关文章
相关标签/搜索