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)加載須要。